Главная страница

Порядок создания СЗПДн. Требования к сетевым устройствам


Скачать 1.38 Mb.
НазваниеТребования к сетевым устройствам
АнкорПорядок создания СЗПДн
Дата11.10.2021
Размер1.38 Mb.
Формат файлаdoc
Имя файлаrfc1122_HOST1_tr.doc
ТипПротокол
#245378
страница11 из 11
1   2   3   4   5   6   7   8   9   10   11
§4.2.2.2. Использование флага “PUSH”(“продвижение”): RFC-793

Когда прикладной процесс транслирует последовательность вызовов “Передача” (“SEND”) без установки флага “PUSH” в значение “1”, ТСР-модуль может собрать все данные внутри себя без последующей их передачи. Аналогично, когда принята последовательность ТСР-блоков, в которых не установлен флаг “PUSH” в значение “1”, ТСР-модуль может образовать внутри себя очередь из поступивших ТСР-блоков без последующей их доставки принимающему прикладному процессу.

Бит “PSH” не является маркером записи и не зависит от границ ТСР-блока. Передающей стороне целесообразно обнулять все последующие биты “PSH”, когда она формирует пакеты данных, с целью передачи блока максимально возможной длины.

ТСР-модуль может применить флаги “PUSH” при поступлении вызовов “Передача” (“SEND”). Если же флаги “PUSH” не применяются, то передающий ТСР-модуль должен: не накапливать бесконечно данные в буферной памяти, устанавливать бит “PSH” в значение “1” в последнем блоке, записанном в буферной памяти (то есть, когда больше нет данных для передачи).

В стандарте RFC-793 установлено, что принятый флаг “PSH” (значение “1”) должен обязательно транслироваться на прикладной уровень. Однако, данный стандарт отменяет это требование: доставка принятого флага “PSH” (значение “1”) на прикладной уровень является не обязательной функцией (дополнительной).

С логической точки зрения, для установки флага “PUSH” при вызове “Передача” запрашивается прикладная программа, которая необходима всякий раз, когда нужно ускорить доставку данных с целью предотвращения блокировки соединения. Тем не менее, целесообразно, чтобы ТСР-модуль транслировал ТСР-блок максимальной, насколько это возможно, длины с целью повышения пропускной способности.

Когда установка флага “PUSH” в значение “1” на применяется при поступлении последовательности вызовов “Передача” (“SEND”), то есть когда транспортный интерфейс (интерфейс между транспортным и прикладным уровнями Internet-архитектуры) использует простую модель потоковой передачи данных, ответственность за сборку даже самых коротких фрагментов данных с целью формирования ТСР-блоков приемлемой длины частично ложиться и на прикладной уровень.

Как правило, прикладной интерактивный протокол должен устанавливать флаг “PUSH” в значение “1”, по крайней мере, в последнем вызове “Передача” в каждой последовательности команд или ответов. Целесообразно, чтобы протокол массовой доставки, подобный FTP-протоколу, устанавливал флаг “PUSH” в значение “1” в последнем фрагменте файла или когда необходимо предотвратить блокировку буферной памяти.

На приёмной стороне, бит “PSH” (“1”) “подталкивает” данные, накапливаемые в буферной памяти, с целью их доставки на прикладной уровень (даже если таких данных меньше, чем может вместить приёмный буфер). И наоборот, отсутствие бита “PSH” (“1”) может быть использовано для предотвращения ненужных сигналов тревоги, транслируемых прикладному процессу. А это, в свою очередь, может быть важной оптимизационной характеристикой для высокопроизводительных ГВМ, работающих в режиме множественного доступа с временным разделением каналов. Доставка бита “PSH” (“1”) на принимающий прикладной модуль позволяет провести аналогичную оптимизацию в рамках прикладной системы.
§4.2.2.3. Размер окна: RFC-793

Размер окна (“window size”) должно трактовать только как целое беззнаковое число, или иначе слишком большие размеры окна будут рассматриваться как отрицательные окна и ТСР-модуль не будет работать. Рекомендуется, чтобы все реальные системы резервировали 32-битовое поле в записи о параметрах соединения для передачи и приёма размеров окон, а также производили расчёты размеров окон в пределах 32 битов.

Известно, что поле “Размер длины (в октетах) “скользящего окна” в заголовке ТСР-блока слишком мало для высокоскоростных ретрансляционных участков и участков с большой задержкой во времени. Для решения этой проблемы и увеличения размера окна были определены новые (экспериментальные) дополнительные ТСР-функции (RFC-1323 и RFC-2018). Рекомендуется, чтобы разработчики программных ТСР-модулей встраивали в свои программные продукты эти функции.
§4.2.2.4. Указатель срочности “Urgent”: RFC-793

ТСР-протокол обязан обрабатывать последовательность срочных данных любой длины.

ТСР-модуль обязан в любой момент информировать (асинхронно) прикладной уровень о том, что он принял указатель срочности “Urgent” и ранее не было задержки срочных данных, или, что в потоке данных содержится указатель срочности “Urgent”. Прикладной модуль должен быть способен анализировать, как много срочных данных осталось для прочтения, которые поступают через соединение, или, по крайней мере, определять, есть ли ещё срочные данные, подлежащие прочтению, или же их нет.

Несмотря на то, что способ передачи указатель срочности “Urgent” может быть реализован в любой прикладной системе. Этот указатель обычно используется при передаче команды типа “interrupt” (сигнал прерывания) для программного модуля Telnet-протокола (RFC-1123).

Асинхронное или “внеполосное” извещение позволит прикладному процессу (системе), который “читает” данные, поступающие по ТСР-соединению, перейти в “режим срочного извещения” (“urgent mode”). Это обеспечивает передачу команд управления прикладному процессу (системе), у которого, как правило, вся буферная память заполнена необработанными данными.

Возможным способом оповещения прикладного процесса (системы) о получении срочных данных является передача общего сигнала оповещения “ERROR-REPORT()”.
§4.2.2.5. Дополнительные ТСР-функции: RFC-793

ТСР-модуль обязан принимать дополнительную ТСР-функцию в любом ТСР-блоке. Кроме этого, ТСР-модуль обязан игнорировать дополнительную ТСР-функцию в любом принятом без ошибок ТСР-блоке, если такая функция в нём не реализована при условии, что в заголовке дополнительной ТСР-функции имеет место поле “Длина дополнительной ТСР-функции” (в дальнейшем все заголовки дополнительных ТСР-функций будут иметь поле “Длина дополнительной ТСР-функции”). ТСР-модуль должен быть настроен так, чтобы управлять длиной поля не приемлемой дополнительной ТСР-функции (например, устанавливать нулевую длину) без разрыва виртуального соединения. В этом случае предлагается переустановить соединение и зафиксировать причину этой процедуры.
§4.2.2.6. Дополнительная ТСР-функция “Максимальная

длина ТСР-блока” (MSS-параметр): RFC-793

ТСР-модуль должен выполнять функции передачи и приёма дополнительной ТСР-функции “Максимальная длина ТСР-блока” (Maximum Segment Size — MSS; RFC-879).

Целесообразно, чтобы ТСР-модуль транслировал MSS-параметр в каждом ТСР-блоке с битом “SYN”, когда оп принял значение MSS-параметра отличное от значения 536 (устанавливается по умолчанию). Более того, ТСР-модуль может всегда передавать значение этого параметра.

Если значение MSS-параметра не было получено в фазе установления виртуального соединения, то ТСР-модуль обязан использовать значение этого параметра по умолчанию, то есть равное 536 (RFC-879).

Максимальная длина ТСР-блока, который реально транслируется ТСР-модулем, “эффективное значение передаваемого MSS-параметра” (“effective send MSS”), должна быть меньше значения передаваемого MSS-параметра (которое отражает допустимый размер буферной памяти для повторной сборки блоков на удалённой ГВМ) и больше длины, разрешённой IP-модулем (IP-уровнем):

Eff.snd.MSS = min(SendMSS+20, MMS_S) — TCPhdrsize — IPoptionsize ,

