Наконец мы готовы исследовать самую интересную часть реализации TCP: политику отправки. Как мы видели ранее, TCP-пакет содержит подтверждение и поле окна, а также данные, и один пакет может быть отправлен, если любое из этих трех полей изменится. Простая политика отправки TCP могла бы отправить значительно больше пакетов, чем нужно.
Сетевые протоколы
Система FreeBSD поддерживает несколько основных коммуникационных доменов, включая IPv4, IPv6, Xerox Network Systems (NS), ISO/OSI и локальный домен (известный ранее как домен UNIX). Локальный домен не включает сетевые протоколы, поскольку он работает всецело внутри одной системы.
Набор протоколов IPv4 был первым набором протоколов, реализованным в рамках сетевой архитектуры 4.2BSD. Вслед за выпуском 4.2BSD в рамках сетевой архитектуры производителями было реализовано несколько собственных семейств протоколов. Однако лишь с добавлением протоколов Xerox NS в 4.3BSD была явно продемонстрирована способность системы поддерживать множество семейств сетевых протоколов.
Хотя некоторые части интерфейса протоколов раньше не использовались и поэтому не были реализованы, изменения, потребовавшиеся для добавления второго семейства сетевых протоколов, не изменили существенным образом сетевую архитектуру. Реализация сетевых протоколов ISO/OSI, а также другие меняющиеся требования привели к дальнейшему усовершенствованию сетевой архитектуры в 4.4BSD. Два новых протокола, которые были добавлены к системе, IPv6 и IPSec, потребовали некоторых изменений из-за необходимости их одновременного сосуществования с протоколом IPv4.
Обработка ввода TCP
Хотя обработка ввода TCP более сложна, чем обработка ввода UDP, предшествующие разделы предоставили нам основу, которая нужна для исследования реальной работы. Как всегда, входная процедура вызывается с параметрами
void tcp_input( struct mbuf *msg, int offO);
Первые несколько шагов, возможно, начинают казаться знакомыми
Отключение соединения в FreeBSD
TCP-соединение является симметричным и полнодуплексным, поэтому любая сторона может инициировать разъединение независимо. Пока одно направление соединения может передавать данные, соединение остается открытым. Сокет может указать, что он завершил отправку данных, с помощью системного вызова shutdown, который приводит к вызову процедуры tcp_usr_shutdown().
Еще статьи...
Страница 4 из 12
Сетевые протоколы