Почему ACK = 1, а не 2 в первом запросе TCP после установления соединения? - PullRequest
4 голосов
/ 05 апреля 2011

Я запутался по поводу номеров ACK и SEQ в пакетах TCP сразу после трехстороннего рукопожатия. Я думал, что номер ACK - следующий ожидаемый номер SEQ. Поэтому, когда я анализирую TCP-соединение в Wireshark, он говорит

TCP SYN with SEQ=0  
TCP SYN ACK with SEQ 0, ACK=1 (clear, server expects SEQ 1 in next packet)  
TCP ACK with SEQ 1, ACK=1 (clear, sender expects SEQ 1 in next packet)  

HTTP Request: TCP PSH ACK with SEQ 1, ACK=1

Последняя строка неясна. Я бы сказал, что следующий отправитель ожидает SEQ = 2, поэтому он должен быть ACK = 2? На сервере уже был пакет с SEQ = 1, почему отправителю нужен другой?

Может кто-нибудь объяснить мне это?

Ответы [ 2 ]

6 голосов
/ 05 апреля 2011

Что ж, при рукопожатии клиент получает только один пакет от сервера: SEQ = 0 и ACK = 1. С этой информацией сервер сообщает клиенту: «Я жду пакета с SEQ = 1 сейчас». Вы правильно поняли.

Теперь в последней части рукопожатия клиент отправляет SEQ = 1 и ACK = 1, что в основном означает то же самое, что и с сервера: «Я жду вашего пакета с SEQ = 1 сейчас»

Но: после TCP-рукопожатия клиент, как правило, не будет ждать, пока этот пакет будет подтвержден, а скорее отправит уже первые пакеты данных (фактически, данные могут уже содержаться в последнем пакете рукопожатия - я предполагаю, это случай в вашем примере, потому что запрос HTTP имеет тот же SEQ, что и последний пакет рукопожатия). Таким образом, любой следующий пакет снова имеет ACK = 1. Но почему? Он снова говорит: «Я жду от вас пакета с SEQ = 1». И это полностью имеет смысл: последний пакет, полученный клиентом от сервера, имел SEQ = 0 (при рукопожатии). Также имейте в виду, что и клиент, и сервер имеют независимые SEQ. Это означает, что клиент может отправить 100 пакетов. Пока сервер не отправил один, клиент все еще будет ожидать ACK = 1, потому что последний пакет, который он получил от сервера, SEQ = 0

Другое Править: Чтобы действительно понять, что происходит, вы можете выбрать пример с разными начальными SEQ (я уже писал, SEQ сервера и клиента независимы):

Client -> SYN, SEQ=100
Client <- SYN, ACK, SEQ=700, ACK=101 <- Server
Client -> ACK = 701, SEQ=101 [50 Bytes of data]
Client -> ACK = 701 [Again, didn't receive sth from server yet], SEQ = 151
1 голос
/ 05 апреля 2011

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

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

TCP в Википедии

...