TCP

Протокол управления передачей

Прототип:

#include <sys/socket.h>
#include <netinet/in.h>
int socket( AF_INET,
SOCK_STREAM,
0 );

Описание:

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

TCP использует стандартный формат Интернет-адресов, а также предоставляет набор «адресов портов» для каждого хоста. Таким образом, каждый адрес состоит из Интернет-адреса, определяющего хост и сеть, с конкретным TCP-портом на хосте, идентифицирующим пира.

Сокеты, использующие протокол TCP, могут быть active или passive. Активные сокеты инициируют подключения к пассивным сокетам. По умолчанию сокеты TCP создаются активными.

Для создания пассивного сокета, необходимо привязать сокет при помощи системного вызова bind(), затем вызвать listen(). Только пассивные сокеты могут использовать вызов accept() для принятия входящих соединений; только активные сокеты могут использовать вызов connect() для инициирования соединений.

Пассивные сокеты могут «занижать» свое местоположение, чтобы соответствовать входящим запросам на соединение из нескольких сетей. С помощью этого метода, называемого адресацией с подстановочными знаками (wildcard addressing), один сервер может предоставлять услуги клиентам в нескольких сетях. Если требуется создать сокет, который прослушивает все сети, необходимо привязать интернет-адрес INADDR_ANY. В это время также можно указать TCP-порт. Если порт не указан, система его назначает самостоятельно.

После того, как соединение установлено, адрес сокета фиксируется местоположением пира. Адрес, назначенный сокету - это адрес, связанный с сетевым интерфейсом, через который пакеты передаются и принимаются. Обычно этот адрес соответствует сети пира.

TCP поддерживает несколько вариантов сокетов (определенных в <netinet/tcp.h>) которые можно задать при помощи setsockopt() и получить при помощи getsockopt(). Уровень опций для этих вызовов - это номер протокола для TCP, доступный из getprotobyname().

TCP_NODELAY
В большинстве случаев TCP отправляет данные, когда они представлены. Когда незавершенные данные еще не подтверждены, TCP собирает небольшие объемы выходных данных для отправки в одном пакете после получения подтверждения.

Для некоторых клиентов (таких как оконные системы, которые отправляют поток событий мыши, которые не получают ответов), такая пакетизация может вызвать значительные задержки. Поэтому, TCP предоставляет логическую опцию TCP_NODELAY, чтобы обойти этот алгоритм.
TCP_MAXSEG
Максимальный размер сегмента (MSS) для TCP-соединения. Возвращаемое значение - это максимальный объем данных, который TCP отправляет на другой конец соединения. Если это значение выбирается до подключения сокета, возвращаемое значение является значением по умолчанию, которое используется, если опция MSS не получена с другого конца соединения.
TCP_KEEPALIVE
Задает время простоя в секундах для соединения, прежде чем TCP начнет отправлять сигналы проверки активности соединения. Значение по умолчанию - 2 часа. Этот параметр действует, только если установлен параметр сокета SO_KEEPALIVE.

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

Возвращаемое значение:

Дескриптор сокета. Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

EADDRINUSE
Произведена попытка создать сокет с уже выделенным портом.
EADDRNOTAVAIL
Произведена попытка создать сокет с сетевым адресом, для которого не существует сетевого интерфейса.
ECONNREFUSED
Удаленный узел отказал в установлении соединения (как правило потому, что ни один процесс не прослушивал порт).
ECONNRESET
Удаленный узел принудительно разорвал соединение.
EISCONN
Произведена попытка установить соединение с сокетом, в котором он уже есть.
ENOBUFS
Системе не хватило памяти для внутренней структуры данных.
ETIMEDOUT
Соединение было прервано из-за чрезмерного количества повторных передач.

Тематические ссылки:

IP protocol

accept(), bind(), connect(), getprotobyname(), getsockopt(), listen(), setsockopt(), socket()

Основано на RFC 793




Предыдущий раздел: Описание API сетевой библиотеки