Документация по LinuxLinuxDoc.Ru 🔍

tcp - протокол TCP

НАЗВАНИЕ
tcp - протокол TCP.

СИНТАКСИС
#include
#include
tcp_socket = socket(PF_INET, SOCK_STREAM, 0);

ОПИСАНИЕ
Это реализация протокола TCP, описанного в RFC793, RFC1122
и RFC2001, с расширениями NewReno и SACK. Этот протокол
предоставляет пользователю надежное полнодуплексное
потоковое соединение двух сокетов над ip(7). TCP
гарантирует доставку данных в нужном порядке и вновь
передает потерявшиеся пакеты. Для выявления ошибок
передачи протокол генерирует и проверяет контрольные суммы
пакетов. TCP не сохраняет границы записей.

Только что созданный сокет TCP не имеет локального или
удаленного адреса и не является полностью заданным. Для
создания исходящего соединения TCP с другим сокетом TCP
используйте connect(2). Для приема новых входящих
соединений сперва подключите сокет к и порту и присвойте
ему локальный адрес с помощью bind(2), а затем вызовите
listen(2) для работы сокета в режиме прослушивания. После
этого любое входящее соединение может быть принято с
помощью accept(2). Сокет, для которого были без
погрешностей вызваны accept или connect, является
полностью заданным и может передавать данные. Данные не
могут быть переданы через слушающий или еще не соединенный
сокет.

Linux 2.2 поддерживает высокопроизводительные расширения
TCP RFC1323 TCP. Они включают в себя большой размер окон
TCP для поддержки соединений с большой задержкой или
пропускной способностью. Для их использования необходимо
увеличить размеры буферов приема и передачи. Это можно
сделать глобально с помощью sysctl-вызовов
net.core.wmem_default и net.core.rmem_default , или для
каждого сокета с помощью опций SO_SNDBUF и SO_RCVBUF .
Максимальный размер буферов сокета ограничивается с
помощью глобальных sysctl-вызовов net.core.rmem_max и
net.core.wmem_max . Дополнительная информация приведена в
socket(7).

TCP поддерживает срочные данные. Срочные данные уведомляют
приемник о том, что какое-либо важное сообщение, которое
должно быть обработано как можно скорее, является частью
потока данных. Для отправки срочных данных укажите с
помощью send(2) опцию MSG_OOB . При получении срочных
данных ядро посылает считывающему процессу или группе
процессов, заданным для сокета с помощью ioctl-вызовов
FIOCSPGRP или FIOCSETOWN , сигнал SIGURG . Если запущена
опция SO_OOBINLINE , то неотложные данные будут помещены в
обычный поток данных (и могут быть проверены с помощью
ioctl-вызова SIOCATMARK ), в противном случае они могут
быть получены, только если для sendmsg(2) установлен флаг
MSG_OOB .

ФОРМАТЫ АДРЕСОВ
TCP построен над IP (см. ip(7)). Форматы адресов,
определенные в ip(7), относятся и к TCP. TCP поддерживает
лишь point-to-point соединение; широковещательная и
многоадресная передача не поддерживаются.

