Полезная нагрузка данных в TCP-подтверждении - PullRequest
11 голосов
/ 29 октября 2011

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

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)

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

1 Ответ

6 голосов
/ 29 октября 2011

Это поведение зависит как от операционной системы, так и от приложения. В 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.

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