В заголовке сегмента TCP содержатся два поля, при помощи которых реализуется гарантированная доставка сегментов, это поля «номер сегмента в последовательности» (sequence number) и «номер следующего запрашиваемого сегмента» (acknowledgement number). Рассмотрим как и по какому принципу протокол TCP заполняет эти поля.

На транспортный уровень к TCP от приложения поступает поток байтов. TCP последовательно разбивает поступающие данные на сегменты с длиной поля данных, равной MSS (предполагается, что соединение уже установлено и выполняется обычная процедура посылки данных). Каждый сегмент дополняется заголовком, в результате чего формируется исходящий сегмент TCP. Каждому сегменту присваивается последовательный номер, заносящийся в поле «номер сегмента в последовательности». Таким образом, по сравнению с входящим на транспортный уровень потоком байтов, на выходе этого уровня мы имеем упорядоченную последовательность сегментов. Далее сегменты TCP обрабатываются в соответствии с общими правилами, т.е. поступают на сетевой уровень, где реализован протокол доставки информации IP.

Рассмотрим пример. Пусть источник А желает передать файл размером 500000 байт приемнику В. Протокол TCP нумерует байты, поступающие от приложения, разбивает последовательно на сегменты, добавляет заголовок и отправляет на нижележащий сетевой уровень. Первый байт, поступивший от приложения, получает номер 0. Далее пусть размер MSS будет равен 1000 байт, тогда источник А должен послать приемнику В 500 сегментов каждый размером MSS.

Замечания по нумерации сегментов TCP

В протоколе TCP номер сегмента помещается в 32-битное поле заголовка. Очевидно, что в связи с тем, что размер поля номера сегмента имеет фиксированный размер, при передаче данных протокол транспортного уровня достаточно быстро столкнется с ситуацией, когда номер сегмента превысит максимально возможное значение, которое можно поместить в это поле. Поэтому нумерация сегментов осуществляется циклически, т.е. по достижении заранее определенного максимального номера сегмента последующему сегменту присваивается номер ‘0’. Таким образом, в общем случае, если обозначить через к количество бит в поле номера сегмента заголовка - количество сегментов, которое можно будет пронумеровать, равно 2к, соответственно, номер сегмента может принимать значение в пределах [0,2*-‘].

Обеспечение гарантированной доставки данных | Управление трафиком и качество обслужевания в сети | Посылка и нумерация сегментов подтверждения аск