где:

  • “SendMSS” — значение MSS-параметра, полученное от удалённой ГВМ, или по умолчанию 536, если, конечно, значение этого параметра не было получено;

  • “MMS_S” — максимальная длина блока транспортного уровня, который может передать ТСР-модуль;

  • “TCPhdrsize” — длина ТСР-заголовка. Обычно она равна 20 байтов, но может быть больше, если дополнительные ТСР-функции подлежат передаче;

  • “IPoptionsize” — длина поля для любых дополнительных IP-функций, которые будет транслировать ТСР-модуль на сетевой уровень вместе с текущим ТСР-блоком (то есть, сообщением транспортного уровня)

Значение MSS-параметра, подлежащее передаче в поле “Максимальная длина ТСР-блока”, должно быть меньше или равно:

MMS_R – 20 ,

где “MMS_R” — максимальная длина ТСР-блока, который может быть принят (и повторно собран). Значения параметров “MMS_R” и “MMS_S” ТСР-модуль получает от IP-модуля (сетевого уровня).

Выбор длины ТСР-блока в значительной степени влияет на повышение пропускной способности. Длинные транспортные блоки увеличивают пропускную способность за счёт относительного уменьшения длины заголовка и снижения затрат на обработку каждого IP-пакета (относительно поля полезной нагрузки). Однако, если IP-пакет слишком большой, что влечёт за собой его фрагментацию, то при потере любого фрагмента эффективность резко падает.

Некоторые реализованные ТСР-модули транслируют только значение MSS-параметра, если ГВМ-получатель расположена в не присоединённой сети. Тем не менее, ТСР-модуль вообще может не иметь соответствующей информации для принятия такого решения, и поэтому решение задачи определения минимального MTU-значения для конкретного маршрута предпочтительнее оставить IP-модулю. Более того, рекомендуется, чтобы ТСР-модуль всегда транслировал значение MSS-параметра (если последнее не составляет 536), и чтобы IP-модуль определял значение “MMS_R”. Специализированное программное средство в составе IP-модуля для определения MTU-значения должно быть модифицировано без изменения ТСР-модуля.
§4.2.2.7. Проверочная (контрольная) сумма в ТСР-блоке: RFC-793

В отличие от проверочной суммы в UDP-блоке, проверочная сумма в ТСР-блоке всегда является обязательной, а не дополнительной. Отправитель обязан вычислять проверочную сумму, а получатель — её проверять.
§4.2.2.8. Диаграмма состояний ТСР-соединения: RFC-793

На рис.9 представлена блок-схема процедурной характеристики ТСР-протокола (RFC-793). Однако в этой блок-схеме существует несколько проблем:

Состояние:

«Закрыто»









Состояние:

«Прослушивание»




Состояние:

«Передача «SYN»

Состояние:

«Приём «SYN»





Состояние:

«Передача данных»

+---------+ ---------\ active OPEN

| CLOSED | \ -----------

+---------+<---------\ \ create TCB

| ^ \ \ snd SYN

passive OPEN | | CLOSE \ \

------------ | | ---------- \ \

create TCB | | delete TCB \ \

V | \ \

+---------+ CLOSE | \

| LISTEN | ---------- | |

+---------+ delete TCB | |

rcv SYN | | SEND | |

----------- | | ------- | V

+---------+ snd SYN,ACK / \ snd SYN +---------+

| |<----------------- ------------------>| |

| SYN | rcv SYN | SYN |

| RCVD |<-----------------------------------------------| SENT |

| | snd ACK | |

| |------------------ -------------------| |

+---------+ rcv ACK of SYN \ / rcv SYN,ACK +---------+

| -------------- | | -----------

| x | | snd ACK

| V V

| CLOSE +---------+

| ------- | ESTAB |

| snd FIN +---------+

| CLOSE | | rcv FIN

V ------- | | -------

+---------+ snd FIN / \ snd ACK +---------+

| FIN |<----------------- ------------------>| CLOSE |

| WAIT-1 |------------------ | WAIT |

+---------+ rcv FIN \ +---------+

| rcv ACK of FIN ------- | CLOSE |

| -------------- snd ACK | ------- |

V x V snd FIN V

+---------+ +---------+ +---------+

|FINWAIT-2| | CLOSING | | LAST-ACK|

+---------+ +---------+ +---------+

| rcv ACK of FIN | rcv ACK of FIN |

| rcv FIN -------------- | Timeout=2MSL -------------- |

| ------- x V ------------ x V

\ snd ACK +---------+delete TCB +---------+

------------------------>|TIME WAIT|------------------>| CLOSED |

+---------+ +---------+
Рис.9. Диаграмма состояний соединения ТСР-протокола


  1. Стрелка от состояния “Передача “SYN” к состоянию “Приём “SYN” целесообразно обозначить “sndSYN,ACK”;

  2. Возможно наличие стрелки от состояния “Приём “SYN” в состояние “Прослушивание”, обусловленное получением запроса на повторное установление соединения “RST” после пассивного открытия (“passive OPEN”);

  3. Возможен прямой переход из состояния “FIN-WAIT-1” в состояние “TIME-WAIT”.


§4.2.2.9. Выбор начального последовательного номера: RFC-793

ТСР-модуль должен использовать специализированное основанное на системных часах программное средство для выбора начальных последовательных номеров.
§4.2.2.10. Одновременные попытки открытия ТСР-соединения: RFC-793

ТСР-модуль должен обеспечивать одновременные попытки открытия ТСР-соединения.

Некоторые разработчики иногда удивляются по поводу того, что если два прикладных процесса пытаются одновременно соединиться друг с другом, то в результате устанавливается только одно виртуальное соединение, а не два. Это было умышленное проектное решение (не старайтесь решить эту “проблему”).
§4.2.2.11. Восстановление на основе дубликата ранее принятого

ТСР-блока с установленным битом “SYN”: RFC-793

Следует заметить, что реализованный ТСР-модуль должен хранить запись о том, что перешло ли ТСР-соединения в состояние “SYN_RCVD” (приём ТСР-блока с установленным битом “SYN”) в результате пассивного открытия (“passive OPEN”) или активного открытия (“active OPEN”).
§4.2.2.12. ТСР-блок с установленным битом “RST”: RFC-793

Целесообразно, чтобы ТСР-модуль предусматривал включение данных в ТСР-блок с установленным битом “RST

Рекомендуется, чтобы ТСР-блок с установленным битом “RST” мог бы содержать текст в ASCII-коде, который бы “разъяснял” причину нештатной ситуации, повлекшей за собой повторное установление ТСР-соединения. Тем не менее, в настоящее время таких правил кодирования нет.
§4.2.2.13. Фаза закрытия ТСР-соединения (“Closing”): RFC-793

ТСР-соединение может завершаться двумя способами:

  1. обычное разъединение на основе обмена ТСР-блоками с установленными битами “FIN” (так называемое “рукопожатие” — “FIN handshake”);

  2. разрыв ТСР-соединения на основе передачи одного или нескольких ТСР-блоков с установленными битами “RST”, после приёма которых ТСР-соединение разрывается.

Если ТСР-соединение закрывается удалённым процессом, то взаимодействующий с ним локальный прикладной процесс должен быть проинформирован о том, как произошло завершение ТСР-соединения, либо обычным способом, либо на основе разрыва.

В результате нормального завершения ТСР-соединения в обоих направлениях надёжно доставляются данные, которые сохраняются в буферной памяти обоих процессов. Так как оба направления ТСР-соединения завершаются независимо друг от друга, то возможно состояние “полузакрытого” ТСР-соединения, то есть когда ТСР-соединение завершается только в одном направлении, а ГВМ разрешено продолжать передачу данных в открытом направлении полузакрытого ТСР-соединения.

В ПО ГВМ может быть реализован переход в состояние “полузакрытого” ТСР-соединения, причём таким образом, чтобы прикладной процесс, который инициировал фазу разъединения, не мог продолжить чтение данных поступающих от взаимодействующего удалённого процесса. Если такая ГВМ (её прикладной процесс) инициировала фазу разъединения, несмотря на то, что принятые данные всё ещё ожидают обработки ТСР-модулем, или если были приняты новые данные после начала фазы разъединения, то целесообразно, чтобы ТСР-модуль передал ТСР-блок с установленным битом “RST” с целью демонстрации того, что данные были потеряны.

