Различает ли TCP guish между отправкой нескольких маленьких сообщений и одного большего? - PullRequest
0 голосов
/ 09 января 2020

Использование псевдо C# просто потому, что это то, что я использую, и при условии, что C# просто оборачивает протокол TCP:

A

Socket s = ...; //a valid open socket that is receiving
string str = "abcdefghijklmnopqrstuvwxyz";
for(int i=0; i<10;++i)
{
 byte[] buf = ASCII.GetBytes(str);
 s.Send(buf)
}

B

Socket s = ...; //a valid open socket that is receiving
string str = "abcdefghijklmnopqrstuvwxyz";
string str2 = "";
for(int i=0; i<10;++i)
{
 str2 += str;
}
byte[] buf = ASCII.GetBytes(str2);
s.Send(buf)

Как они на самом деле различаются на уровне TCP, и, в частности, получатель может каким-либо образом узнать, что первое - это 10 отдельных сообщений, а второе - одно сообщение? Обрабатывает ли TCP каждый отправляющий вызов как некоторый пакет или конечный идентификатор, или он просто помещает байты в поток, и я должен определить способ определения того, что было отправлено, основываясь на самом контенте?

1 Ответ

1 голос
/ 11 января 2020

это просто проталкивание байтов в поток, и я должен определить способ определения того, что было отправлено, основываясь на самом контенте?

Да, он просто проталкивает байты в поток, что затем доставляются на провод. Они могут go по сети в любом количестве пакетов. Вы могли бы иметь пакет TCP с 1 байтом передаваемой полезной нагрузки или пакет TCP с почти 9k байтов полезной нагрузки (в случае Jumbo Frames). Если провод является «виртуальным», например, виртуальным коммутатором между двумя гостями на одном хосте, то «пакет» может иметь размер 60 КБ или больше в зависимости от реализации.

Вы как разработчик должны определить «Кадрирование данных» может быть простым символом новой строки (в случае http) или сложной структурой с разными битами и байтами, обозначающими разные границы сообщения.

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