Номера Ack и Seq в протоколе TCP
1. Основные понятия
seq: Указывает смещение данных, отправленных на этот раз, то есть с чего начать отправку данных.
len: указывает длину данных, передаваемых этим tcp.
ack: Во-первых, это означает, сколько байтов данных было получено другой стороной, а во-вторых, это говорит другой стороне, что следующий пакет seq
должен ack
продолжать ретрансляцию с определенного значения.
Во-вторых, захват пакетов Wireshark
61.135.185.32
Это запрашивается локально ip
, и захват пакета этого процесса выглядит следующим образом.
три рукопожатия
(Клиент) 1
Бао: Могу я установить с вами связь?
seq=0
, указывая на то, что это новое начало- Нет
ack
, поскольку соединение не установлено, невозможно сказать, сколько данных я получил от другой стороны Len=0
, что указывает на то, что я не передаю данные, это просто пакет, который хочет установить соединениеtcp
.
(Сервер) 2
пакет с номером: Получил, можно подключаться, поиграем.
seq=0
ack=1
Это подразумевает два пункта. Первый означает, что я получилseq=0
запрос на подключение от того, который вы только что сделали. Кроме того, скажите другой стороне, чтобы онаseq=1
передавала мне данные с самого начала.Len=0
, указывая на то, что данные не передаются.
(Клиент) 3
Нет. Бао: Хорошо, тогда давайте подключимся.
seq=1
, в ответ на вышеуказанный пакет я действительноseq=1
начал передаватьack=1
, а это значит, что я получил ваше согласие на подключение, пожалуйста, также передайте мне данныеseq=0
нижеseq=1
Len=0
Что ж, трехстороннее рукопожатие закончилось благополучно, и соединение было установлено.
Кратко опишите процесс трехстороннего рукопожатия:
- Стартовый пакет
seq
равен0
- в трехстороннем рукопожатии
ack=对方上一个的seq+1
seq
ack
Равно последнему числу противника
процесс передачи данных
(Клиент) 4
номер пакета: мне нужна информация о вашей домашней странице
Клиент отправляет http
запрос, http
запрос нужно tcp
проконтролировать, потом передать на ip
слой, а потом отправить сетевой картой...
Обратите внимание на содержимое пакета 4
кадраtcp
seq=1
, т.к. в прошлый раз данные не передавались,seq
номер остается неизменным, то есть3
номер пакетаseq=1,len=0
ack=1
, сообщите серверу, что если вы отправляете данные, вы должны начать сseq=1
самого началаlen=77
, указывающее количество байтов данных, которые я передал на этот раз
(Сервер) 5
Нет. Бао: Хорошо, я получил ваш запрос.
seq=1
, как того требует4
пакет номеровack
ack=78
,ack=4
номер пакетаseq+4号包的len = 1+77=78
означает клиент, если будете отправлять повторно, тоseq=78
отправляйте с началаlen=0
(Сервер)` 6
`Номерной пакет: Nuo, данные для вас
5、6
Цифры - это все пакеты, отправленные сервером, и за это время пакеты не получены, как и должно быть, 5、6
количество пакетов seq、ack
одинаковое.
seq=1
ack=78
len=1440
, длина данных
(Клиент) 7
номер пакета: получен
seq=78
, ты позволишь мне начать с78
волос, я начну с78
волосack=1441
, номер1441=6
пакета , значит я его получилseq+6
len=1+1440=1441
len=0
Подведем итог
Пакет отправителя, включая seq
и len
, как получатель информирует другую сторону о том, что данные получены?
Ответ лежит на получателе ack=发送方的seq+发送方的len
.
В целом так и есть.
Особым случаем является то, что во время трехэтапного рукопожатия, когда клиент и сервер обмениваются рукопожатиями, len=0
другая сторона не ack=seq+0
, а ack=seq+1
.