Я новичок на низком уровне TCP
и я пытаюсьtcpdump
с простым сервером сокетов и клиентской программой.
Сервер и клиент выполняют два шага.
Ниже приведен результат 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.