Когда фаза разъединения инициализируется одним из прикладных процессов, то ТСР-соединение должно оставаться в состоянии ожидания “TIME-WAIT” в течение интервала времени, равного 2×MSL (Maximum Segment Lifetime — максимальное время жизни ТСР-блока). Тем не менее, возможен приём нового ТСР-блока с установленным битом “SYN” от удалённого ТСР-модуля с целью повторного установления ТСР-соединения непосредственно из состояния ожидания “TIME-WAIT”. Если этот ТСР-блок:

  1. устанавливает свой начальный последовательный номер для нового ТСР-соединения, который больше, чем самый последний последовательный номер, используемый для идентификации предшествующего ТСР-соединения, то начинается фаза установления нового соединения;

  2. оказался дубликатом ранее принятого ТСР-блока, то происходит возврат в состояние ожидания “TIME-WAIT”.

Фаза закрытия полнодуплексного ТСР-соединения с сохранением данных не представлена в аналогичном ISO-стандарте транспортного протокола ТР4.

Некоторые системы не внедрили состояние полузакрытых соединений и возможно потому, что они просто не “учли” это состояние в I/O-модели (вход/выход) своей используемой ОС. В таких системах, после перехода прикладного процесса в фазу разъединения, невозможно в течение длительного времени обрабатывать входные данные, поступающие через соединение от удалённого прикладного процесса. Поэтому такое состояние рассматривается как фаза закрытия полнодуплексного ТСР-соединения.

Поэтапный алгоритм завершения ТСР-соединения требует, чтобы состояние соединения оставалось ещё некоторое время, по крайней мере, на одной стороне соединения. Длительность такого тайм-аута составляет 2×MSL, то есть 4 минуты. В течение этого временного интервала пара идентификаторов (удалённый процесс и локальный процесс, IP-адрес/ТСР-порт — socket), определяющих ТСР-соединение, является занятой и не может повторно использоваться. Для сокращения этого времени с целью повторного использования этих идентификаторов, но для нового соединения, некоторые ТСР-модули допускают передачу нового ТСР-блока с установленным битом “SYN” в состоянии “TIME-WAIT”.
§4.2.2.14. Фаза передачи данных: RFC-793

После выхода стандарта RFC-793 была проведена громадная работа по улучшению ТСР-алгоритмов с целью повышения эффективности передачи данных (информационного обмена). В дальнейшем будут рассмотрены требуемые и рекомендованные ТСР-алгоритмы с целью определения момента начала передачи данных и соответствующих квитанций, а также информации для изменения размера “скользящего окна” или просто окна.

Существует одна очень важная проблема, именуемая “синдромом узкого окна” (“Silly Window Syndrome” — SWS, RFC-813), то есть стабильное и постепенное приращение узкого (малой ширины) окна, что является следствием крайне малой производительности ТСР-модуля. В дальнейшем будут рассмотрены алгоритмы предотвращения SWS-синдрома для приёмной и передающей сторон.

Если кратко, то SWS-синдром является следствием того, что приемная сторона сдвигает правую границу окна, причём всякий раз, когда на приёмной стороне появляется новое свободное пространство буферной памяти для входящих данных. Вместе с тем, SWS-синдром является также следствием того, что передающая сторона использует постепенно расширяющееся окно (сколь бы мало ни было это приращение) для передачи большего объёма данных (RFC-813). Результатом таких процессов может стать постоянная передача ТСР-блоков с очень маленьким объёмом полезной нагрузки (данных), даже несмотря на то, что и приёмная и передающая стороны имеют достаточно большое пространство буферной памяти для организации ТСР-соединения. SWS-синдром может проявляться только в период передачи большого объёма данных. Если ТСР-соединение находится под постоянной (равномерной) нагрузкой, то проблема исчезает сама по себе. Возникновение SWS-синдрома обусловлено функционированием типового программного модуля по управлению окном, но рассмотренные ниже алгоритмы, реализованные на передающей и приемной сторонах, предотвращают это негативное явление.

Другая важная проблемная характеристика ТСР-протокола заключается в том, что некоторые прикладные программные модули (процессы), особенно это касается удалённого доступа к ГВМ (серверам) посимвольной печати (character-at-a-time host), тяготеют к передаче потоков ТСР-блоков, содержащих всего лишь один октет данных. Для предотвращения блокировок каждый запрос к ТСР-модуль на передачу, поступающий от таких прикладных процессов, должен “проталкиваться” (“pushed”, принудительно продвигаться) либо прикладным процессом в явном виде, либо ТСР-модулем в неявном виде. Результатом таких действий может стать последовательность ТСР-блоков, содержащих по одному октету данных, что приведёт к очень неэффективному использованию самой Internet-сети и средств на её развитие. Алгоритм Найджела (John Nagle, RFC-896) является весьма простым и эффективным решением данной проблемы. Этот алгоритм обладает свойством накопления символов при взаимодействии прикладных программных Telnet-модулей. В начальной стадии этот эффект может стать “сюрпризом” для пользователей, которые “привыкли” к эхо-ответам с однобайтовым (односимвольным) полем данных, но эта привычка не была проблемой.

Следует заметить, что алгоритм Найджела и алгоритм предотвращения SWS-синдрома играют вспомогательные роли в процессе повышения производительности системы. Алгоритм Найджела воспрепятствует передаче “крошечных” ТСР-блоков, когда объем подлежащих передаче данных возрастает чрезвычайно медленно. Одновременно с этим, алгоритм предотвращения SWS-синдрома воспрепятствует появлению маленьких ТСР-блоков, формирование которых является результатом постепенного и медленного сдвига правой границы окна.

Встроенный некорректный ТСР-модуль может передавать две или более ответных квитанции (ТСР-блока) на каждый принятый информационный ТСР-блок. Например, предположим, что приёмная сторона сразу же отвечает передачей квитанции на каждый поступивший информационный ТСР-блок. Когда прикладной программный модуль (процесс) принимает данные и вновь увеличивает допустимый объем приёмного буфера памяти, то приёмная сторона может передать второй ответный ТСР-блок (вторую квитанцию) для корректировки окна на передающей стороне. Экстремальный случай относиться к передаче однобайтовых ТСР-блоков по ТСР-соединению с использованием TELNET-протокола в интересах удалённого доступа. Некоторые функционирующие в настоящее время ТСР-модули формируют в ответ на поступивший ТСР-блок с одним октетом данных соответственно три варианта ТСР-блока: (1) квитанцию, (2) ТСР-блок с указанием увеличения размера окна на один байт, (3) ТСР-блок с одним ответным символом.
§4.2.2.15. Тайм-аут повторной передачи: RFC-793

Алгоритм вычисления значения тайм-аута повторной передачи, который был предложен в стандарте RFC-793, не отвечает современным требованиям к эффективности передачи.

Для борьбы с перегрузками и обеспечения стабильности повторной передачи ТСР-протокола В.Якобсон (V.Jacobson) в 1988 году предложил использовать алгоритм передачи, который объединяет два алгоритма — “медленного старта” (“slow start”) и “предотвращения перегрузки” (“congestion avoidance”). В любом ТСР-модуле должен использоваться этот алгоритм.

Если повторно переданный IP-пакет идентичен IP-пакету, переданному первым (который which implies not only that the data boundaries have not changed, but also that the window and acknowledgment fields of the header have not changed), то может использоваться одно и то же значение в поле “Идентификатор” (см. §3.2.1.5).

Some TCP implementors have chosen to "packetize" the data stream, i.e., to pick segment boundaries when segments are originally sent and to queue these segments in a "retransmission queue" until they are acknowledged. Another design (which may be simpler) is to defer packetizing until each time data is transmitted or retransmitted, so there will be no segment retransmission queue.
In an implementation with a segment retransmission

queue, TCP performance may be enhanced by repacketizing

the segments awaiting acknowledgment when the first

retransmission timeout occurs. That is, the outstanding

segments that fitted would be combined into one maximum-sized

segment, with a new IP Identification value. The TCP would

then retain this combined segment
in the retransmit queue until it was acknowledged.

However, if the first two segments in the retransmission

queue totalled more than one maximum-sized segment,

the TCP would retransmit only the first segment