РАБОТА С ИНТЕРФЕЙСОМ SYSCTLS
Доступ к нижеприведенным вызовам sysctl можно получить с
помощью файлов /proc/sys/net/ipv4/* или через интерфейс
sysctl(2). Кроме того, большинство sysctl-вызовов IP
относятся и к TCP; см. ip(7).

tcp_window_scaling
Разрешить изменение размера окна TCP (RFC1323).

tcp_sack
Разрешить RFC2018 TCP Selective Acknowledgements
(выборочные подтверждения).

tcp_timestamps
Разрешить метки времени TCP (RFC1323).

tcp_fin_timeout
Указывает на количество секунд, в течение которых
необходимо ждать последний пакет FIN до
принудительного закрытия сокета. Строго говоря, это
нарушение спецификации TCP, но оно необходимо для
предотвращения атак типа "отказ доступа к сервису".

tcp_keepalive_probes
Максимальное количество посылаемых "оживляющих"
(keep-alive) проверок перед тем, как соединение
считается разорванным. "Оживляющие" пакеты
посылаются, только если включена опция SO_KEEPALIVE
сокета.

tcp_keepalive_time
Количество секунд между отстутствием передаваемых
данных и отправкой через соединение "оживляющего"
пакета. Значение по умолчанию - 10800 секунд (3
часа).

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

tcp_stdurg
Начать интерпретацию поля с указателем срочных
данных TCP в строгом соответствии с RFC793. По
умолчанию используется совместимая с BSD
интерпретация указателя на неотложные данные,
определяющая первый байт после неотложных данных. В
соответствии с RFC793 указатель должен определять
последний байт неотложных данных. Запуск этой опции
может привести к проблемам во взаимодействии сетей.

tcp_syncookies
Включить TCP syncookies. Ядро должно быть собрано с
CONFIG_SYN_COOKIES. Syncookies защищают сокет от
перегрузки, вызываемой слишком большим количество
попыток соединения. При запуске syncookies
клиентские машины в течение короткого промежутка
времени не могут определить перегруженную машину.

tcp_max_syn_backlog
Длина посокетной очереди backlog. В Linux 2.2
значение backlog, указываемое в listen(2),
относится лишь к длине очереди backlog уже
установленных сокетов. Максимальный размер очереди
неустановленных сокетов (в состоянии SYN_RECV ) в
слушающий сокет назначается этим вызовом sysctl.
Если приходит больше запросов на соединение, то
Linux начинает "отбрасывать" пакеты. Если включены
syncookies, то посылается ответ на пакеты и это
значение игнорируется.

tcp_retries1
Определяет количество посылаемых повторно ответов
на запрос установления TCP- соединения до того, как
будет решено, что соединение установить невозможно.

tcp_retries2
Определяет, сколько раз производится повторная
передача пакета TCP, до того как соединение будет
считаться разорванным.

tcp_syn_retries
Определяет количество посылаемых удаленной стороне
начальных пакетов SYN до того, как будет возвращена
ошибка. Значение должно быть меньше 255-и. Это
ограничение - только для исходящих соединений; для
входящих количество повторных передач точно
определяется tcp_retries1.

tcp_retrans_collapse
При повторных передачах пробовать посылать
полноразмерные пакеты. Используется во избежание
ошибок некоторых стеков TCP.

ОПЦИИ СОКЕТОВ
Для считывания опций сокетов TCP используется вызов get-
sockopt(2), для установки - setsockopt(2). Значение
аргумента, принадлежащего семейству сокетов, должно быть
равно SOL_TCP. Кроме того, сокетам TCP доступны
большинство опций сокета SOL_IP. Дополнительная
информация приведена в ip(7).

TCP_NODELAY
Остановить выполнение алгоритма Nagle. Это
означает, что пакеты всегда отсылаются при первой
же возможности. При этом не возникает ненужных
задержек из-за большого количества пакетов в сети.
Ожидается целочисленный логический флаг.

TCP_MAXSEG
Установить или считывать максимальный размер
сегмента для исходящих пакетов TCP. Если эта опция
установлена до возникновения соединения, то
меняется также и значение MSS, сообщаемое другой
стороне в начальном пакете. Значения, превышающие
MTU интерфейса, игнорируются и ни на что не влияют.

TCP_CORK
Если функция запущена, то не посылать частичные
кадры. Все поставленные в очередь частичные кадры
будут отосланы, когда выполнение этой опции будет
остановлено. Это является эффективным для
подготовки заголовков перед вызовом sendfile(2) или
для оптимизации пропускной способности. Эта опция
не может совмещаться с TCP_NODELAY.

ВЫЗОВЫ IOCTL
Доступ к нижеприведенным ioctl можно получить через
ioctl(2). Синтаксис следующий:

int value;
error = ioctl(сокет_tcp, тип_ioctl, &значение);

FIONREAD or TIOCINQ
Возвращает количество непрочитанных данных в
очереди приемного буфера. Аргументом является
указатель на целое число.

SIOCATMARK
Возвращает истинное значение, если все срочные
данные уже получены программой пользователя.
Используется совместно с SO_OOBINLINE. Аргументом
является указатель на целое число, служащее
результатом проверки.

TIOCOUTQ
Возвращает количество неотправленных данных в
очереди сокета с помощью указателя на целое число.
К сожалению, реализация этого ioctl достаточно
нестабильно работает во всех известных версиях
Linux и вместо этого возвращает количество
свободного места (действительный размер буфера
минус количество байтов, использованных для
метаданных) в посылаемом запросе. Вероятно, это
будет исправлено в последующих версиях Linux. Если
вы используете TIOCOUTQ, то пожалуйста включите
тест поведения обоих этих функций для проверки их
работоспособности в последующих релизах и на других
Unix-системах.

ОБРАБОТКА ОШИБОК
При возникновении сетевой ошибки TCP пытается отправить
пакет повторно. Если в течение некоторого времени этого
сделать не удается, то возвращается либо ETIMEDOUT, либо
последняя ошибка, произошедшая в этом соединении.

Hекоторые приложения требуют более быстрого предупреждения
об ошибках. Это может быть выполнено с помощью уровня
SOL_IP опции IP_RECVERR сокета. Если эта опция запущена,
то все входящие ошибки немедленно передаются программе
пользователя. Используйте эту опцию осторожно: она
приводит к тому, что TCP становится более чувствительным к
сменам маршрутов и возникновению других условий, обычных
для сети.

ЗАМЕЧАНИЯ
Если во время соединения произошла ошибка записи в сокет,
то значение SIGPIPE устанавливается только при
установлении опции SO_KEEPALIVE.

TCP не имеет внепоточных данных; он имеет срочные данные.
В Linux это означает, что если другая сторона посылает
новые внепоточные данные, то старые срочные данные
вставляются в поток в качестве обычных (даже если не
установлена опция SO_OOBINLINE). Это поведение отличается
от поведения стеков BSD.

Linux по умолчанию использует совместимую с BSD
интерпретацию указателя на неотложные данные. Это
противоречит RFC1122, но необходимо для взаимодействия
сетей. Положение можно изменить с помощью sysctl-вызова
tcp_stdurg.

КОДЫ ОШИБОК
EPIPE Другая сторона неожиданно закрыла сокет, или была
произведена попытка чтения в закрытом сокете.

ETIMEDOUT
Другая сторона не подтвердила передачу данных через
определенное время.

EAFNOTSUPPORT
Переданный в sin_family тип сокета не был AF_INET.

Ошибки, определенные для ip(7) или общего уровня сокетов,
могут быть возвращены и TCP.


НАЙДЕННЫЕ ОШИБКИ
Hе все ошибки описаны.

IPv6 не описано.

Опции "прозрачного" прокси также не описаны.

ВЕРСИИ
Вызовы sysctl появились в Linux 2.2. IP_RECVERR появилась
в Linux 2.2. TCP_CORK появилось в 2.2.
Читать новости Linux в Telegram
Linux - tcp - протокол TCP
Мы в соцсетях ✉