2011-10-28 3 views
9

Я просеивания через несколько сетевых следов и заметил на своей машине, что при подключении через HTTP, пакеты выглядеть примерно так:полезной нагрузки данных в TCP Ack

client --> server: GET 
server --> client: tcp ack 
server --> client: HTTP response 
client --> server: tcp ack 

Однако, я посмотрел на некоторые CIFS (SMB), которые я сохранил за несколько лет назад. Я вижу такие вещи, как:

client --> server: Create Request 
server --> client: Create response (This packet also acks the request) 

На высоком уровне мне интересно, почему разница - что вызывает разные поведения? Что контролирует, будет ли ответ приложения помещен на запрос ack или другой пакет: приложение или ОС?

ответ

5

Это поведение зависит как от ОС, так и от приложения. В linux ядро ​​не отправляет ACK напрямую, а вместо этого ожидает фиксированное количество миллисекунд (около 200), надеясь, что у него есть некоторые данные для отправки назад и может позволить ACK копировать данные.

Если таймер выключен, ACK отправляется немедленно.

Пример 1.

Client sends the GET request. 

Server tries to create a http response, but before it does that 200ms are gone 
and it must send the ACK before the http response. 

Пример 2.

Client sends the GET request. 

Server creates a http response within the timer limit, and the ACK can piggyback 
the data. 

Значение, если ваше приложение все медленнее при генерации, что ответ, ACK будет отправлен без наложения на данных. А также в зависимости от ОС таймер задержки может быть выше/ниже и еще раз изменять отправку ACK.

+0

Вы можете указать таймер задержки в любых настройках инициализации TCP? – NHDaly

+1

Вы можете отключить его с помощью опции TCP_QUICKACK с помощью setsockopt в соответствии с IPPROTO_TCP (non portable btw). Но изменение значения может быть невозможным, поскольку я считаю, что он жестко запрограммирован, если нет нового sysctl для него (или что-то подобное). – Milan

+0

После того, как я установил параметр TCP-сокета для отключения TCP Quick ACK, я все равно не получил комбинированный пакет: opt = 0; setsockopt (sockfd, IPPROTO_TCP, TCP_QUICKACK, (char *) & opt, sizeof (opt)); –

Смежные вопросы