using the original IP Identification field.
4.2.2.16 Managing the Window: RFC-793 Section 3.7, page 41
A TCP receiver SHOULD NOT shrink the window, i.e., move the

right window edge to the left. However, a sending TCP MUST

be robust against window shrinking, which may cause the

"useable window" (see Section 4.2.3.4) to become negative.
If this happens, the sender SHOULD NOT send new data, but

SHOULD retransmit normally the old unacknowledged data

between SND.UNA and SND.UNA+SND.WND. The sender MAY also

retransmit old data beyond SND.UNA+SND.WND, but SHOULD NOT

time out the connection if data beyond the right window edge

is not acknowledged. If the window shrinks to zero, the TCP

MUST probe it in the standard way (see next Section).
DISCUSSION:

Many TCP implementations become confused if the window

shrinks from the right after data has been sent into a

larger window. Note that TCP has a heuristic to select the

latest window update despite possible datagram reordering;

as a result, it may ignore a window update with a smaller

window than previously offered if neither the sequence

number nor the acknowledgment number is increased.
4.2.2.17 Probing Zero Windows: RFC-793 Section 3.7, page 42
Probing of zero (offered) windows MUST be supported.
A TCP MAY keep its offered receive window closed

indefinitely. As long as the receiving TCP continues to

send acknowledgments in response to the probe segments, the

sending TCP MUST allow the connection to stay open.
DISCUSSION:

It is extremely important to remember that ACK

(acknowledgment) segments that contain no data are not

reliably transmitted by TCP. If zero window probing is

not supported, a connection may hang forever when an

ACK segment that re-opens the window is lost.
The delay in opening a zero window generally occurs

when the receiving application stops taking data from

its TCP. For example, consider a printer daemon

application, stopped because the printer ran out of paper.
The transmitting host SHOULD send the first zero-window

probe when a zero window has existed for the retransmission

timeout period (see Section 4.2.2.15), and SHOULD increase

exponentially the interval between successive probes.
DISCUSSION:

This procedure minimizes delay if the zero-window

condition is due to a lost ACK segment containing a

window-opening update. Exponential backoff is

recommended, possibly with some maximum interval not

specified here. This procedure is similar to that of

the retransmission algorithm, and it may be possible to

combine the two procedures in the implementation.
4.2.2.18 Passive OPEN Calls: RFC-793 Section 3.8
Every passive OPEN call either creates a new connection

record in LISTEN state, or it returns an error; it MUST NOT

affect any previously created connection record.
A TCP that supports multiple concurrent users MUST provide

an OPEN call that will functionally allow an application to

LISTEN on a port while a connection block with the same

local port is in SYN-SENT or SYN-RECEIVED state.
DISCUSSION:

Some applications (e.g., SMTP servers) may need to

handle multiple connection attempts at about the same

time. The probability of a connection attempt failing

is reduced by giving the application some means of listening

for a new connection at the same time that an earlier

connection attempt is going through the three-way handshake.
IMPLEMENTATION:

Acceptable implementations of concurrent opens may permit

multiple passive OPEN calls, or they may allow "cloning"

of LISTEN-state connections from a single passive OPEN call.
4.2.2.19 Time to Live: RFC-793 Section 3.9, page 52
RFC-793 specified that TCP was to request the IP layer to

send TCP segments with TTL = 60. This is obsolete; the TTL

value used to send TCP segments MUST be configurable. See

Section 3.2.1.7 for discussion.
4.2.2.20 Event Processing: RFC-793 Section 3.9
While it is not strictly required, a TCP SHOULD be capable of queueing

out-of-order TCP segments. Change the "may" in the last sentence

of the first paragraph on page 70 to "should".
DISCUSSION:

Some small-host implementations have omitted segment

queueing because of limited buffer space. This

omission may be expected to adversely affect TCP

throughput, since loss of a single segment causes all

later segments to appear to be "out of sequence".
In general, the processing of received segments MUST be

implemented to aggregate ACK segments whenever possible.

For example, if the TCP is processing a series of queued

segments, it MUST process them all before sending any ACK segments.
Here are some detailed error corrections and notes on the

Event Processing section of RFC-793.
(a) CLOSE Call, CLOSE-WAIT state, p. 61: enter LAST-ACK state, not CLOSING.
(b) LISTEN state, check for SYN (pp. 65, 66): With a SYN

bit, if the security/compartment or the precedence is

wrong for the segment, a reset is sent. The wrong form

of reset is shown in the text; it should be:

(c) SYN-SENT state, Check for SYN, p. 68: When the connection enters

ESTABLISHED state, the following variables must be set:

SND.WND <- SEG.WND

SND.WL1 <- SEG.SEQ

SND.WL2 <- SEG.ACK
(d) Check security and precedence, p. 71: The first heading

"ESTABLISHED STATE" should really be a list of all

states other than SYN-RECEIVED: ESTABLISHED, FIN-WAIT-

1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, and TIME-WAIT.
(e) Check SYN bit, p. 71: "In SYN-RECEIVED state and if

the connection was initiated with a passive OPEN, then

return this connection to the LISTEN state and return. Otherwise...".
(f) Check ACK field, SYN-RECEIVED state, p. 72: When the connection

enters ESTABLISHED state, the variables listed in (c) must be set.
(g) Check ACK field, ESTABLISHED state, p. 72: The ACK is a

duplicate if SEG.ACK =< SND.UNA (the = was omitted). Similarly,

the window should be updated if: SND.UNA =< SEG.ACK =< SND.NXT.
(h) USER TIMEOUT, p. 77:
It would be better to notify the application of the

timeout rather than letting TCP force the connection

closed. However, see also Section 4.2.3.5.
4.2.2.21 Acknowledging Queued Segments: RFC-793 Section 3.9
A TCP MAY send an ACK segment acknowledging RCV.NXT when a valid segment

arrives that is in the window but not at the left window edge.
DISCUSSION:

RFC-793 (see page 74) was ambiguous about whether or not an ACK

segment should be sent when an out-of-order segment was

received, i.e., when SEG.SEQ was unequal to RCV.NXT.
One reason for ACKing out-of-order segments might be to

support an experimental algorithm known as "fast

retransmit". With this algorithm, the sender uses the

"redundant" ACK's to deduce that a segment has been

lost before the retransmission timer has expired. It

counts the number of times an ACK has been received

with the same value of SEG.ACK and with the same right

window edge. If more than a threshold number of such

ACK's is received, then the segment containing the

octets starting at SEG.ACK is assumed to have been lost

and is retransmitted, without awaiting a timeout. The

threshold is chosen to compensate for the maximum

likely segment reordering in the Internet. There is

not yet enough experience with the fast retransmit

algorithm to determine how useful it is.
4.2.3 SPECIFIC ISSUES
4.2.3.1 Retransmission Timeout Calculation
A host TCP MUST implement Karn's algorithm and Jacobson's

algorithm for computing the retransmission timeout ("RTO").
o Jacobson's algorithm for computing the smoothed round-

trip ("RTT") time incorporates a simple measure of the variance [TCP:7].

o Karn's algorithm for selecting RTT measurements ensures

that ambiguous round-trip times will not corrupt the

calculation of the smoothed round-trip time [TCP:6].
This implementation also MUST include "exponential backoff"

for successive RTO values for the same segment. Retransmission

of SYN segments SHOULD use the same algorithm as data segments.
DISCUSSION:

There were two known problems with the RTO calculations

specified in RFC-793. First, the accurate measurement

of RTTs is difficult when there are retransmissions.

Second, the algorithm to compute the smoothed round-

trip time is inadequate [TCP:7], because it incorrectly

assumed that the variance in RTT values would be small

and constant. These problems were solved by Karn's and

Jacobson's algorithm, respectively.
The performance increase resulting from the use of

these improvements varies from noticeable to dramatic.

Jacobson's algorithm for incorporating the measured RTT

variance is especially important on a low-speed link,

where the natural variation of packet sizes causes a

large variation in RTT. One vendor found link utilization

on a 9.6kb line went from 10% to 90% as a result of

implementing Jacobson's variance algorithm in TCP.
The following values SHOULD be used to initialize the

estimation parameters for a new connection:
(a) RTT = 0 seconds.

(b) RTO = 3 seconds. (The smoothed variance is to be

initialized to the value that will result in this RTO).
The recommended upper and lower bounds on the RTO are known

