Справочник по сетевым протоколам

       

Концепция периода молчания в протоколе TCP


Данная спецификация ставит условие что компьютеры, потерпевшие крах с потерей всей информации о последних номерах очередей, передаваемых по открытым (т.е. не закрытым специальной командой) соединениям, будут воздерживаться от посылки каких-либо TCP сегментов в течении по крайней мере максимального времени жизни сегмента (Maximum Segment Lifetime - MSL) в системе Internet, чей частью и является данный хост. В последующих параграфах приводится объяснение для этой спецификации. Некоторые реализации протокола TCP могут нарушать соглашение о периоде молчания, рискуя при этом тем, что некоторые получатели в системе Internet будут воспринимать старые данные как новые, или новые данные будут отброшены словно дубликаты в действительности устаревших сегментов.

Программы протокола используют новые номер очереди всякий раз, когда какой-либо сегмент формируется и помещается на хосте в очередь отправления по сети. Процедура фиксирования дубликатов и алгоритм очереди в протоколе TCP полагаются на уникальное связывание данных сегмента с местом в очереди. Номера очереди не успевают пройти весь диапазон в 2**32 значения, прежде чем связанные с ними данные из отправленного сегмента получат подтверждение от получателя, а все копии-дубликаты упомянутого сегмента покинут сеть Internet. Без этого условия можно предположить, что двум отдельным TCP сегментам могут быть назначены одинаковые или перекрывающиеся номера, что вызовет проблему у получателя при определении, какие данные являются новыми, а какие устаревшими. Напомним, что каждый сегмент привязан как ко множеству следующих друг за другом номеров очереди, так и к имеющимся в этом сегменте октетам данных.

При обычных условиях программы TCP отслеживают текущий номер очереди, подлежащий отправке, а также самое старое из ожидаемый подтверждений, что позволяет избежать ошибочного использования номера очереди, прежде чем будет получено подтверждение от более раннего использования этого же номера. Одно это не гарантирует, что старые данные - дубликаты будут удалены из сети, поэтому номера очереди сделаны очень большими, чтобы уменьшить вероятность того, что странствующие по сети дубликаты вызовут сбой по прибытии. При скорости обмена 2 мегабайта/сек очереди в 2**32 октета хватает на 4.5 часа. Поскольку максимальное время жизни сегмента в сети вряд ли превышает несколько десятков секунд, это считается достаточной защитой для будущих сетей, даже если скорости передачи данных возрастут до десятков мегабит/сек.

При скорости 100 мегабит/сек один цикл использования всех номеров очереди составляет 5.4 минуты, что может быть достаточно мало, но еще остается приемлемым.

Однако основной механизм регистрации дублей и поддержания очередей может быть отменен, если программа протокола TCP, посылающая данные, не имеет места в памяти для хранения номеров в очереди, которые она использовала в последний раз для конкретного соединения. Например, если программа TCP при создании всех соединений начинает с номера очереди 0, то при сбое и повторном запуске программа TCP может повторно сформировать прежнее соединение (возможно, после анализа наполовину открытого соединения) и послать по нему пакеты, чьи номера в очереди полностью совпадают или лишь частично перекрывают номера пакетов, которые еще присутствуют в сети и были отправлены предыдущей реализацией этого же соединения. В отсутствие сведений о номерах очереди, прежде использовавшихся для передачи информации по данному конкретному соединению, спецификация протокола TCP рекомендует отправителю воздержаться на MSL секунд от посылки сегментов по этому со единению, что даст возможность сегментам, запущенным в сеть старой реализацией соединения, покинуть систему.

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

В качестве примера предположим, что соединение открыто со стартовым номером очереди S. Предположим также, что это соединение используется не столь часто и возможно, функция определения исходного номера очереди (ISN(t)) принимает значение (скажем, S1), равное номеру последнего сегмента, отправленного данной программой TCP, по этому конкретному соединению, Теперь предположим, что именно в этот момент хост-компьютер дал сбой, восстановился и устанавливает новую реализацию этого соединения. Первоначальный номер очереди при этом будет S1=ISN(t), а это последний номер очереди в старой реализации соединения! Если восстановление произойдет достаточно быстро, то старые дубликаты, созданные с номером очереди, близким к номеру S1, могут быть получены своим адресатом и обработаны так, как будто бы это новые пакеты в новой реализации соединения.

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

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

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

Итак, каждый отправленный сегмент занимает один или несколько номеров в очереди ожидания. Номера, отведенные под сегмент, являются "занятыми" или "в работе", пока не истекут MSL секунд. При сбое определенное место в очереди в течении определенного времени продолжает оставаться занятым октетами из последнего отправленного сегмента. Если вскоре создается новое соединение и оно использует какие-либо номера из очереди в момент, когда ими еще пользуется сегмент из предыдущей реализации соединения, то следовательно эта область перекрывания номеров очередей может являться причиной проблем у получателя. <



Содержание раздела