Кроме того, SCRIPT поддерживает множественную адресацию, что позволяет единственной конечной точке SCRIPT иметь несколько IP-адресов. Эта функция обеспечивает дополнительную устойчивость в случае отказов сети. Конечная точка может иметь избыточные IP-адреса, каждый из которых может соответствовать собственному соединению с инфраструктурой Интернета. В такой конфигурации SCRIPT позволит обойти проблему, возникшую на одном из адресов, благодаря переключению на другой адрес, заранее связанный с соответствующей ассоциацией SCRIPT.
ПРИМЕЧАНИЕПодобной устойчивости можно достичь и с TCP, если воспользоваться протоколами маршрутизации. Например, BGP-соединения внутри домена (iBGP) часто используют адреса, назначаемые виртуальному интерфейсу маршрутизатора в качестве конечных точек соединения TCP. Протокол маршрутизации домена гарантирует, что если между двумя маршрутизаторами будет хоть какой-то доступный путь, он будет использован, что было бы невозможно, если бы используемые адреса принадлежали интерфейсу в сети, где возникли проблемы. Функция множественной адресации SCRIPT позволяет узлам (а не только маршрутизаторам) использовать аналогичный подход, причем даже с подключениями через разных провайдеров, что невозможно при использовании TCP с маршрутизацией.
2.6. Установление и завершение соединения TCP
перехода состояний TCP.
Трехэтапное рукопожатие
1. Сервер должен быть подготовлен для того, чтобы принять входящее соединение. Обычно это достигается вызовом функций socket, bindи listenи называется пассивным открытием ( passive open ).
2. Клиент выполняет активное открытие ( active open ), вызывая функцию connect. Это заставляет клиента TCP послать сегмент SYN (от слова synchronize синхронизировать), чтобы сообщить серверу начальный порядковый номер данных, которые клиент будет посылать по соединению. Обычно с сегментом SYN не посылается никаких данных: он содержит только заголовок IP, заголовок TCP и, возможно, параметры TCP (о которых мы вскоре поговорим).
3. Сервер должен подтвердить получение клиентского сегмента SYN, а также должен послать свой собственный сегмент SYN, содержащий начальный порядковый номер для данных, которые сервер будет посылать по соединению. Сервер посылает SYN и ACK подтверждение приема (от слова acknowledgment) клиентского SYN в виде единого сегмента.
4. Клиент должен подтвердить получение сегмента SYN сервера.
Для подобного обмена нужно как минимум три пакета, поэтому он называется трехэтапным рукопожатием TCP ( TCP three-way handshake ). На рис. 2.2 представлена схема такого обмена.
Рис. 2.2. Трехэтапное рукопожатие TCP
Мы обозначаем начальный порядковый номер клиента как J , а начальный порядковый номер сервера как K . Номер подтверждения в сегменте ACK это следующий предполагаемый порядковый номер на том конце связи, который отправил сегмент ACK. Поскольку сегмент SYN занимает 1 байт пространства порядковых номеров, номер подтверждения в сегменте ACK каждого сегмента SYN это начальный порядковый номер плюс один. Аналогично сегмент ACK каждого сегмента FIN это порядковый номер сегмента FIN плюс один.
ПРИМЕЧАНИЕПовседневной аналогией установления соединения TCP может служить система телефонной связи [81]. Функция socket эквивалентна включению используемого телефона. Функция bind дает возможность другим узнать ваш телефонный номер, чтобы они могли позвонить вам. Функция listen включает звонок, и вы можете услышать, когда происходит входящий звонок. Функция connect требует, чтобы мы знали чей-то номер телефона и могли до него дозвониться. Функция accept аналогия ответа на входящий звонок. Получение идентифицирующих данных, возвращаемых функцией accept (где идентифицирующие данные это IP-адрес и номер порта клиента), аналогично получению информации, идентифицирующей вызывающего по телефону его телефонного номера. Однако имеется отличие, и состоит оно в том, что функция accept возвращает идентифицирующие данные клиента только после того, как соединение установлено, тогда как во время телефонного звонка после указания номера телефона звонящего мы можем выбрать, отвечать на звонок или нет. Служба DNS (см. главу 11) предоставляет сервис, аналогичный телефонной книге. Вызов getaddrinfo поиск телефонного номера в книге; getnameinfo поиск имени по телефонному номеру (правда, такая книга должна быть отсортирована по номерам, а не по именам).
Параметры TCP
Параметр MSS . Этот параметр TCP позволяет узлу, отправляющему сегмент SYN, объявить свой максимальный размер сегмента (maximum segment size, MSS) максимальное количество данных, которое он будет принимать в каждом сегменте TCP на этом соединении. Мы покажем, как получить и установить этот параметр TCP с помощью параметра сокета TCP_MAXSEG(см. раздел 7.9).
Параметр масштабирования окна ( Window scale option ). Максимальный размер окна, который может быть установлен в заголовке TCP, равен 65 535, поскольку соответствующее поле занимает 16 бит. Но высокоскоростные соединения (45 Мбит/с и больше, как описано в документе RFC 1323 [53]) или линии с большой задержкой (спутниковые сети) требуют большего размера окна для получения максимально возможной пропускной способности. Этот параметр, появившийся не так давно, определяет, что объявленная в заголовке TCP величина окна должна быть отмасштабирована сдвинута влево на 0-14 разрядов, предоставляя максимально возможное окно размером почти гигабайт (65 535 × 2 14). Для использования параметра масштабирования окна в соединении необходима его поддержка обоими связывающимися узлами. Мы увидим, как задействовать этот параметр с помощью параметра сокета SO_RCVBUF(см. раздел 7.5).