Фрагментация TCP - PullRequest
       5

Фрагментация TCP

2 голосов
/ 29 декабря 2010

Я знаю, что TCP обеспечивает потоковую передачу данных, но главный вопрос - какие ситуации могут возникнуть при отправке данных по TCP?
1. Сообщение может быть разделено на N фрагментов, чтобы соответствовать размеру MTU.
2. Два сообщения могут быть прочитаны в 1 вызове recv.

Может ли быть следующая ситуация?
MTU, например, 1500 байт.
Клиентские звонки отправляются с данными размером 1498 байт.
Клиентские звонки отправляются с данными размером 100 байт.
Сервер вызывает recv и получает 1500 байт данных.
Сервер вызывает recv и получает 98 байт данных.

Таким образом, возникает ситуация, когда 2 байта от второй клиентской посылки будут получены в первом сервере recv.

Мой протокол определен как следующие:
4 байта - длина данных
содержание данных.

Интересно, могу ли я придумать ситуацию, когда 4 байта (длина данных) будут разделены на 2 блока?

Ответы [ 2 ]

7 голосов
/ 29 декабря 2010

Да, поток байтов может быть разделен на любую байтовую границу.Вы, конечно, можете разделить свой 4-байтовый заголовок длины данных любым из 8 различных способов:

4
1-3
2-2
3-1
1-1-2
1-2-1
2-1-1
1-1-1-1

Некоторые из них чаще встречаются, чем другие, но вы должны их учитывать.Код, который может обработать это, может выглядеть примерно так:

unsigned char buf[4];
size_t len = 0;
while (len < sizeof(buf)) {
    ssize_t n = recv(s, buf+len, sizeof(buf)-len, 0);
    if (n < 0) {
        // error handling here
    }
    len += n;
}
length = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
1 голос
/ 29 декабря 2010

Я всегда пишу свои приложения таким образом, чтобы данные фрагментировались каким-то образом . Это не сложно сделать, когда вы придумаете хороший дизайн.

Какой лучший способ отслеживать сокет для новых данных и затем обрабатывать эти данные?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...