RFC: 793
Оригинал: Transmission Control Protocol
Предыдущие версии: RFC 761
Категория: Стандарт Интернета
Дата публикации:
Автор:
Перевод: Николай Малых

RFC 793, Страница 47 из 49

    1. Если не установлен ни бит SYN, ни бит, сегмент отбрасывается с возвратом управления.

      После перечисленных для состояний CLOSED, LISTEN, SYN-SENT проверок выполняются следующие операции:

      1. Проверка порядкового номера

        Состояния SYN-RECEIVED; ESTABLISHED; FIN-WAIT-1; FIN-WAIT-2; CLOSE-WAIT; CLOSING; LAST-ACK; TIME-WAIT

        Начальные проверки с целью отбрасывания старых дубликатов проводятся в порядке прибытия, но дальнейшая обработка сегментов ведется в соответствии с порядковыми номерами в поле SEG.SEQ. Если сегмент включает старые и новые данные, должна обрабатываться только новая информация.

        При начальной проверке прибывающих сегментов возможны 4 варианта:

        Размер сегмента Окно приема Проверка
        0 0 SEG.SEQ = RCV.NXT
        0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND
        >0 0 недопустимо
        >0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND или
        RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND

        Если RCV.WND = 0, сегменты не могут приниматься за исключением корректных сегментов ACK, URG и RST.

        Если входящий сегмент неприемлем, в ответ на него должно быть передано уведомление (если установлен бит RST, сегмент должен быть отброшен с возвратом управления):

        <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK>

        После передачи подтверждения происходит отбрасывание неприемлемого сегмента и возврат управления.

        В дальнейшем сегменты предполагаются идеализированными — они начинаются с RCV.NXT и не выходят за пределы окна. Реальные сегменты могут быть подогнаны под такую идеализацию путем отрезания любой части, выходящей за пределы окна (включая SYN и FIN), и дальнейшей обработки только для сегментов, начинающихся с RCV.NXT. Сегменты с более высокими порядковыми номерами могут сохраняться для последующей обработки.

      2. Проверка бита RST

        Состояние SYN-RECEIVED

        Если установлен бит RST

        Если соединение было открыто пассивным вызовом OPEN (т. е., перешло из состояния LISTEN), оно будет возвращено в состояние LISTEN с возвратом управления. Пользователю не будет передаваться никакого уведомления об этом. Если соединение организовано активным вызовом OPEN (т. е., перешло из состояния SYN-SENT), оно будет отвергнуто (refused) и пользователь получит сообщение "connection refused". В обоих случаях все сегменты из очереди на передачу должны быть удалены. В случае активного вызова OPEN соединение переводится в состояние CLOSED с удалением TCB и возвратом управления.

        Состояния ESTABLISHED; FIN-WAIT-1; FIN-WAIT-2; CLOSE-WAIT

        Если установлен бит RST, все остающиеся вызовы RECEIVE и SEND должны получить команду сброса (reset). Все сегменты из очередей должны быть удалены. Пользователь должен получить сигнал "connection reset" (сброс соединения). Соединение переходит в состояние CLOSED с удалением TCB и возвратом управления.

        Состояния CLOSING; LAST-ACK; TIME-WAIT

        Если установлен бит RST, соединение переходит в состояние CLOSED с удалением TCB и возвратом управления.

      3. Проверка предпочтений и безопасности

        Состояние SYN-RECEIVED

        Если уровни безопасности/разделения и предпочтения в сегменте не соответствуют в точности таким же уровням в TCB, передается сигнал сброса (reset) с возвратом управления.

        Состояния ESTABLISHED; FIN-WAIT-1; FIN-WAIT-2; CLOSE-WAIT; CLOSING; LAST-ACK; TIME-WAIT

        Если уровни безопасности/разделения и предпочтения в сегменте не соответствуют в точности таким же уровням в TCB, передается сигнал сброса (reset), все остающиеся вызовы RECEIVE и SEND должны получить сигнал reset. Все очереди сегментов удаляются. Пользователь должен получить сигнал "connection reset". Соединение переходит в состояние CLOSED с удалением TCB и возвратом управления.

        Отметим, что эта проверка проводится после проверки порядкового номера для предотвращения приема сегментов из старых соединений между теми же портами, но с другим уровнем безопасности или предпочтений, которые могут вызвать разрыв текущего соединения.

        Если соединение было инициировано пассивным вызовом OPEN, оно переходит в состояние LISTEN c возвратом управления. В остальных случаях выполняется дальнейшая обработка.

      4. Проверка бита SYN

        Состояния SYN-RECEIVED; ESTABLISHED; FIN-WAIT-1; FIN-WAIT-2; CLOSE-WAIT; CLOSING; LAST-ACK; TIME-WAIT

        Если SYN находится в окне, это говорит об ошибке. Передается сигнал сброса (reset), все незавершенные вызовы RECEIVE и SEND должны получить reset. Все сегменты из очередей удаляются, пользователь должен получить сигнал "connection reset". Соединение переходит в состояние CLOSED с удалением TCB и возвратом управления.

        Если SYN не находится в окне, этот этап не будет выполняться, поскольку будет передано подтверждение еще на первом этапе (проверка порядкового номера).

      5. Проверка поля ACK

        Если бит ACK не установлен, сегмент отбрасывается с возвратом управления.

        При наличии бита ACK выполняется дальнейшая обработка.

        Состояние SYN-RECEIVED

        Если SND.UNA =< SEG.ACK =< SND.NXT, соединение переходит в состояние ESTABLISHED12 и обработка продолжается.

        Если сегмент подтверждения неприемлем, формируется и передается сегмент сброса (reset).

        <SEQ=SEG.ACK><CTL=RST>

        Состояние ESTABLISHED

        Если SND.UNA < SEG.ACK =< SND.NXT, устанавливается SND.UNA <- SEG.ACK. Все, так или иначе, целиком подтвержденные сегменты удаляются из очереди повторной передачи. Пользователь должен получить позитивные подтверждения для буферов, которые были переданы и полностью подтверждены (т. е., в результате вызова SEND должно быть возвращено сообщение "ok"). Если подтверждение ACK является дубликатом (SEG.ACK =< SND.UNA), его можно игнорировать. Если ACK подтверждает что-то, еще не переданное (SEG.ACK > SND.NXT), посылается подтверждение ACK и сегмент отбрасывается с возвратом управления.

        Если SND.UNA =< SEG.ACK =< SND.NXT, окно нужно обновить. Если выполняется условие

        (SND.WL1 < SEG.SEQ) OR ((SND.WL1 = SEG.SEQ) AND (SND.WL2 =< SEG.ACK)),

        нужно установить SND.WND <- SEG.WND, SND.WL1 <- SEG.SEQ и SND.WL2 <- SEG.ACK.

        Отметим, что SND.WND задает смещение от SND.UNA, поле SND.WL1 содержит порядковый номер последнего сегмента, использованного для обновления SND.WND, а SND.WL2 содержит номер подтверждения последнего сегмента, использованного для обновления SND.WND. Описанная проверка позволяет предотвратить использование старых сегментов для обновления окна.

        Состояние FIN-WAIT-1

        В дополнение к операциям, выполняемым в состоянии ESTABLISHED (см. выше), если наш запрос FIN уже подтвержден, соединение переводится в состояние FIN-WAIT-2 и продолжается обработка для этого состояния.

        Состояние FIN-WAIT-2

        В дополнение к операциям, выполняемым в состоянии ESTABLISHED (см. выше), если очередь повторной передачи пуста, на пользовательский запрос CLOSE может быть передан отклик "ok", но TCB не удаляется.

        Состояние CLOSE-WAIT

        Выполняются те же операции, что и для состояния ESTABLISHED.

        Состояние CLOSING

        В дополнение к операциям, выполняемым в состоянии ESTABLISHED (см. выше), если ACK подтверждает наш запрос FIN, соединение переводится в состояние TIME-WAIT, в остальных случаях сегмент игнорируется.

        Состояние LAST-ACK

        В этом состоянии могут доставляться только подтверждения для запроса FIN. Если запрос FIN уже подтвержден, удаляется TCB и соединение переводится в состояние CLOSED с возвратом управления.

        Состояние TIME-WAIT

        В этом состоянии могут доставляться только повторы сегмента FIN с удаленной стороны. Подтвердите доставку и запустите заново отсчет тайм-аута 2 MSL.

      6. Проверка бита URG

        Состояния ESTABLISHED; FIN-WAIT-1; FIN-WAIT-2

        При установленном бите URG, задается значение RCV.UP <- max(RCV.UP,SEG.UP) и пользователю передается сигнал о том, что удаленная сторона имеет срочные данные, если указатель срочности (RCV.UP) превышает порядковые номера воспринятых данных. Если пользователю уже был передан такой сигнал (или пользователь находится в режиме "urgent") для продолжающейся последовательности срочных данных, повторять такой сигнал не нужно.

        Состояния CLOSE-WAIT; CLOSING; LAST-ACK; TIME-WAIT

        В этих состояниях флаг срочности не должен появляться, поскольку удаленная сторона уже передала запрос FIN. Игнорируйте URG.

      7. Обработка содержимого сегмента

        Состояния ESTABLISHED; FIN-WAIT-1; FIN-WAIT-2

        В состоянии ESTABLISHED возможна доставка содержимого сегмента в пользовательские буферы RECEIVE. Содержимое сегмента может переноситься в буфер до его заполнения или до завершения сегмента. Если закончившийся сегмент содержит флаг PUSH, пользователю передается уведомление путем установки флага PUSH при возврате управления.

        Когда TCP отвечает за доставку данных пользователю, требуется также подтверждать получение данных.

        Когда TCP несет ответственность за доставку данных, значение RCV.NXT увеличивается на размер принятых данных и уточняется значение RCV.WND с учетом текущего размера буфера. Сумма RCV.NXT и RCV.WND при этом не должна уменьшаться.

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

        <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK>

        Это подтверждение должно включаться в сегмент, который будет передаваться с минимальной возможной задержкой.

        Состояния CLOSE-WAIT; CLOSING; LAST-ACK; TIME-WAIT

        В этих состояниях сегменты данных не должны приходить, поскольку с удаленной стороны уже получен сигнал FIN. Игнорируйте такие сегменты.

      8. Проверка бита FIN

        Не обрабатывайте флаг FIN для состояний CLOSED, LISTEN или SYN-SENT, поскольку значение SEG.SEQ не может быть проверено; отбрасывайте сегмент с возвратом управления.

        Если бит FIN установлен, пользователю передается сигнал "connection closing" (соединение закрывается) и все ожидающие вызовы RECEIVE должны вернуть такое же сообщение, увеличив RCV.NXT на размер FIN и передав подтверждение для FIN. Отметим, что FIN вызывает PUSH для всех сегментов, которые еще не доставлены пользователю.

        Состояния SYN-RECEIVED; ESTABLISHED

        Переход в состояние CLOSE-WAIT.

        Состояние FIN-WAIT-1

        Если наш запрос FIN уже подтвержден (возможно в данном сегменте), соединение переводится в состояние TIME-WAIT, начинается новый отсчет для времени ожидания и выключаются другие таймеры. В противном случае соединение переводится в состояние CLOSING.

        Состояние FIN-WAIT-2

        Переход в состояние TIME-WAIT, начинается новый отсчет для времени ожидания и выключаются другие таймеры.

        Состояния CLOSE-WAIT; CLOSING; LAST-ACK; TIME-WAIT

        Состояние сохраняется неизменным. В состоянии TIME-WAIT заново запускается отсчет тайм-аута 2 MSL.

      Завершение обработки и возврат управления.

Страница 47 из 49

2007 - 2022 © Русские переводы RFC, IETF, ISOC.