Рассмотрим tcp/ip и ethernet протоколы на примере. Для этого я установил соединение c tcp сервером на ПК, через модем GPRS на модеме SIM900(о том как работать с SIM900 смотрите эту статью).
Для отслеживания сетевых пакетов на ПК используется программа анализатор трафика(сниффер) wireshark. Данная программа позволяет не только отслеживать сетевые данные, но и получать полную информацию о пакетах различных протоколов их вложенность и содержание.
TCP протокол
При запросе с модема на подключение, tcp сервер и клиент договариваются между собой о параметрах процедуры обмена данными:
- максимальный размер сегмента, который каждая сторона готова принять
-
максимальный объем данных, которые каждая сторона разрешает другой стороне передавать в свою сторону
-
начальный порядковый номер байта, с которого она начинает отсчет потока данных в рамках данного соединения
Для этого передаются 3 пакета:
После этого, при передаче данных с модема на ПК, проходят еще два пакета — с данными и подтверждение успешного приема.
Рассмотрим содержание пакета более подробно:
Так для самого первого пакета:
- Порт отправителя 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 пакета: