Транспортных протоколов в TCP/IP два — это TCP (Transmission Control Protocol, протокол управления соединением) и UDP (User Datagram Protocol). UDP устроен просто. Пользовательские данные помещаются в единственный транспортный пакет-датаграмму, которой приписываются обычные для транспортного уровня данные: адреса и порты отправителя и получателя, после чего пакет уходит в сеть искать адресата. Проверять, был ли адресат способен этот пакет принять, дошёл ли пакет до него и не испортился ли по дороге, предоставляется следующему — прикладному — уровню.
Иное дело — TCP. Этот протокол очень заботится о том, чтоюы передаваемые данные дошли до адресата в целости и сохранности. Для этого предпринимаются следующие действия:
- Устанавливается соединение
- Перед тем, как начать передавать данные, TCP проверяет, способен ли адресат их принимать. Если адресат отвечает согласием на открытие соединения, устанавливается двусторонняя связь между ним и отправителем. Помимо адресов отправителя и адресата и номеров порта на отправителе и адресате, в TCP-соединении участвуют два номера последовательности (SEQuential Number, SEQN), с помощью которых каждая сторона проверяет, не потерялись ли пакеты по пути, не перепутались ли.
- Обрабатываются подтверждения
- Двусторонняя связь нужна ещё и потому, что на каждый TCP-пакет с любой стороны требуется подтверждение того, что этот пакет принят. Упрощённо можно представить дело так, что отправитель и адресат по очереди обмениваются пакетами, каждый из которых содержит подтверждение только что принятого, и, возможно, полезные данные. Если происходит какая-то ошибка, она возвращается вместо подтверждения и отправитель обрабатывает её (например, поcылает пакет ещё раз).
- Отслеживаются состояния абонентов
- С первым же подтверждением каждый из абонентов передаёт размер т. н. скользящего окна (sliding window). Этот размер показывает, сколько ещё данных готов принять адресат. Отправитель посылает сразу несколько пакетов суммарным размером с это окно, а после ждёт подтверждения об их принятии. Когда приходит подтверждение первого из пакетов в окне, окно «скользит» вперёд: теперь оно начинается со второго пакета, и в него попадает один или несколько ещё не посланных пакетов. Если адресат может принять больше данных, он сообщает о большем размере окна, а если данные перерабатываться не успевают — о меньшем.
Кажется, что TCP — протокол по всем статьям удобнее UDP. Однако в случаях, когда пользовательские данные всегда помещаются в один пакет, зато самих пакетов идёт очень много, посылать всего одну датаграмму намного выгоднее, чем всякий раз устанавливать соединение, пересылать данные и закрывать соединение (что как минимум требует по три пакета в каждую сторону). Очень трудно использовать TCP для широковещательных передач, когда число абонентов-адресатов весьма велико или вовсе неизвестно. Посмотреть параметры всех передаваемых через сетевой интерфейс пакетов можно с помощью команды tcpdump -pi интерфейс>
, хотя Мефодию не хватило поверхностного знания TCP/IP для того, чтобы понять выдачу этой команды.