to be inadequate on large internets. The lower bound SHOULD

be measured in fractions of a second (to accommodate high speed

LANs) and the upper bound should be 2*MSL, i.e., 240 seconds.
DISCUSSION:

Experience has shown that these initialization values

are reasonable, and that in any case the Karn and

Jacobson algorithms make TCP behavior reasonably

insensitive to the initial parameter choices.
4.2.3.2 When to Send an ACK Segment
A host that is receiving a stream of TCP data segments can

increase efficiency in both the Internet and the hosts by

sending fewer than one ACK (acknowledgment) segment per data

segment received; this is known as a "delayed ACK" [TCP:5].
A TCP SHOULD implement a delayed ACK, but an ACK should not

be excessively delayed; in particular, the delay MUST be

less than 0.5 seconds, and in a stream of full-sized segments

there SHOULD be an ACK for at least every second segment.
DISCUSSION:

A delayed ACK gives the application an opportunity to

update the window and perhaps to send an immediate

response. In particular, in the case of character-mode

remote login, a delayed ACK can reduce the number of

segments sent by the server by a factor of 3 (ACK, window

update, and echo character all combined in one segment).
In addition, on some large multi-user hosts, a delayed ACK

can substantially reduce protocol processing overhead by

reducing the total number of packets to be processed [TCP:5].

However, excessive delays on ACK's can disturb the round-trip

timing and packet "clocking" algorithms [TCP:7].
4.2.3.3 When to Send a Window Update
A TCP MUST include a SWS avoidance algorithm in the receiver [TCP:5].
IMPLEMENTATION:

The receiver's SWS avoidance algorithm determines when

the right window edge may be advanced; this is

customarily known as "updating the window". This

algorithm combines with the delayed ACK algorithm (see

Section 4.2.3.2) to determine when an ACK segment

containing the current window will really be sent to

the receiver. We use the notation of RFC-793; see

Figures 4 and 5 in that document.
The solution to receiver SWS is to avoid advancing the right

window edge RCV.NXT+RCV.WND in small increments, even if

data is received from the network in small segments.
Suppose the total receive buffer space is RCV.BUFF. At

any given moment, RCV.USER octets of this total may be

tied up with data that has been received and acknowledged but

which the user process has not yet consumed. When the

connection is quiescent, RCV.WND = RCV.BUFF and RCV.USER = 0.
Keeping the right window edge fixed as data arrives and

is acknowledged requires that the receiver offer less

than its full buffer space, i.e., the receiver must

specify a RCV.WND that keeps RCV.NXT+RCV.WND constant

as RCV.NXT increases. Thus, the total buffer space

RCV.BUFF is generally divided into three parts:
|<------- RCV.BUFF ---------------->|

1 2 3

----|---------|------------------|------|----

RCV.NXT ^

(Fixed)
1 - RCV.USER = data received but not yet consumed;

2 - RCV.WND = space advertised to sender;

3 - Reduction = space available but not yet advertised.
The suggested SWS avoidance algorithm for the receiver

is to keep RCV.NXT+RCV.WND fixed until the reduction satisfies:
RCV.BUFF - RCV.USER - RCV.WND >=
min( Fr * RCV.BUFF, Eff.snd.MSS )
where Fr is a fraction whose recommended value is 1/2,

and Eff.snd.MSS is the effective send MSS for the

connection (see Section 4.2.2.6). When the inequality

is satisfied, RCV.WND is set to RCV.BUFF-RCV.USER.
Note that the general effect of this algorithm is to

advance RCV.WND in increments of Eff.snd.MSS (for

realistic receive buffers: Eff.snd.MSS < RCV.BUFF/2).

Note also that the receiver must use its own Eff.snd.MSS,

assuming it is the same as the sender's.
4.2.3.4 When to Send Data
A TCP MUST include a SWS avoidance algorithm in the sender.
A TCP SHOULD implement the Nagle Algorithm [TCP:9] to

coalesce short segments. However, there MUST be a way for

an application to disable the Nagle algorithm on an individual

connection. In all cases, sending data is also subject to the

limitation imposed by the Slow Start algorithm (Section 4.2.2.15).
DISCUSSION:

The Nagle algorithm is generally as follows:
If there is unacknowledged data (i.e., SND.NXT >

SND.UNA), then the sending TCP buffers all user

data (regardless of the PSH bit), until the

outstanding data has been acknowledged or until

the TCP can send a full-sized segment (Eff.snd.MSS

bytes; see Section 4.2.2.6).
Some applications (e.g., real-time display window updates)

require that the Nagle algorithm be turned off, so small

data segments can be streamed out at the maximum rate.
IMPLEMENTATION:

The sender's SWS avoidance algorithm is more difficult

than the receivers's, because the sender does not know

(directly) the receiver's total buffer space RCV.BUFF.

An approach which has been found to work well is for

the sender to calculate Max(SND.WND), the maximum send

window it has seen so far on the connection, and to use

this value as an estimate of RCV.BUFF. Unfortunately,

this can only be an estimate; the receiver may at any time

reduce the size of RCV.BUFF. To avoid a resulting deadlock,

it is necessary to have a timeout to force transmission

of data, overriding the SWS avoidance algorithm.

In practice, this timeout should seldom occur.
The "useable window" [TCP:5] is:
U = SND.UNA + SND.WND - SND.NXT
i.e., the offered window less the amount of data sent

but not acknowledged. If D is the amount of data

queued in the sending TCP but not yet sent, then the

following set of rules is recommended.
Send data:
(1) if a maximum-sized segment can be sent, i.e, if:
min(D,U) >= Eff.snd.MSS;
(2) or if the data is pushed and all queued data can

be sent now, i.e., if:
[SND.NXT = SND.UNA and] PUSHED and D <= U
(the bracketed condition is imposed by the Nagle algorithm);
(3) or if at least a fraction Fs of the maximum window

can be sent, i.e., if:
[SND.NXT = SND.UNA and]
min(D.U) >= Fs * Max(SND.WND);
(4) or if data is PUSHed and the override timeout occurs.
Here Fs is a fraction whose recommended value is 1/2.

The override timeout should be in the range 0.1 - 1.0

seconds. It may be convenient to combine this timer with

the timer used to probe zero windows (Section 4.2.2.17).
Finally, note that the SWS avoidance algorithm just specified is

to be used instead of the sender-side algorithm contained in [TCP:5].
4.2.3.5 TCP Connection Failures
Excessive retransmission of the same segment by TCP indicates some

failure of the remote host or the Internet path. This failure

may be of short or long duration. The following procedure MUST be

used to handle excessive retransmissions of data segments [IP:11]:
(a) There are two thresholds R1 and R2 measuring the amount

of retransmission that has occurred for the same segment. R1 and R2

might be measured in time units or as a count of retransmissions.
(b) When the number of transmissions of the same segment reaches or

exceeds threshold R1, pass negative advice (see Section 3.3.1.4)

to the IP layer, to trigger dead-gateway diagnosis.
(c) When the number of transmissions of the same segment

reaches a threshold R2 greater than R1, close the connection.
(d) An application MUST be able to set the value for R2 for

a particular connection. For example, an interactive

application might set R2 to "infinity," giving the user

control over when to disconnect.
(d) TCP SHOULD inform the application of the delivery

problem (unless such information has been disabled by

the application; see Section 4.2.4.1), when R1 is

reached and before R2. This will allow a remote login

(User Telnet) application program to inform the user, for example.
The value of R1 SHOULD correspond to at least 3 retransmissions, at the

current RTO. The value of R2 SHOULD correspond to at least 100 seconds.
An attempt to open a TCP connection could fail with

excessive retransmissions of the SYN segment or by receipt

of a RST segment or an ICMP Port Unreachable. SYN retransmissions

MUST be handled in the general way just described for data

retransmissions, including notification of the application layer.
However, the values of R1 and R2 may be different for SYN

and data segments. In particular, R2 for a SYN segment MUST

be set large enough to provide retransmission of the segment

for at least 3 minutes. The application can close the connection

(i.e., give up on the open attempt) sooner, of course.
DISCUSSION:

Some Internet paths have significant setup times, and

