Генеральный ?- Максимальное количество сегментированных / разделенных байтов, отправленных по соединению по протоколу TCP? - PullRequest
0 голосов
/ 12 октября 2011

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

Итак, если я установил размер буфера 3072 байта для отправки на сервер от клиента и такой же при отправке данных с сервера на клиент, как эти байты будут сегментированы? и каково будет максимальное количество байтов, которое отправляется по соединению, чтобы байты не сегментировались?

Ответы [ 4 ]

2 голосов
/ 12 октября 2011

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

Отправка (две отправки):

  1. "Hello"
  2. «Мир»

Может быть получен как:

  1. «HelloWorld»

или.

  1. "Он"
  2. "Ило"
  3. "Мир"

или любая другая комбинация.

Следовательно, вам нужно уметьопределить, когда заканчивается одно сообщение, а начинается следующее.Два наиболее распространенных способа - использовать заголовок сообщения, содержащий длину или суффикс (например, перевод строки), для определения конца сообщения.

Обновление

TCP не должен использоваться для потоковой передачи аудио imho.Причина в том, что TCP гарантирует доставку всех отправленных пакетов.Следовательно, если TCP обнаружит, что пакет не прибыл, он заблокирует все поставленные в очередь пакеты, пока не прибудет отказавший.

При потоковой передаче звука не важно, что все пакеты прибывают, один потерянный пакет не будет слишком сильно влиять на звук.Лучше получить небольшую потерю звука, чем полностью остановить аудиопоток, потому что сетевые протоколы пытаются доставить все пакеты.

1 голос
/ 12 октября 2011

Если вы записали 3000 байтов в сокет TCP, вы получите 3000 байтов на принимающем партнере.Не существует максимального количества байтов, наложенных TCP на протокол над ним.От TCP до IP, вниз по стеку, до протоколов, приведенных ниже, да, есть ограничения, но вашему приложению не нужно беспокоиться об этом.Сегментация и повторное объединение фреймов Ethernet в датаграммы ip и т. Д. ... позаботятся за вашей спиной.

Однако вам не нужно беспокоиться о протоколе на уровне приложения, который работает поверх TCP,Хотя TCP доставит все 3000 байтов, нет гарантии, что один вызов recv (или эквивалент языка java / php) вернет все 3000 байтов за раз.Возможно, вам придется вызывать его несколько раз, прежде чем все 3000 байтов будут считаны из сокета.

Подробнее см. Здесь:

Как узнать, когда вы закончите получать поток TCP?

1 голос
/ 12 октября 2011

Будет иметь место рукопожатие размером MTU между одним концом и другой рукой соединения и в соответствии с этим размером и протоколами, которые используются вместе с TCP. Существует количество данных, которые будут отправлены одним пакетом.

Однако разбиение / объединение ваших данных в пакеты выполняется вашим стеком протоколов, если вы не используете низкоуровневый API.

0 голосов
/ 12 октября 2011

Если вы не пишете оболочку протокола TCP, тот факт, что вы задаете этот вопрос, является довольно хорошим показателем того, что вы подходите к любой проблеме, которую пытаетесь решить неправильно. Реализации TCP на указанных вами языках действуют как абстракции, которые должны сделать ответ на этот вопрос совершенно неуместным.

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

...