Теперь, представив состояние соединения TCP, его конечный автомат и его пространство последовательности, мы можем начать исследовать реализацию протокола в FreeBSD. Несколько аспектов реализации протокола зависят от общего состояния соединения.
Состояние соединения TCP, состояние вывода и изменения состояния соединения зависят от внешних событий и таймеров. Обработка TCP происходит в ответ на одно из трех событий.
- Запроса от пользователя, такого, как отправка данных, удаление данных из приемного буфера сокета или открытия или закрытия и состояния соединения.
- Приема пакета для соединения.
- Истечения времени таймера.
Эти события обрабатываются в процедурах tcp_usr_send(), tcp_input() и наборе процедур таймера. Каждая процедура обрабатывает текущее событие и делает все необходимые изменения в состоянии соединения. Затем для любого перехода, которому может потребоваться отправка пакета, вызывается процедура tcp_output(), чтобы сделать любой необходимый вывод.
Критерии для отправки пакета с данными или управляющей информацией сложны, и поэтому политика отправки алгоритмов TCP является самой интересной и важной частью реализации протокола. Например, в зависимости от параметров управления состоянием соединения и потоком для соединения любое из следующего может позволить отправить данные, которые не могли быть отправлены ранее.
- Пользовательский вызов отправки помещает в очередь отправки новые данные.
- Прием обновления окна от другого узла.
- Истечение срока таймера повторной передачи.
- Истечение срока таймера обновления окна.
Кроме того, процедура tcp_output() может решить отправить пакет с управляющей информацией, даже если данные не могут быть отправлены, по любой из следующих причин.
- Изменение в состоянии соединения (например, запрос открытия, запрос закрытия).
- Получение данных, которые должны быть подтверждены.
- Изменение приемного окна из-за удаления данных из приемной очереди.
- Запрос отправки со срочными данными.
- Разрыв соединения.
Большинство этих решений мы более подробно рассмотрим после описания использующихся состояний и таймеров. Мы начнем с алгоритмов, использующихся для согласования во времени, установки соединения и отключения; они распределены по разным местам кода. Мы продолжим описание обработки нового ввода и обзора обработки и алгоритмов вывода.