Принудительное использование потока TCP для отправки содержимого буфера - PullRequest
4 голосов
/ 02 июля 2011

Я использую TCP-сокеты Csharp для отправки данных между клиентом и сервером.Теперь проблема, как я ее вижу или как я понимаю, состоит в том, что tcp является потоковым протоколом и не будет отправлять (отправлять) данные, пока их не будет достаточно.

Например, сказать, что я хотел отправить некоторыеЧто бы это ни было, данные не имеют значения, давайте просто скажем, что их длина составляет 8 байтов.Поведение, которое я наблюдаю, не имеет значения, как долго я жду, оно не отправит эти данные, если я не продвинусь больше за ними, предположительно, пока не достигну буфера tcp.

Так что мой вопрос.Если я хочу отправить небольшое количество данных через tcp, мне нужно добавить мусор в конец, чтобы заставить сокет отправлять.(Я бы не чувствовал себя хорошо по этому поводу), или это альтернативный способ, которым я могу заставить передний сегмент потока отправлять.

заранее спасибо.я все еще учу tcp, так что извините за невежество.

Ответы [ 2 ]

5 голосов
/ 03 июля 2011

Не устанавливайте NoDelay, если вы не являетесь экспертом в области TCP / IP и не понимаете его всех последствий.Если вы не читали Стивенса, даже не думайте об этом.

Вот пример вопроса: если вы устанавливаете соединение через сокет и отправляете по нему 8 байтов, отправляются ли 8 байтов немедленно или Nagle?алгоритм ждать больше данных для отправки?Ответ таков: «8 байтов отправляются немедленно», но не думайте возиться с Нэглом, пока не поймете точно почему это ответ.

Вот еще один вопрос: в стандартной команде/ ответный протокол, сколько задержки Nagle применяется к каждому пакету?Ответ: нет.Опять же, вы должны исследовать , почему Нэгл вызывает нет задержек в этом распространенном сценарии.

Если вы не видите данные, отправленные на 250 миллисекунд (максимальная задержка, вызваннаяНэглом в худшем из возможных сценариев), значит, что-то не так.

2 голосов
/ 02 июля 2011

Вы можете установить свойство NoDelay (я думаю, это то, что отключает Nagle ).

...