Назад | Перейти на главную страницу

Почему пакет запроса TCP содержит флаг ACK?

Я новичок на низком уровне TCP и я пытаюсьtcpdump с простым сервером сокетов и клиентской программой.

Сервер и клиент выполняют два шага.

  1. Сервер и клиент устанавливают соединение.
  2. Клиент отправляет строковое сообщение.

Ниже приведен результат tcpdump.

$ tcpdum -i lo

20:47:39.494935 IP localhost.38706 > localhost.5000: Flags [S], seq 2723581943, win 43690, options [mss 65495,sackOK,TS val 425070729 ecr 0,nop,wscale 7], length 0
20:47:39.494952 IP localhost.5000 > localhost.38706: Flags [S.], seq 2339154834, ack 2723581944, win 43690, options [mss 65495,sackOK,TS val 425070729 ecr 425070729,nop,wscale 7], length 0
20:47:39.494964 IP localhost.38706 > localhost.5000: Flags [.], ack 1, win 342, options [nop,nop,TS val 425070729 ecr 425070729], length 0 
20:47:49.471589 IP localhost.38706 > localhost.5000: Flags [P.], seq 1:5, ack 1, win 342, options [nop,nop,TS val 425073223 ecr 425070729], length 4
20:47:49.471625 IP localhost.5000 > localhost.38706: Flags [.], ack 5, win 342, options [nop,nop,TS val 425073223 ecr 425073223], length 0

Первые три пакета предназначены для рукопожатия, а следующие два пакета - для сообщения запроса клиента. Однако мне интересно, почему пакет клиентского запроса содержит ACK флаг ([P.]), Я думаю, что это первое сообщение для запроса, не имеющего пакета для ACK.

думаю ACK должно означать, что он успешно получил какой-то пакет. Для чего нужен ACK в [P.] ( . есть ACK в tcpdump)

Он снова подтверждает пакет SYN.

В TCP биты SYN и FIN считаются одним байтом при вычислении порядковых номеров. И они признаются примерно такими же. Вот почему вы видите ack 1 скорее, чем ack 0.

В вашем потоке третий пакет подтверждает SYN-пакет от сервера к клиенту. И четвертый пакет, отправляющий данные от клиента к серверу, снова подтверждает пакет SYN.

Отправка ACK вместе с пакетом, несущим полезную нагрузку, не требует дополнительных байтов на проводе. Бит ACK всегда находится в заголовке, и его нужно просто перевернуть с 0 на 1. Подтверждаемый порядковый номер также всегда присутствует, но его значение имеет значение, только если бит ACK равен 1.

После быстрой проверки трафика в моей сети выяснилось, что бит ACK установлен для всех TCP-пакетов, кроме пакетов SYN и RST.