the number of such paths is likely to increase in the future.
4.2.3.6 TCP Keep-Alives
Implementors MAY include "keep-alives" in their TCP

implementations, although this practice is not universally

accepted. If keep-alives are included, the application MUST

be able to turn them on or off for each TCP connection, and

they MUST default to off.
Keep-alive packets MUST only be sent when no data or

acknowledgement packets have been received for the

connection within an interval. This interval MUST be

configurable and MUST default to no less than two hours.
It is extremely important to remember that ACK segments that

contain no data are not reliably transmitted by TCP. Consequently,

if a keep-alive mechanism is implemented it MUST NOT interpret

failure to respond to any specific probe as a dead connection.
An implementation SHOULD send a keep-alive segment with no

data; however, it MAY be configurable to send a keep-alive

segment containing one garbage octet, for compatibility with

erroneous TCP implementations.
DISCUSSION:

A "keep-alive" mechanism periodically probes the other

end of a connection when the connection is otherwise

idle, even when there is no data to be sent. The TCP

specification does not include a keep-alive mechanism

because it could: (1) cause perfectly good connections

to break during transient Internet failures; (2)

consume unnecessary bandwidth ("if no one is using the

connection, who cares if it is still good?"); and (3)

cost money for an Internet path that charges for packets.
Some TCP implementations, however, have included a

keep-alive mechanism. To confirm that an idle

connection is still active, these implementations send

a probe segment designed to elicit a response from the

peer TCP. Such a segment generally contains SEG.SEQ =

SND.NXT-1 and may or may not contain one garbage octet

of data. Note that on a quiet connection SND.NXT =

RCV.NXT, so that this SEG.SEQ will be outside the

window. Therefore, the probe causes the receiver to

return an acknowledgment segment, confirming that the

connection is still live. If the peer has dropped the

connection due to a network partition or a crash, it will

respond with a RST instead of an acknowledgment segment.
Unfortunately, some misbehaved TCP implementations fail

to respond to a segment with SEG.SEQ = SND.NXT-1 unless

the segment contains data. Alternatively, an implementation

could determine whether a peer responded correctly to

keep-alive packets with no garbage data octet.
A TCP keep-alive mechanism should only be invoked in

server applications that might otherwise hang indefinitely

and consume resources unnecessarily if a client crashes

or aborts a connection during a network failure.
4.2.3.7 TCP Multihoming
If an application on a multihomed host does not specify the

local IP address when actively opening a TCP connection,

then the TCP MUST ask the IP layer to select a local IP

address before sending the (first) SYN. See the function

GET_SRCADDR() in Section 3.4.
At all other times, a previous segment has either been sent

or received on this connection, and TCP MUST use the same

local address is used that was used in those previous segments.
4.2.3.8 IP Options
When received options are passed up to TCP from the IP

layer, TCP MUST ignore options that it does not understand.
A TCP MAY support the Time Stamp and Record Route options.
An application MUST be able to specify a source route when

it actively opens a TCP connection, and this MUST take

precedence over a source route received in a datagram.
When a TCP connection is OPENed passively and a packet arrives with

a completed IP Source Route option (containing a return route), TCP

MUST save the return route and use it for all segments sent on this

connection. If a different source route arrives in a later segment,

the later definition SHOULD override the earlier one.
4.2.3.9 ICMP Messages
TCP MUST act on an ICMP error message passed up from the IP

layer, directing it to the connection that created the

error. The necessary demultiplexing information can be

found in the IP header contained within the ICMP message.
o Source Quench

TCP MUST react to a Source Quench by slowing

transmission on the connection. The RECOMMENDED

procedure is for a Source Quench to trigger a "slow

start," as if a retransmission timeout had occurred.
o Destination Unreachable -- codes 0, 1, 5

Since these Unreachable messages indicate soft error

conditions, TCP MUST NOT abort the connection, and it

SHOULD make the information available to the application.
DISCUSSION:

TCP could report the soft error condition directly

to the application layer with an upcall to the

ERROR_REPORT routine, or it could merely note the

message and report it to the application only when

and if the TCP connection times out.
o Destination Unreachable -- codes 2-4

These are hard error conditions, so TCP SHOULD abort the connection.
o Time Exceeded -- codes 0, 1

This should be handled the same way as Destination

Unreachable codes 0, 1, 5 (see above).
o Parameter Problem

This should be handled the same way as Destination

Unreachable codes 0, 1, 5 (see above).
4.2.3.10 Remote Address Validation
A TCP implementation MUST reject as an error a local OPEN call for

an invalid remote IP address (e.g., a broadcast or multicast address).
An incoming SYN with an invalid source address must be

ignored either by TCP or by the IP layer (see Section 3.2.1.3).
A TCP implementation MUST silently discard an incoming SYN

segment that is addressed to a broadcast or multicast address.
4.2.3.11 TCP Traffic Patterns
IMPLEMENTATION:

The TCP protocol specification [TCP:1] gives the implementor

much freedom in designing the algorithms that control the

message flow over the connection -- packetizing, managing

the window, sending acknowledgments, etc. These design decisions

are difficult because a TCP must adapt to a wide range of traffic

patterns. Experience has shown that a TCP implementor needs

to verify the design on two extreme traffic patterns:
o Single-character Segments

Even if the sender is using the Nagle Algorithm,

when a TCP connection carries remote login traffic

across a low-delay LAN the receiver will generally

get a stream of single-character segments. If remote

terminal echo mode is in effect, the receiver's system

will generally echo each character as it is received.
o Bulk Transfer

When TCP is used for bulk transfer, the data

stream should be made up (almost) entirely of

segments of the size of the effective MSS.

Although TCP uses a sequence number space with

byte (octet) granularity, in bulk-transfer mode

its operation should be as if TCP used a sequence

space that counted only segments.
Experience has furthermore shown that a single TCP can

effectively and efficiently handle these two extremes.
The most important tool for verifying a new TCP

implementation is a packet trace program. There is a

large volume of experience showing the importance of

tracing a variety of traffic patterns with other TCP

implementations and studying the results carefully.
4.2.3.12 Efficiency
IMPLEMENTATION:

Extensive experience has led to the following

suggestions for efficient implementation of TCP:
(a) Don't Copy Data

In bulk data transfer, the primary CPU-intensive

tasks are copying data from one place to another

and checksumming the data. It is vital to

minimize the number of copies of TCP data. Since the

ultimate speed limitation may be fetching data across

the memory bus, it may be useful to combine the copy

with checksumming, doing both with a single memory fetch.
(b) Hand-Craft the Checksum Routine

A good TCP checksumming routine is typically two

to five times faster than a simple and direct

implementation of the definition. Great care and

clever coding are often required and advisable to

make the checksumming code "blazing fast". See [TCP:10].
(c) Code for the Common Case

TCP protocol processing can be complicated, but

for most segments there are only a few simple

decisions to be made. Per-segment processing will

be greatly speeded up by coding the main line to

minimize the number of decisions in the most common case.
4.2.4 TCP/APPLICATION LAYER INTERFACE
4.2.4.1 Asynchronous Reports
There MUST be a mechanism for reporting soft TCP error

conditions to the application. Generically, we assume this

takes the form of an application-supplied ERROR_REPORT routine that

may be upcalled [INTRO:7] asynchronously from the transport layer:
ERROR_REPORT(local connection name, reason, subreason)
The precise encoding of the reason and subreason parameters

is not specified here. However, the conditions that are

reported asynchronously to the application MUST include:
* ICMP error message arrived (see 4.2.3.9)

* Excessive retransmissions (see 4.2.3.5)

* Urgent pointer advance (see 4.2.2.4).
However, an application program that does not want to receive such

ERROR_REPORT calls SHOULD be able to effectively disable these calls.
DISCUSSION:

These error reports generally reflect soft errors that

can be ignored without harm by many applications. It

has been suggested that these error report calls should

default to "disabled," but this is not required.
4.2.4.2 Type-of-Service
The application layer MUST be able to specify the Type-of-

Service (TOS) for segments that are sent on a connection.

It not required, but the application SHOULD be able to

change the TOS during the connection lifetime. TCP SHOULD

pass the current TOS value without change to the IP layer,

when it sends segments on the connection.
The TOS will be specified independently in each direction on

the connection, so that the receiver application will

specify the TOS used for ACK segments.
TCP MAY pass the most recently received TOS up to the application.
DISCUSSION

Some applications (e.g., SMTP) change the nature of

their communication during the lifetime of a

connection, and therefore would like to change the TOS specification.
Note also that the OPEN call specified in RFC-793 includes

a parameter ("options") in which the caller can specify IP

options such as source route, record route, or timestamp.
4.2.4.3 Flush Call
Some TCP implementations have included a FLUSH call, which

will empty the TCP send queue of any data for which the user

has issued SEND calls but which is still to the right of the

current send window. That is, it flushes as much queued send data

as possible without losing sequence number synchronization. This is

useful for implementing the "abort output" function of Telnet.
4.2.4.4 Multihoming
The user interface outlined in sections 2.7 and 3.8 of RFC-793 needs to

be extended for multihoming. The OPEN call MUST have an optional parameter:
OPEN( ... [local IP address,] ... )
to allow the specification of the local IP address.
DISCUSSION:

Some TCP-based applications need to specify the local IP address

to be used to open a particular connection; FTP is an example.
IMPLEMENTATION:

A passive OPEN call with a specified "local IP address"

parameter will await an incoming connection request to

that address. If the parameter is unspecified, a

passive OPEN will await an incoming connection request

to any local IP address, and then bind the local IP address

of the connection to the particular address that is used.
For an active OPEN call, a specified "local IP address" parameter

will be used for opening the connection. If the parameter is

unspecified, the networking software will choose an appropriate

local IP address (see Section 3.3.4.2) for the connection.
4.2.5 TCP REQUIREMENT SUMMARY
-------------------------------------------------|--------|-|-|-|-|-|--

Push flag | | | | | | |

Aggregate or queue un-pushed data |4.2.2.2 | | |x| | |

Sender collapse successive PSH flags |4.2.2.2 | |x| | | |

SEND call can specify PUSH |4.2.2.2 | | |x| | |

If cannot: sender buffer indefinitely |4.2.2.2 | | | | |x|

If cannot: PSH last segment |4.2.2.2 |x| | | | |

Notify receiving ALP of PSH |4.2.2.2 | | |x| | |1

Send max size segment when possible |4.2.2.2 | |x| | | |

| | | | | | |

Window | | | | | | |

Treat as unsigned number |4.2.2.3 |x| | | | |

Handle as 32-bit number |4.2.2.3 | |x| | | |

Shrink window from right |4.2.2.16| | | |x| |

Robust against shrinking window |4.2.2.16|x| | | | |

Receiver's window closed indefinitely |4.2.2.17| | |x| | |

Sender probe zero window |4.2.2.17|x| | | | |

First probe after RTO |4.2.2.17| |x| | | |

Exponential backoff |4.2.2.17| |x| | | |

Allow window stay zero indefinitely |4.2.2.17|x| | | | |

Sender timeout OK conn with zero wind |4.2.2.17| | | | |x|

| | | | | | |

Urgent Data | | | | | | |

Pointer points to last octet |4.2.2.4 |x| | | | |

Arbitrary length urgent data sequence |4.2.2.4 |x| | | | |

Inform ALP asynchronously of urgent data |4.2.2.4 |x| | | | |1

ALP can learn if/how much urgent data Q'd |4.2.2.4 |x| | | | |1

| | | | | | |

TCP Options | | | | | | |

Receive TCP option in any segment |4.2.2.5 |x| | | | |

Ignore unsupported options |4.2.2.5 |x| | | | |

Cope with illegal option length |4.2.2.5 |x| | | | |

Implement sending & receiving MSS option |4.2.2.6 |x| | | | |

Send MSS option unless 536 |4.2.2.6 | |x| | | |

Send MSS option always |4.2.2.6 | | |x| | |

Send-MSS default is 536 |4.2.2.6 |x| | | | |

Calculate effective send seg size |4.2.2.6 |x| | | | |

| | | | | | |

TCP Checksums | | | | | | |

Sender compute checksum |4.2.2.7 |x| | | | |

Receiver check checksum |4.2.2.7 |x| | | | |

| | | | | | |

Use clock-driven ISN selection |4.2.2.9 |x| | | | |

| | | | | | |

Opening Connections | | | | | | |

Support simultaneous open attempts |4.2.2.10|x| | | | |

SYN-RCVD remembers last state |4.2.2.11|x| | | | |

Passive Open call interfere with others |4.2.2.18| | | | |x|

Function: simultan. LISTENs for same port |4.2.2.18|x| | | | |

Ask IP for src address for SYN if necc. |4.2.3.7 |x| | | | |

Otherwise, use local addr of conn. |4.2.3.7 |x| | | | |

OPEN to broadcast/multicast IP Address |4.2.3.14| | | | |x|

Silently discard seg to bcast/mcast addr |4.2.3.14|x| | | | |

| | | | | | |

Closing Connections | | | | | | |

RST can contain data |4.2.2.12| |x| | | |

Inform application of aborted conn |4.2.2.13|x| | | | |

Half-duplex close connections |4.2.2.13| | |x| | |

Send RST to indicate data lost |4.2.2.13| |x| | | |

In TIME-WAIT state for 2xMSL seconds |4.2.2.13|x| | | | |

Accept SYN from TIME-WAIT state |4.2.2.13| | |x| | |

| | | | | | |

Retransmissions | | | | | | |

Jacobson Slow Start algorithm |4.2.2.15|x| | | | |

Jacobson Congestion-Avoidance algorithm |4.2.2.15|x| | | | |

Retransmit with same IP ident |4.2.2.15| | |x| | |

Karn's algorithm |4.2.3.1 |x| | | | |

Jacobson's RTO estimation alg. |4.2.3.1 |x| | | | |

Exponential backoff |4.2.3.1 |x| | | | |

SYN RTO calc same as data |4.2.3.1 | |x| | | |

Recommended initial values and bounds |4.2.3.1 | |x| | | |

| | | | | | |

Generating ACK's: | | | | | | |

Queue out-of-order segments |4.2.2.20| |x| | | |

Process all Q'd before send ACK |4.2.2.20|x| | | | |

Send ACK for out-of-order segment |4.2.2.21| | |x| | |

Delayed ACK's |4.2.3.2 | |x| | | |

Delay < 0.5 seconds |4.2.3.2 |x| | | | |

Every 2nd full-sized segment ACK'd |4.2.3.2 |x| | | | |

Receiver SWS-Avoidance Algorithm |4.2.3.3 |x| | | | |

| | | | | | |

Sending data | | | | | | |

Configurable TTL |4.2.2.19|x| | | | |

Sender SWS-Avoidance Algorithm |4.2.3.4 |x| | | | |

Nagle algorithm |4.2.3.4 | |x| | | |

Application can disable Nagle algorithm |4.2.3.4 |x| | | | |

| | | | | | |

Connection Failures: | | | | | | |

Negative advice to IP on R1 retxs |4.2.3.5 |x| | | | |

Close connection on R2 retxs |4.2.3.5 |x| | | | |

ALP can set R2 |4.2.3.5 |x| | | | |1

Inform ALP of R1<=retxs
Recommended values for R1, R2 |4.2.3.5 | |x| | | |

Same mechanism for SYNs |4.2.3.5 |x| | | | |

R2 at least 3 minutes for SYN |4.2.3.5 |x| | | | |

| | | | | | |

Send Keep-alive Packets: |4.2.3.6 | | |x| | |

- Application can request |4.2.3.6 |x| | | | |

- Default is "off" |4.2.3.6 |x| | | | |

- Only send if idle for interval |4.2.3.6 |x| | | | |

- Interval configurable |4.2.3.6 |x| | | | |

- Default at least 2 hrs. |4.2.3.6 |x| | | | |

- Tolerant of lost ACK's |4.2.3.6 |x| | | | |

| | | | | | |

IP Options | | | | | | |

Ignore options TCP doesn't understand |4.2.3.8 |x| | | | |

Time Stamp support |4.2.3.8 | | |x| | |

Record Route support |4.2.3.8 | | |x| | |

Source Route: | | | | | | |

ALP can specify |4.2.3.8 |x| | | | |1

Overrides src rt in datagram |4.2.3.8 |x| | | | |

Build return route from src rt |4.2.3.8 |x| | | | |

Later src route overrides |4.2.3.8 | |x| | | |

| | | | | | |

Receiving ICMP Messages from IP |4.2.3.9 |x| | | | |

Dest. Unreach (0,1,5) => inform ALP |4.2.3.9 | |x| | | |

Dest. Unreach (0,1,5) => abort conn |4.2.3.9 | | | | |x|

Dest. Unreach (2-4) => abort conn |4.2.3.9 | |x| | | |

Source Quench => slow start |4.2.3.9 | |x| | | |

Time Exceeded => tell ALP, don't abort |4.2.3.9 | |x| | | |

Param Problem => tell ALP, don't abort |4.2.3.9 | |x| | | |

| | | | | | |

Address Validation | | | | | | |

Reject OPEN call to invalid IP address |4.2.3.10|x| | | | |

Reject SYN from invalid IP address |4.2.3.10|x| | | | |

Silently discard SYN to bcast/mcast addr |4.2.3.10|x| | | | |

| | | | | | |

TCP/ALP Interface Services | | | | | | |

Error Report mechanism |4.2.4.1 |x| | | | |

ALP can disable Error Report Routine |4.2.4.1 | |x| | | |

ALP can specify TOS for sending |4.2.4.2 |x| | | | |

Passed unchanged to IP |4.2.4.2 | |x| | | |

ALP can change TOS during connection |4.2.4.2 | |x| | | |

Pass received TOS up to ALP |4.2.4.2 | | |x| | |

FLUSH call |4.2.4.3 | | |x| | |

Optional local IP addr parm. in OPEN |4.2.4.4 |x| | | | |

-------------------------------------------------|--------|-|-|-|-|-|--

FOOTNOTES:
(1) "ALP" means Application-Layer program.
5. REFERENCES

[INTRO:1] "Requirements for Internet Hosts -- Application and Support,"

IETF Host Requirements Working Group, R. Braden, Ed., RFC-1123, October 1989.

[INTRO:2] "Requirements for Internet Gateways," R. Braden and J. Postel, RFC-1009, June 1987.

[INTRO:3] "DDN Protocol Handbook," NIC-50004, NIC-50005, NIC-50006, SRI International, Dec 1985.

[INTRO:4] "Official Internet Protocols," J. Reynolds and J. Postel, RFC-1011, May 1987.

[INTRO:5] "Protocol Document Order Information," O. Jacobsen and J. Postel, RFC-980, March 1986.

[INTRO:6] "Assigned Numbers," J. Reynolds and J. Postel, RFC-1010, May 1987.

[INTRO:7] "Modularity and Efficiency in Protocol Implementations," D. Clark, RFC-817, July 1982.

[INTRO:8] "The Structuring of Systems Using Upcalls," D. Clark, 10th ACM

SOSP, Orcas Island, Washington, December 1985.

[INTRO:9] "A Protocol for Packet Network Intercommunication," V. Cerf

and R. Kahn, IEEE Transactions on Communication, May 1974.

[INTRO:10]"The ARPA Internet Protocol," J. Postel, C. Sunshine, and D.

Cohen, Computer Networks, Vol. 5, No. 4, July 1981.

[INTRO:11]"The DARPA Internet Protocol Suite," B. Leiner, J. Postel, R. Cole and D. Mills,

Proceedings INFOCOM 85, IEEE, Washington DC, IEEE Communications Magazine, March 1985.

[INTRO:12]"Protocol for Providing the Connectionless Mode Network Service," RFC-994, March 1986.

[INTRO:13]"End System to Intermediate System Routing Exchange Protocol," RFC-995, April 1986.

[LINK:1] "Trailer Encapsulations," S. Leffler and M. Karels, RFC-893, April 1984.

[LINK:2] "An Ethernet Address Resolution Protocol," D. Plummer, RFC-826, November 1982.

[LINK:3] "A Standard for the Transmission of IP Datagrams over Ethernet

Networks," C. Hornig, RFC-894, April 1984.

[LINK:4] "A Standard for the Transmission of IP Datagrams over IEEE 802

"Networks," J. Postel and J. Reynolds, RFC-1042, February 1988.

[IP:1] "Internet Protocol (IP)," J. Postel, RFC-791, September 1981.

[IP:2] "Internet Control Message Protocol (ICMP)," J. Postel, RFC-792, September 1981.

[IP:3] "Internet Standard Subnetting Procedure," J. Mogul and J. Postel, RFC-950, August 1985.

[IP:4] "Host Extensions for IP Multicasting," S. Deering, RFC-1112, August 1989.

[IP:5] "Military Standard Internet Protocol," MIL-STD-1777, Department of Defense, August 1983.

[IP:6] "Some Problems with the Specification of the Military Standard

Internet Protocol," D. Sidhu, RFC-963, November 1985.

[IP:7] "The TCP Maximum Segment Size and Related Topics," J. Postel, RFC-879, November 1983.

[IP:8] "Internet Protocol Security Options," B. Schofield, RFC-1108, October 1989.

[IP:9] "Fragmentation Considered Harmful," C. Kent and J. Mogul, ACM

SIGCOMM-87, August 1987. Published as ACM Comp Comm Review, Vol. 17, no. 5.

[IP:10] "IP Datagram Reassembly Algorithms," D. Clark, RFC-815, July 1982.

[IP:11] "Fault Isolation and Recovery," D. Clark, RFC-816, July 1982.

[IP:12] "Broadcasting Internet Datagrams in the Presence of Subnets," J.Mogul, RFC-922, Oct 1984.

[IP:13] "Name, Addresses, Ports, and Routes," D. Clark, RFC-814, July 1982.

[IP:14] "Something a Host Could Do with Source Quench: The Source Quench

Introduced Delay (SQUID)," W. Prue and J. Postel, RFC-1016, July 1987.

[UDP:1] "User Datagram Protocol," J. Postel, RFC-768, August 1980.

[TCP:1] "Transmission Control Protocol," J. Postel, RFC-793, September 1981.

[TCP:2] "Transmission Control Protocol," MIL-STD-1778, US Department of Defense, August 1984.

[TCP:3] "Some Problems with the Specification of the Military Standard

Transmission Control Protocol," D. Sidhu and T. Blumer, RFC-964, November 1985.

[TCP:4] "The TCP Maximum Segment Size and Related Topics," J. Postel, RFC-879, November 1983.

[TCP:5] "Window and Acknowledgment Strategy in TCP," D. Clark, RFC-813, July 1982.

[TCP:6] "Round Trip Time Estimation," P. Karn & C. Partridge, ACM SIGCOMM-87, August 1987.

[TCP:7] "Congestion Avoidance and Control," V. Jacobson, ACM SIGCOMM-88, August 1988.

[TCP:8] "Modularity and Efficiency in Protocol Implementation," D. Clark, RFC-817, July 1982.

[TCP:9] "Congestion Control in IP/TCP," J. Nagle, RFC-896, January 1984.

[TCP:10] "Computing the Internet Checksum," R. Braden, RFC-1071, Sep 1988.

[TCP:11] "TCP Extensions for Long-Delay Paths," V. Jacobson & R. Braden, RFC-1072, October 1988.

 Наиболее употребляемый термин в Internet-сообществе при обозначении сетевого программно-аппаратного

комплекса (ПАК), имеющего общесетевой IP-адрес. Хостинг (hosting) — предоставление (на возмездной или

безвозмездной основе) компанией (сетевым провайдером) некоторой части ресурсов собственных ПАК

пользователю для размещения последним своих прикладных систем и/или данных.

 В дальнейшем с целью установления строгой однозначности в рамках Internet-архитектуры будут

использоваться термины: “сообщение” — единица данных протокола прикладного уровня; “блок” — единица

данных протокола транспортного уровня; “пакет” — единица данных протокола сетевого (IP-)уровня;

кадр” — единица данных протокола канального уровня. Если IP-пакет доставляет UDP-блок(дейтаграмму),

то он может назваться “IP-дейтаграммой”.

 Символ “-1” означает, что все биты поля единицы.
1   2   3   4   5   6   7   8   9   10   11


написать администратору сайта