:::: MENU ::::

TCP/IP Ethernet(v2) на примере. Часть 1 — TCP

Рассмотрим tcp/ip и ethernet протоколы на примере. Для этого я установил соединение c tcp сервером на ПК, через модем GPRS на модеме SIM900(о том как работать с SIM900 смотрите эту статью).

Для отслеживания сетевых пакетов на ПК используется программа анализатор трафика(сниффер) wireshark. Данная программа позволяет не только отслеживать сетевые данные, но и получать полную информацию о пакетах различных протоколов их вложенность и содержание.

ЧАСТЬ 1 —  TCP.

ЧАСТЬ 2 — Ethernet.

ЧАСТЬ 3 — IP.

TCP протокол

При запросе с модема на подключение, tcp сервер и клиент договариваются между собой о параметрах процедуры обмена данными:

  • максимальный размер сегмента, который каждая сторона готова принять

  • максимальный объем данных, которые каждая сторона разрешает другой стороне передавать в свою сторону

  • начальный порядковый номер байта, с которого она начинает отсчет потока данных в рамках данного соединения

TCP установка соединения

Для этого передаются 3 пакета:

tcp старт 3 пакета 1tcp старт 3 пакета 2tcp старт 3 пакета 3

После этого, при передаче данных с модема на ПК, проходят еще два пакета — с данными и подтверждение успешного приема.

tcp старт 3 пакета 4 tcp старт 3 пакета 5

Рассмотрим содержание пакета более подробно:

Заголовок TCP

Так для самого первого пакета:

  • Порт отправителя 0x0b 0x6d == 2925. Это tcp порт.

  • Порт получателя 0x5a 0x20 == 23072. Это tcp порт.

  • Порядковый номер 0x00 0x73 0xb2 0x80. Косвенный номер tcp пакета внутри потока данных, существующего в рамках текущего подключения. Сервер и клиент генерирую свой начальный номер, основное требование к которому — не повторяться пока пакет находится в сети. (Для следующего пакета от клинента(модема) к серверу(ПК), будет иметь номер на 1 больше 0x00 0x73 0xb2 0x81 — см. рис. выше — 3 пакет).

  • Номер подтверждения 0x00 0x00 0x00 0x00. Замечание: относится к следующему получаемому пакету, а не к предыдущему. Указывает какой пакет подтверждает данный пакет. Этот номер должен совпадать с порядковым номером пакета, который подтверждается(см. предыдущий пункт). Поскольку первый пакет ничего не подтверждает в нем содержатся нули. Так во втором пакете (пакете с сервера), в данном поле будет содержаться порядковый номер следующего пакета т.е. 0x00 0x73 0xb2 0x81 (см. рис. выше — 3 пакет).

  • Длина TCP заголовка (4 первых бита от 0x60) 0b0110 == 6. Длина заголовка в 32-битных словах. Поскольку в 32-битных словах(4 байта), то для определения длины в байтах надо умножить на 4. 6*4 = 24 байта.

  • Флаг URG == 0. Содержит ли пакет важные данные. 0 == нет (подробнее см. в литературе).

  • Флаг ACK == 0. Подтверждение это или нет. 0 == нет.

  • Флаг PSH == 0. Использовать буфер или сразу передавать данные прикладной программе (получатель может заниматься буферизацией для достижения большей эффективности). 0 == можно буферизовать.

  • Флаг RST == 0. В ответе на неверный пакет, данный флаг устанавливается в 1.

  • Флаг SYN == 1. Для установки соединения. У запроса соединения SYN == 1, а ACK ==0. В ответе на этот запрос SYN == 1, ACK == 1 (см. рис. выше — 2 пакет).

  • Флаг FIN == 0. При FIN == 1, запрос на разрыв соединения.

  • Размер окна 0x7d 0x78 == 32120. Сколько байт может быть послано после, пакета получившего подтверждение (см. подробнее литературу «Олифер Компьютерные сети» — про скользящее окно).

  • Контрольная сумма 0xea 0x87 (см. литературу)

  • Указатель на срочные данные 0x00 0x00. Используется если флаг URG == 1. Поскольку URG == 0, поле нулевое (см. литературу).

  • Параметры (необязательное поле) 0x02 0x04 0x05 0x8c. Содержит максимальный размер сегмента при данном tcp соединении. (KIND: MSS size(2), Length: 4, MSS value: 1420).

  • Данные (необязательное поле). Данные присутствуют только в 4 пакете (см. рис. выше — 4 пакет), где мы передаем с модема на ПК 4 байта 0x76 0x65 0x73 0x74 == «test«

 

При разрыве соединения передаются еще 4 пакета:

разрыв соединения рис 1 разрыв соединения рис 2 разрыв соединения рис 3 разрыв соединения рис 4

 


  • aaltaev

    > Длина TCP заголовка (4 первых байта от 0x60) 0b0110 == 6. Длина заголовка в 32-битных словах. Поскольку в
    > 32-битных словах(4 байта), то для определения длины в байтах надо умножить на 4. 6*4 = 24 байта.

    > (4 первых байта от 0x60) 0b0110 == 6

    Возможно 4 первых бита?

    • badembed

      Бита конечно. Спасибо, поправил.