Home

Page 45
Page 45
background image

API,  при  этом  открытие  порта  можно  выполнить  различными  способами:  порт  может  принимать 
соединения не зависимо от того, на какой IP адрес сервера направлены сегменты с флагом SYN, или 
принимать  соединения  на  некотором  порту  только  в  том  случае,  если  они  предназначены  для IP 
адреса  только  определенного  интерфейса.  Соответственно  отображение  таких  портов  с  помощью 
утилиты netstat.exe будет  полностью  аналогичным  рассмотренному  ранее  примеру  с UDP. Так  же 
отметим, что TCP поддерживает и селективное обслуживание по адресу клиента в том же стиле, что 
и UDP, хотя  обычно  данная  возможность  не  реализуется  в  стеках  за  откровенной 
невостребованностью приложениями.  

Теперь  рассмотрим  принципы  использования  полей Sequence Number и Acknowledged 

Number  при  передаче  и  квитировании  данных.  Очень  важно  отметить,  что  после  того,  как 
соединение  установлено  оба  участника TCP соединения  АБСОЛЮТНО  равноправны,  т.е.  каждая 
сторона может передавать данные, и обязана квитировать данные, полученные от партнера. И если 
в рассмотренном выше процессе установки соединения стороны асимметричны, то после того, как 
соединения установлено всякая асимметрия отсутствует.  

Для  начала  рассмотрим  пример,  когда  данные  передает  только  одна  сторона TCP 

соединения. Рассмотрим пример: итак, пусть клиент желает установить соединение с сервером, как 
нам известно, клиент посылает серверу сегмент с флагом SYN и собственным ISN, сервер отвечает 
сегментом с флагом SYN, собственным ISN и подтверждает клиенту получение от него клиентского 
ISN,  после  чего  клиент  подтверждает  серверу  получение  клиентом ISN сервера.  В  этот  момент 
стороны готовы к передаче данных и договорились об используемых номерах. Изображаем на доске 
три первых сегмента рисунка. Очевидно, что и клиент и сервер могут передавать друг другу данные 
в  этом  соединении,  при  этом  клиент  будет  нумеровать  передаваемые  им  данные,  начиная  с 
собственного ISN+1, а  сервер – начиная  с  собственного ISN+1. Разумеется,  каждая  сторона 
соединения  должна  квитировать  партнеру  принятые  от  него  данные,  т.е.  отправлять  сегменты,  в 
которых  поле Acknowledged Number будет  принимать  значение,  равное  номеру  ожидаемого  от 
партнера  байта,  тем  самым  будет  производиться  указание  того,  что  все  байты  с  номерами, 
меньшими Acknowledged Number успешно приняты. Пусть для начала данные передает только одна 
сторона TCP соединения,  допустим,  клиент.  Изображаем  на  доске  четвертый  сегмент – пусть 
клиент хочет передать серверу Q байт. Как клиент должен сформировать свой сегмент? Разумеется, 
как использовать поля Source Port и Destination Port уже ясно. Клиент в таком случае заполняет поле 
Sequence Number значением X+1, так как именно байта с таким номером ждет от клиента сервер. 
Ясно,  что  поле Acknowledged Number клиент  заполняет  значением Y+1 – действительно,  клиент 
ждет  тот  сервера  именно  байта  с  номером Y+1 еще  с  момента  установки  соединения,  а  так  как 
клиент пока от сервера еще байт не получал, то он по прежнему ждет байта Y+1. Наконец, в поле 
данных TCP клиент передает Q байт данных, соответствующего поля «Длина» в заголовке TCP нет, 
но,  сколько  байт  получено  сервером,  легко  вычисляется  путем  вычитания  длины  заголовка IP 
дейтаграммы  и TCP сегмента  из  полной  длины IP дейтаграммы,  пусть  клиент  передал Q байт 
данных.  Клиент  устанавливает  в  данном  сегменте  флаг ACK, так  как  поле Acknowledged Number 
данного сегмента должно быть интерпретировано на удаленной стороне.   
 


Copyright © 2021 Файлообменник files.d-lan.dp.ua

Использование любых материалов сайта возможно только с разрешения автора.