
304 Часть III. Web-протоколы
• Соединение все еще открыто. Предположим, что повторный пакет приходит,
пока соединение еыде открыто. Получатель смотрит помер пакета и находит,
что эти данные уже были получены. Получатель отбрасывает такой пакет.
• Соединение было закрыто и нет нового соединения. Предположим, что ста-
рое соединение было закрыто, а новое соединение не было установлено. Когда
пакет приходит, операционная система получателя просматривает номера
портов TCP в заголовке пакета, чтобы определить, к какому соединению он
относится. Не найдя такого соединения, получатель также отбрасывает пакет.
• Соединение было закрыто, а новое соединение создано. Предположим, что
соединение было закрыто, и компьютеры создали повое соединение с той же
парой номеров портов. Когда повторный пакет прибывает, номера портов ана-
лизируются операционной системой получателя. Номера портов пакета совпа-
дают с номерами портов нового соединения, и данные передаются приложе-
нию,
связанному с новым соединением. Это ошибочно, так как этот пакет не
принадлежит новому соединению.
Чтобы получатель не ассоциировал повторный пакет с другим приложением,
оба компьютера должны избегать создания нового соединения с теми же самыми
номерами портов, по крайней мере, в течение некоторого промежутка времени по-
сле закрытия предыдущего соединения.
Чтобы предотвратить создание нового соединения с теми же номерами портов,
хотя бы один из компьютеров должен помнить о существовании предыдущего со-
единения. Спецификация TCP возлагает эту обязанность на компьютер, который
первым послал пакет FIN. На этом компьютере ТСР-соедипепие переходит в со-
стояние TIME_WAIT. Операционная система сохраняет информацию, связанную
с соединением, чтобы в случае необходимости повторно передать заключительный
пакет АСК и предотвратить создание нового соединения с теми же номерами пор-
тов.
Соединение должно оставаться в состоянии TIME_WAIT столько времени,
сколько нужно для того, чтобы в сети не осталось пи одного пакета, принадлежа-
щего данному соединению. Выполнить это очень сложно, так как протокол IP не
вводит ограничений па время пребывания пакета в пути. На практике поле в заго-
ловке IP-пакета, содержащее время его жизни (TTL), должно ограничивать время
пребывания пакета в сети, как это описано в главе 5 (раздел 5.1.4). Это 8-битпое
поле позволяет задавать максимальное значение TTL в 255 секунд.
TCP требует, чтобы компьютер оставался в состоянии TIME_WAIT в течение
двух периодов максимального времени жизни сегмента (MSL — maximum segment
lifetime) — оценки времени наибольшей задержки при доставке пакетов. В специ-
фикации TCP указывается, что реализации протокола должны использовать значе-
ние MSL, равное двум минутам [J.81J, хотя на практике различные реализации ис-
пользуют 30 секунд, одну минуту или две минуты. С одной стороны, малое значе-
ние MSL уменьшает длительность состояния TIME_WAIT, что в свою очередь
уменьшает объем системных ресурсов, необходимых для хранения информации о
закрытых соединениях. Однако небольшое значение MSL увеличивает вероятность
того,
что повторные пакеты остаются в сети. Кроме того, небольшое значение MSL
уменьшает вероятность того, что отправитель сумеет повторно выслать утерянный
заключительный пакет АСК. С другой стороны большое значение MSL приводит
к тому, что состояние TIME_WAIT длится дольше. В результате, достаточно много
соединений могут оказаться в состоянии TIME_WAIT одновременно, что приво-
дит к увеличению требований к системным ресурсам на сильно загруженном сер-
вере.
Необходимо также отметить, что большие значения MSL ограничивают ско-
рость взаимодействия между компьютерами.