ОПИСАНИЕ
Эта
реализация
протокола
TCP,
описанного
в RFC 793, RFC 1122 и RFC 2001 с
расширениями
NewReno и SACK. Данный
протокол
предоставляет
пользователю
надёжное
полнодуплексное
соединение
двух
сокетов
для
потоковой
передачи
поверх ip(7)
версий v4 и v6. TCP
гарантирует
доставку
данных в
правильном
порядке и
повторно
передаёт
потерявшиеся
пакеты. Для
выявления
ошибок
передачи
протоколом
генерируются
и
проверяются
контрольные
суммы
пакетов. TCP
не
сохраняет
границы
записей.
Только
что
созданный
сокет TCP не
имеет
локального
или
удалённого
адреса и не
является
полностью
определённым.
Для
создания
исходящего
соединения
TCP с другим
сокетом TCP
используйте
connect(2). Для
приёма
новых
входящих
соединений
сперва
подключите
сокет к
локальному
адресу и
порту с
помощью bind(2),
а затем
вызовите
listen(2) для
перевода
сокета в
режим
прослушивания.
После
этого
через
новый
сокет
можно
принимать
каждое
входящее
соединение
с помощью
accept(2). Сокет,
для
которого
успешно
отработали
accept(2) или connect(2),
является
полностью
определённым
и может
передавать
данные.
Данные не
могут быть
переданы
через
слушающий
или ещё не
соединённый
сокет.
Linux
поддерживает
высокопроизводительные
расширения
TCP RFC 1323. Они
включают в
себя:
защиту
против
оборотной
последовательности
номеров (PAWS),
масштабирование
окна и
метки
времени.
Масштабирование
окна
позволяет
использовать
большие (>
64 КБ) окна TCP
для
поддержки
соединений
с большой
задержкой
или
высокой
пропускной
способностью.
Для их
использования
необходимо
увеличить
размеры
буферов
приёма и
передачи.
Это можно
сделать
глобально
через
файлы /proc/sys/net/ipv4/tcp_wmem
и /proc/sys/net/ipv4/tcp_rmem, или
для
отдельных
сокетов,
используя
параметры
сокетов SO_SNDBUF
и SO_RCVBUF в
вызове setsockopt(2).
Максимальный
размер
буферов
сокета
объявляется,
используя
механизмы
SO_SNDBUF и SO_RCVBUF и
ограничен
значениями
в файлах
/proc/sys/net/core/rmem_max и
/proc/sys/net/core/wmem_max.
Заметим,
что TCP в
действительности
бронирует
в два раза
больше
места, чем
размер
буфера,
запрошенный
в вызове
setsockopt(2),
поэтому
последующий
вызов getsockopt(2)
не
возвратит
тот же
размер
буфера, что
был
запрошен в
вызове setsockopt(2). TCP
использует
дополнительное
пространство
в
административных
целях и для
внутренних
структур
ядра, а
значения в
файлах в /proc
отражают
большие
размеры, по
сравнению
с
действительными
окнами TCP.
Для
отдельных
соединений
размер
буфера
сокета
должен
быть
установлен
до вызова
listen(2) или connect(2).
Дополнительную
информацию
смотрите в
socket(7).
TCP
поддерживает
срочные
данные.
Срочные
данные
используются
для
уведомления
принимающей
стороны о
том, что
частью
потока
данных
является
некоторое
важное
сообщение,
которое
должно
быть
обработано
как можно
скорее. Для
отправки
срочных
данных
укажите
параметр
MSG_OOB в вызове
send(2). При
поступлении
срочных
данных
ядро
посылает
сигнал SIGURG
процессу
или группе
процессов,
который
указан как
«владелец»
сокета с
помощью
ioctl-вызовов
SIOCSPGRP или FIOSETOWN
(или с
помощью
определённой
в POSIX.1
операции
F_SETOWN для fcntl(2)).
Если задан
параметр
сокета SO_OOBINLINE,
то срочные
данные
будут
помещены в
обычный
поток
данных
(программа
может
проверить
его
размещение
с помощью
ioctl-вызова SIOCATMARK,
описанного
далее), в
противном
случае они
могут быть
получены,
только
если для recv(2)
или recvmsg(2)
установлен
флаг MSG_OOB.
При
наличии
внеполосных
данных select(2)
помечает
файловый
дескриптор
как
имеющий
исключительное
условие, а poll
(2) отмечает
это
событием
POLLPRI.
В Linux 2.4
представлено
несколько
изменений
по
улучшению
пропускной
способности
и
масштабирования,
а также
дополнительные
возможности:
поддержка
«нулевого»
копирования
(zero-copy) в sendfile(2),
явное
уведомление
о
перегрузке,
новое
управление
сокетами TIME_WAIT,
параметры
поддержки
сокетов в
рабочем
состоянии
и
поддержка
расширений
Duplicate SACK.
Форматы
адресов
Протокол
TCP построен
поверх
протокола IP
(смотрите
ip(7)). Форматы
адресов,
определённые
в ip(7),
относятся
и к TCP. TCP
поддерживает
только
соединения
типа
точка-точка
(point-to-point);
широковещательная
и
многоадресная
передача
не
поддерживаются.
Интерфейсы
/proc
Системные
настройки
параметров
TCP хранятся
в каталоге
/proc/sys/net/ipv4/. Также,
большинство
интерфейсов
/proc для IP
также
применимы
и к TCP
(смотрите
ip(7)).
Переменные,
описанные
как Boolean,
являются
целочисленными,
где
ненулевое
значение
(«истина, true»)
означает,
что
соответствующий
параметр
включён, а
нулевое
значение
(«ложь, false»)
означает,
что
параметр
включён.
- tcp_abc (Integer;
по
умолчанию: 0;
в Linux 2.6.15 по Linux 3.8)
- Управляет
подсчётом
выделенных
байтов (Appropriate Byte Count
— ABC),
определён
в RFC 3465. ABC — это
более
плавный
способ
увеличения
окна
перегрузки
(cwnd) в ответ
на
частичные
подтверждения.
Возможные
значения:
- 0
- увеличивать
cwnd при
каждом
подтверждении
(ABC
выключен)
- 1
- увеличивать
cwnd при
каждом
подтверждении
всего
сегмента
- 2
- разрешить
увеличение
cwnd на два,
если
подтверждение
касается
двух
сегментов,
что
компенсирует
задержку
подтверждений.
- tcp_abort_on_overflow
(Boolean; по
умолчанию:
выключен;
начиная с Linux
2.4)
- Включает
сброс (resetting)
соединений,
если
слушающий
сервис
слишком
медленно
работает и
не может
поддержать
существующие
или
принять
новые
соединения.
Это
означает,
что при
возникновении
переполнения
из-за
всплеска
подключений
(burst),
соединение
будет
восстановлено.
Включайте
этот
параметр
только,
если вы
действительно
уверены,
что
слушающая
программа
не может
быть
настроена
более
быстрый
приём
соединений.
Включение
этого
параметра
может
нарушить
работу
клиентов
вашего
сервера.
- tcp_adv_win_scale
(integer; по
умолчанию: 2;
начиная с Linux
2.4)
- Рассчитывает
переполнение
буфера по
формуле
bytes/2^tcp_adv_win_scale, если
tcp_adv_win_scale больше
0, или bytes-bytes/2^(-tcp_adv_win_scale),
если
значение
tcp_adv_win_scale меньше
или равно 0.
- Пространство
буфера
приёма
сокета
является
общим для
приложения
и ядра. TCP
обслуживает
часть
буфера как
окно TCP, о
размере
этого окна
приёма
извещается
другая
сторона.
Остаток
пространства
используется
как «буфер
приложения»,
используемый
для
изолирования
сети от
задержек
планирования
или
приложения.
Значение
по
умолчанию
tcp_adv_win_scale — 2 —
означает,
что для
буфера
приложения
используется
четверть
всего
пространства.
- tcp_allowed_congestion_control
(String; по
умолчанию:
смотрите
описание;
начиная с Linux
2.4.20)
- Показывает/назначает
алгоритм
управления
перегрузкой
из списка
доступных
для
непривилегированных
процессов
(смотрите
описание
параметра
сокета TCP_CONGESTION).
Элементы
списка
разделяются
пробелом и
завершаются
символом
новой
строки. В
списке
содержатся
несколько
значений
из
перечисленных
в tcp_available_congestion_control.
Значением
по
умолчанию
является
«reno» плюс
значение
по
умолчанию
из tcp_congestion_control.
- tcp_autocorking
(Boolean; по
умолчанию:
включено;
начиная с Linux
3.14)
- Если тот
параметр
установлен,
то ядро
пытается
объединить
вместе как
можно
больше
маленьких
частей
записываемых
данных (от
следующих
друг за
другом
вызовов write(2)
и sendmsg(2)), чтобы
уменьшить
общее
количество
посылаемых
пакетов.
Объединение
(coalescing)
выполняется,
если, как
минимум,
один
предыдущий
пакет
потока
ждёт в
очередях Qdisc
или
очереди
отправки
на
устройство.
Приложения
по-прежнему
могут
использовать
параметр
сокета TCP_CORK
для
получения
оптимального
поведения,
когда они
знают
как/когда
включать
вывод (uncork) из
своих
сокетов.
- tcp_available_congestion_control
(String; только
для чтения;
начиная с Linux
2.4.20)
- Показывает
список
зарегистрированных
алгоритмов
управления
перегрузкой.
Элементы
списка
разделяются
пробелом и
завершаются
символом
новой
строки.
Список
представляет
собой
сокращённый
набор из
tcp_allowed_congestion_control.
Дополнительные
алгоритмы
управления
перегрузкой
могут быть
доступны в
виде
модулей, но
они не
загружены.
- tcp_app_win
(integer; по
умолчанию:
31; начиная с Linux
2.4)
- Эта
переменная
определяет,
сколько
байтов
окна TCP
зарезервировано
для
буферизации
издержек
(overhead).
- Для буфера
приложения
будет
зарезервировано
максимум
(window/2^tcp_app_win, mss) байт
в окне.
Значение 0
обозначает,
что ничего
не
зарезервировано.
- tcp_base_mss
(Integer; по
умолчанию:
512; начиная с Linux
2.6.17)
- Начальное
значение
для search_low,
которое
будет
использовано
уровнем
упаковки
при
обнаружении
Path MTU
(зондирование
MTU). Если
зондирование
(probing) MTU
включено,
то в
соединении
для этого
используется
начальное
значение MSS.
- tcp_bic (Boolean;
default:
выключено;
в Linux 2.4.27/2.6.6 по 2.6.13)
- Включает
алгоритм
управления
перегрузкой
BIC TCP. Алгоритм
BIC-TCP
действует
только на
стороне
отправляющего,
при этом
обеспечивается
линейная
справедливость
RTT при
больших
окнах и
предлагается
масштабируемость
и
дружественность
к TCP.
Протокол
объединяет
две схемы,
называемые
аддитивное
увеличение
(additive increase) и
увеличение
дихотомическим
поиском (binary search
increase). Когда
окно
перегрузки
велико,
аддитивное
увеличение
с большим
приращением
обеспечивает
линейную
справедливость
RTT, а также
хорошую
масштабируемость.
При
маленьких
окнах
перегрузки,
увеличение
дихотомическим
поиском
предоставляет
дружественность
к TCP.
- tcp_bic_low_window
(integer; по
умолчанию:
14; в Linux 2.4.27/2.6.6 по 2.6.13)
- Устанавливает
порог окна
(в пакетах)
после
которого
запускается
BIC TCP для
регулировки
окна
перегрузки.
Ниже этого
порога BIC TCP
действует
как
алгоритм
по
умолчанию
— TCP Reno.
- tcp_bic_fast_convergence
(Boolean; по
умолчанию:
включено; в
Linux 2.4.27/2.6.6 по 2.6.13)
- Заставляет
BIC TCP
реагировать
на
изменения
окна
перегрузки
более
быстро.
Позволяет
двум
потокам
сообща
использовать
одно
соединение
для более
быстрой
сходимости.
- tcp_congestion_control
(String; по
умолчанию:
смотрите
описание;
начиная с Linux
2.4.13)
- Включает
алгоритм
управления
перегрузкой
по
умолчанию
для новых
соединений.
Алгоритм
«reno»
доступен
всегда, но
в
зависимости
от
настроек
ядра могут
быть и
другие.
Значение
по
умолчанию
для этого
файла
задаётся в
настройке
ядра.
- tcp_dma_copybreak
(integer; по
умолчанию:
4096; начиная с
Linux 2.6.24)
- Нижний
предел (в
байтах) на
количество
читаемых
из сокета
данных,
которое
будет
снято из
механизма
копирования
DMA, если он
есть в
системе и
ядро было
настроено
с
параметром
CONFIG_NET_DMA.
- tcp_dsack
(Boolean; по
умолчанию:
включено;
начиная с Linux
2.4)
- Включает
поддержку
RFC 2883 TCP Duplicate SACK.
- tcp_ecn (Integer;
по
умолчанию:
смотрите
далее;
начиная с Linux
2.4)
- Включает
RFC 3168 —
уведомление
о явной
перегрузке
(Explicit Congestion Notification).
- В этом
файле
могут быть
следующие
значения:
- 0
- Отключить
ECN. Не
посылать и
не
принимать
ECN. Было
включено
по
умолчанию
до Linux 2.6.30
включительно.
- 1
- Включать ECN
при
запросе
входящими
соединениями,
а также
запрашивать
ECN при
попытках
исходящих
соединений.
- 2
- Включать ECN
при
запросе
входящими
соединениями,
но не
запрашивать
ECN при
попытках
исходящих
соединений.
Данное
значение
поддерживается
и включено
по
умолчанию
начиная с Linux
2.6.31.
- При
включении
может
пропасть
возможность
установления
соединений
с
некоторыми
узлами
из-за
некорректно
работающих
маршрутизаторов
по пути
следования,
что
выражается
в обрыве (dropped)
соединения.
Однако для
улучшения
и
содействия
внедрению
со
значением 1
и для
обхода
такого
некорректного
оборудования
был введён
параметр
tcp_ecn_fallback.
- tcp_ecn_fallback
(Boolean; по
умолчанию:
включено;
начиная с Linux
4.1)
- Включает
переход на
резервный
вариант RFC 3168,
Section 6.1.1.1. При
включении
исходящие
устанавливающие
ECN SYNы, на
которые не
было
ответа за
обычное
время
перепосылки
SYN, будут
перепосланы
со
сброшенными
CWR и ECE.
- tcp_fack
(Boolean; по
умолчанию:
включено;
начиная с Linux
2.2)
- Включает
поддержку
TCP Forward Acknowledgement
(подтверждение
передачи).
- tcp_fin_timeout
(integer; по
умолчанию:
60; начиная с Linux
2.2)
- Устанавливает
количество
секунд, в
течение
которых
необходимо
ждать
последний
пакет FIN
перед
принудительным
закрытием
сокета.
Строго
говоря, это
нарушение
спецификации
TCP, но оно
необходимо
для
предотвращения
атак
отказа в
обслуживании
(DoS). Значение
по
умолчанию
в ядрах 2.2
равно 180.
- tcp_frto
(integer; по
умолчанию:
смотрите
далее;
начиная с Linux
2.4.21/2.6)
- Включает F-RTO
—
расширенный
алгоритм
восстановления
пауз при
повторных
передачах
TCP (RTO). В
частности,
он полезен
в
беспроводных
средах, где
потеря
пакетов
обычно
происходит
из-за
произвольного
возникающих
радиопомех,
а не из-за
перегрузки
промежуточного
маршрутизатора.
Подробности
смотрите в
RFC 4138.
- В этом
файле
могут быть
следующие
значения:
- 0
- Отключено.
Было
включено
по
умолчанию
до Linux 2.6.23
включительно.
- 1
- Включить
базовую
версию
алгоритма
F-RTO.
- 2
- Включить
расширенный
SACK алгоритм
F-RTO, если
поток
использует
SACK. Когда
используется
SACK, также
может
использоваться
и базовая
версия,
хотя при
этом
возникают
случаи, где
F-RTO
сработает
плохо при
подсчёте
пакетов в
потоке TCP с
включённым
SACK. Данное
значение
введено по
умолчанию
начиная с Linux
2.6.24.
- До Linux 2.6.22 этот
параметр
имел тип Boolean,
в котором
поддерживаются
только
значения 0
и 1.
- tcp_frto_response
(integer; по
умолчанию: 0;
начиная с Linux
2.6.22)
- Если F-RTO
обнаруживает,
что пауза
при
повторной
передаче TCP
не типична
(т.е., паузы
можно было
бы
избежать,
если в TCP
была бы
установлена
более
длительная
пауза
повторной
передачи),
то у TCP есть
несколько
вариантов,
что
сделать
дальше.
Возможные
значения:
- 0
- Уменьшение
скорости (rate)
вдвое;
плавный и
осторожный
ответ,
приводит к
уменьшению
окна
перегрузки
(cwnd) вдвое и
предельной
величине
медленного
старта (ssthresh)
после
одного RTT.
- 1
- Очень
осторожный
ответ; не
рекомендуется,
так как
хотя и
допускается,
но плохо
взаимодействует
с
остальным
Linux TCP;
немедленно
уменьшает
cwnd и ssthresh
вдвое.
- 2
- Активный
ответ;
отменяет
оценки
управления
перегрузкой,
которые
теперь не
нужны
(игнорируется
возможность
потери
повторной
передачи,
которая бы
требовала
от TCP
большей
бережливости);
значения
cwnd и ssthresh
восстанавливаются
в значения
до паузы.
- tcp_keepalive_intvl
(integer; по
умолчанию:
75; начиная с Linux
2.4)
- Количество
секунд
между
отправкой
«поддерживающих»
(keep-alive)
проверочных
пакетов.
- tcp_keepalive_probes
(integer; по
умолчанию: 9;
начиная с Linux
2.2)
- Максимальное
количество
отправляемых
«поддерживающих»
(keep-alive) пакетов TCP
до разрыва
соединения,
если не
будет
получено
ответа от
другой
стороны.
- tcp_keepalive_time
(integer; по
умолчанию:
7200; начиная с
Linux 2.2)
- Количество
секунд
между
отсутствием
передаваемых
данных и
отправкой
через
соединение
«поддерживающих»
пакетов.
Эти пакеты
будут
отправляться,
только
если
установлен
параметра
сокета SO_KEEPALIVE.
Значение
по
умолчанию
равно 7200
секунд (2
часа).
Бездействующее
соединение
разрывается
примерно
через 11
минут (9
пакетов, с
интервалом
75 секунд)
при
включённом
режиме keep-alive.
- Заметим,
что
механизмы
слежения
за
соединением
более
низкого
уровня и
периоды
ожидания
приложений
могут быть
гораздо
короче.
- tcp_low_latency
(Boolean; по
умолчанию:
выключено;
начиная с Linux
2.4.21/2.6)
- Если
включён, то
при работе
стека TCP
отдаётся
предпочтение
меньшей
задержке, а
не более
высокой
производительности.
Если
параметр
выключен,
то
предпочтение
отдаётся
высокой
производительности.
В качестве
примера
приложения,
для
которого
нужно
включить
этот
параметр,
можно
привести
вычислительный
кластер Beowulf.
- tcp_max_orphans
(integer; по
умолчанию:
смотрите
далее;
начиная с Linux
2.4)
- Максимальное
количество
брошенных
(orphaned, не
присоединённых
ни к одному
пользовательскому
обработчику
файлов)
сокетов TCP,
разрешённых
в системе.
Если это
количество
превышается,
то
брошенные
соединения
сбрасываются
и
выводится
предупреждение.
Данное
ограничение
существует
только для
предотвращения
простейших
атак в
обслуживании
(DoS). Понижать
этот лимит
не
рекомендуется.
Иногда для
сети может
потребоваться
увеличить
это
количество,
но заметим,
что на
каждое
такое
брошенное
соединение
расходуется
до 64 КБ
невыгружаемой
памяти.
Значение
по
умолчанию
равно
значению
параметра
ядра NR_FILE.
Значение
по
умолчанию
может
изменяться
в
зависимости
от
количества
памяти в
системе.
- tcp_max_syn_backlog
(integer; по
умолчанию:
смотрите
далее;
начиная с Linux
2.2)
- Максимальное
количество
запросов
на
соединение
в очереди,
которые
пока не
получили
подтверждения
от
клиентов.
Если это
количество
превышается,
то ядро
начнёт
отбрасывать
запросы.
Значение
по
умолчанию
(256)
увеличивается
до 1024, если в
системе
достаточно
памяти (>=
128 МБ) и
уменьшается
до 128, если
памяти
мало (<= 32 МБ).
- До Linux 2.6.20
рекомендовалось,
что если
необходимо
значение
больше 1024, то
нужно
изменить
размер
хэш-таблицы
SYNACK (TCP_SYNQ_HSIZE)в include/net/tcp.h
сохраняя
условие
-
TCP_SYNQ_HSIZE * 16 <= tcp_max_syn_backlog
- и
пересобрать
ядро. В Linux 2.6.20
постоянный
размер TCP_SYNQ_HSIZE
был
заменён на
динамически
изменяемый.
- tcp_max_tw_buckets
(integer; по
умолчанию:
смотрите
далее;
начиная с Linux
2.4)
- Максимальное
количество
сокетов в
состоянии
TIME_WAIT,
разрешённое
в системе.
Это
ограничение
существует
только для
предотвращения
простейших
атак DoS. По
умолчанию
равно NR_FILE*2 и
изменяется
в
зависимости
от
количества
памяти в
системе.
Если это
значение
превышено,
то сокет
закрывается
и
выводится
предупреждение.
- tcp_moderate_rcvbuf
(Boolean; по
умолчанию:
включено;
начиная с Linux
2.4.17/2.6.7)
- Если
включён, то
для TCP
включается
автоматическая
настройка
приёмного
буфера; при
этом
размер
буфера (не
более чем
tcp_rmem[2])
автоматически
подгоняется
под размер,
используемый
на пути
прохождения
трафика, в
целях
достижения
максимальной
пропускной
способности.
- tcp_mem
(начиная с Linux
2.4)
- Вектор из 3
целочисленных
значений: [low,
pressure, high].
Представляют
собой
границы,
измеряемые
в
системных
страницах
памяти,
используются
в TCP для
отслеживания
использования
памяти. По
умолчанию
рассчитываются
во время
загрузки
ОС, зависят
от
количества
памяти в
системе
(для этого
в TCP может
использоваться
только
нижняя
память (low memory),
которая в
32-битных
системах
ограничена
900-ми
мегабайтами.
В 64-битных
системах
этого
ограничения
нет).
- low
- TCP не
регулирует
распределение
своей
памяти,
если число
страниц,
выделенных
глобально,
ниже этого
значения.
- pressure
- Когда
количество
страниц,
размещённых
TCP,
превышает
это
значение,
то TCP
изменяет
свой метод
использования
памяти. Это
состояние
отменяется
при
падении
количества
размещённых
страниц
ниже
значения
low.
- high
- Глобальное
(общее)
максимальное
количество
страниц,
которое
может
использовать
TCP. Это
значение
переопределяет
все другие
ограничения,
накладываемые
ядром.
- tcp_mtu_probing
(integer; по
умолчанию: 0;
начиная с Linux
2.6.17)
- Этот
параметр
контролирует
TCP Packetization-Layer Path MTU Discovery. В
файле
могут
указываться
следующие
значения:
- 0
- Выключен
- 1
- Включать
при
обнаружении
чёрной
дыры (black hole) ICMP
- 2
- Всегда
включено,
использовать
начальное
значение MSS
из tcp_base_mss.
- tcp_no_metrics_save
(Boolean; по
умолчанию:
выключено;
начиная с Linux
2.6.6)
- По
умолчанию,
TCP
сохраняет
различные
метрики
соединения
в кэше
маршрутов
при
закрытии
соединения
для того,
чтобы
соединения,
устанавливаемые
в
ближайшем
будущем,
могли
использовать
этот набор
начальных
состояний.
Обычно, это
увеличивает
общую
производительность,
но иногда
может и
уменьшить
её. Если
tcp_no_metrics_save
включено,
то TCP не
кэширует
метрики
при
закрытии
соединений.
- tcp_orphan_retries
(integer; по
умолчанию: 8;
начиная с Linux
2.4)
- Максимальное
количество
попыток
проверки
другой
стороны
соединения
перед
закрытием
с нашей
стороны.
- tcp_reordering
(integer; по
умолчанию: 3;
начиная с Linux
2.4)
- Максимальное
количество
пакетов,
которое
может быть
переупорядочено
в потоке TCP,
при
котором TCP
ещё не
считает
что
произошли
потери и не
переходит
в
состояние
медленного
запуска (slow start).
Не
рекомендуется
менять это
значение.
Данная
метрика
обнаружения
переупорядочивания
пакетов
предназначена
для
минимизации
повторных
передач,
обусловленных
переупорядочиванием
пакетов в
соединении.
- tcp_retrans_collapse
(Boolean; по
умолчанию:
включено;
начиная с Linux
2.2)
- При
повторной
передаче
пробовать
посылать
полноразмерные
пакеты.
- tcp_retries1
(integer; по
умолчанию: 3;
начиная с Linux
2.2)
- Количество
попыток
повторной
передачи
пакетов по
установленному
соединению
без
привлечения
других
сетевых
уровней.
При
превышении
данного
количества,
сетевой
уровень
обновляет
маршрут
перед
каждым
повтором
(если это
возможно).
В RFC
установлено
минимальное
значение
по
умолчанию:
3.
- tcp_retries2
(integer; по
умолчанию:
15; начиная с Linux
2.2)
- Максимальное
количество
попыток
повторной
передачи
пакетов TCP
по
установленному
соединению
до того,
как оно
будет
считаться
разорванным.
По
умолчанию
равно 15, что
соответствует
времени
примерно
от 13 до 30
минут, в
зависимости
от
значения
таймера
повторной
передачи. В
RFC 1122
установлена
минимальная
граница в 100
секунд,
которая
обычно
считается
слишком
маленькой.
- tcp_rfc1337
(Boolean; по
умолчанию:
выключено;
начиная с Linux
2.2)
- Включает
поведение
TCP,
совместимое
с RFC 1337. Если
выключено,
то: если в
состоянии
TIME_WAIT
принимается
RST, то сокет
закрывается
немедленно,
не
дожидаясь
конца
периода TIME_WAIT.
- tcp_rmem
(начиная с Linux
2.4)
- Вектор из 3
целочисленных
значений: [min,
default, max]. Эти
параметры
используются
TCP для
регулирования
размера
буфера
приёма. TCP
динамически
корректирует
размер
буфера
приёма от
значений
по
умолчанию,
указанных
ниже, в
диапазоне
этих
переменных
и в
зависимости
от
количества
памяти в
системе.
- min
- Минимальный
размер
буфера
приёма,
используемый
каждым
сокетом TCP.
По
умолчанию
равен
размеру
системной
страницы (в
Linux 2.4 равно
4 КБ и
может
уменьшаться
до PAGE_SIZE байт
в системах
с малым
количеством
памяти).
Это
значение
используется
для того,
чтобы
размещение
страниц
памяти
меньше
этого
значения в
режиме
давления
(pressure) все
равно
выполнялось.
Не
ограничивает
размер
буфера
приёма,
объявленного
для сокета
с помощью
SO_RCVBUF.
- default
- Размер
буфера
приёма по
умолчанию
для
сокетов TCP.
Это
значение
переопределяет
начальный
размер
буфера по
умолчанию,
взятый из
общей
глобальной
переменной
net.core.rmem_default,
определённой
для всех
протоколов.
По
умолчанию
равен 87380
байт (в Linux 2.4
это
значение
может
уменьшаться
до 43689 в
системах с
малым
количеством
памяти).
Если
желательны
большие
размеры
буфера
приёма, то
это
значение
должно
быть
увеличено
(влияет на
все
сокеты).
Для
разрешения
больших
размеров
окон TCP
должно
быть
включено
net.ipv4.tcp_window_scaling (по
умолчанию).
- max
- Максимальный
размер
буфера
приёма,
используемый
каждым
сокетом TCP.
Это
значение
не
переопределяет
значение
глобальной
переменной
net.core.rmem_max. Не
используется
для
ограничения
размера
буфера
приёма,
объявленного
для сокета
через SO_RCVBUF.
Значение
по
умолчанию
рассчитывается
по
следующей
формуле
-
max(87380, min(4 МБ,
tcp_mem[1]*PAGE_SIZE/128))
- (в Linux 2.4
значение
по
умолчанию
равно 87380*2
байт,
уменьшается
до 87380 в
системах с
малым
количеством
памяти).
- tcp_sack
(Boolean; по
умолчанию:
включено;
начиная с Linux
2.2)
- Включает
выборочные
подтверждения
TCP (TCP Selective Acknowledgements),
описанные
в RFC 2018.
- tcp_slow_start_after_idle
(Boolean; по
умолчанию:
включено;
начиная с Linux
2.6.18)
- Если
включено,
то
разрешается
поведение
согласно RFC 2861
и таймаут
окна
перегрузки
после
периода
простоя.
Период
простоя
определяется
текущим
значением
RTO (таймаут
повторной
передачи).
Если
выключено,
то после
окна
перегрузки
не следует
таймаут
после
периода
простоя.
- tcp_stdurg
(Boolean; по
умолчанию:
выключено;
начиная с Linux
2.2)
- Если
значение
включено,
то для поля
указателя
срочных
данных TCP
используется
интерпретация
RFC 1122.
Согласно
этому
указатель
срочности
указывает
на
последний
байт
срочных
данных.
Если это
значение
выключено,
то для
указателя
на срочные
данные
применяется
интерпретация,
совместимая
с BSD:
указатель
срочности
указывает
на первый
байт после
срочных
данных.
Включение
этого
значения
может
привести к
проблемам
с
взаимодействием
сетей.
- tcp_syn_retries
(integer; по
умолчанию: 5;
начиная с Linux
2.2)
- Максимальное
количество
посылаемых
начальных
пакетов SYN у
активного
соединения
TCP. Значение
должно
быть
меньше 255.
Значение
по
умолчанию
равно 5, что
соответствует
примерно 180
секундам.
- tcp_synack_retries
(integer; по
умолчанию: 5;
начиная с Linux
2.2)
- Максимальное
количество
попыток
повторной
передачи
сегмента SYN/ACK
у
пассивного
соединения
TCP. Значение
должно
быть
меньше 255.
- tcp_syncookies
(Boolean; начиная с
Linux 2.2)
- Включает TCP
syncookies. Ядро
должно
быть
собрано с
параметром
CONFIG_SYN_COOKIES. Это
вызывает
отправку
syncookies при
переполнении
у сокета
очереди syn backlog.
Возможность
syncookies создана
для защиты
сокета от
атак
переполнения
SYN.
Используйте
её в самую
последнюю
очередь, а
лучше
вообще не
используйте.
Это
является
нарушением
протокола
TCP и
конфликтует
со многими
другими
областями
TCP, например
с
расширениями
TCP. Может
привести к
проблемам
в работе
клиентов и
релеев. Не
рекомендуется
к
использованию
на
высокозагруженных
серверах в
качестве
«быстрой
помощи»
при
перегрузках
или
некорректных
настройках.
В качестве
рекомендуемой
альтернативы
смотрите
tcp_max_syn_backlog, tcp_synack_retries и
tcp_abort_on_overflow.
- tcp_timestamps
(integer; по
умолчанию: 1;
начиная с Linux
2.2)
- Устанавливается
в одно из
следующих
значений
для
включения
меток
времени RFC 1323
TCP:
- 0
- Отключить
метки
времени.
- 1
- Включить
метки
времени,
определённые
в RFC1323, и
использовать
случайное
смещение
для
каждого
соединения,
а не просто
использовать
текущее
время.
- 2
- Как при
значении 1,
но без
случайных
смещений.
Назначение
tcp_timestamps этого
значения
работает
начиная с Linux
4.10.
- tcp_tso_win_divisor
(integer; по
умолчанию: 3;
начиная с Linux
2.6.9)
- Контролирует
процент
окна
перегрузки,
который
может быть
использован
одиночным
кадром TCP Segmentation Offload
(TSO). Значение
этого
параметра
—
компромисс
между
временной
нагрузкой
(burstiness) и
построением
больших
кадров TSO.
- tcp_tw_recycle
(Boolean; по
умолчанию:
выключено;
в Linux 2.4 по 4.11)
- Включает
быстрое
повторное
использование
сокетов с
TIME_WAIT.
Включение
данного
параметра
не
рекомендуется,
так как
удалённый
IP может не
использовать
монотонно
увеличивающиеся
метки
времени
(устройства
за NAT,
устройства
с
выделенными
на
подключение
смещёнными
метками
времени).
Смотрите RFC 1323
(PAWS) и RFC 6191.
- tcp_tw_reuse
(Boolean; по
умолчанию:
выключено;
начиная с Linux
2.4.19/2.6)
- Позволяет
повторно
использовать
сокеты TIME_WAIT
для новых
соединений,
если это
безопасно
с точки
зрения
протокола.
Значение
не должно
изменяться
без
совета/запроса
технических
специалистов.
- tcp_vegas_cong_avoid
(Boolean; по
умолчанию:
выключено;
с Linux 2.2 по 2.6.13)
- Включает
алгоритм
избежания
перегрузок
TCP Vegas. TCP Vegas
действует
на стороне
отправителя;
он ожидает
начала
перегрузки,
оценивая
пропускную
способность.
TCP Vegas
подгоняет
частоту
отправки,
изменяя
окно
перегрузки.
При
включённом
TCP Vegas
обеспечиваются
меньшие
потери
пакетов, но
он не так
стремителен
как TCP Reno.
- tcp_westwood
(Boolean; по
умолчанию:
выключено;
с Linux 2.4.26/2.6.3 по 2.6.13)
- Включает
алгоритм
управления
перегрузками
TCP Westwood+. TCP Westwood+
действует
на стороне
отправителя
и является
модификацией
стека
протокола
TCP Reno,
ориентированной
на
производительность
управления
перегрузками
TCP. Он
основан на
оценке
полосы
пропускания
от точки
передачи
до точки
приёма при
изменении
окна
перегрузки
и порога
медленного
старта
после
возникновения
перегрузки.
Используя
эту оценку
TCP Westwood+
подстраивает
порог
медленного
старта и
окно
перегрузки,
принимая
во
внимание
пропускную
способность,
полученную
во время
перегрузки.
TCP Westwood+
значительно
увеличивает
плавность
(fairness), по
сравнению
с TCP Reno, в
проводных
сетях и
пропускную
способность
в
беспроводных
сетях.
- tcp_window_scaling
(Boolean; по
умолчанию:
включено;
начиная с Linux
2.2)
- Включает
изменение
размера
окна TCP,
описанное
в RFC 1323 Эта
возможность
позволяет
использовать
большие (>
64 КБ) окна
для
соединений
TCP, но она
должна
также
поддерживаться
на другой
стороне
соединения.
Обычно, 16-ти
битовый
размер
поля длины
окна в
заголовке
TCP
ограничивает
его размер
до 64 КБ.
Если нужно
обеспечить
больший
размер
окна, то
приложение
должно
увеличить
размер
своих
буферов
сокетов и
включить
возможность
масштабирования
окна. Если
значение
tcp_window_scaling
выключено,
то TCP не
будет
согласовывать
использование
масштабирования
окон с
другой
стороной
во время
установки
соединения.
- tcp_wmem
(начиная с Linux
2.4)
- Вектор из 3
целочисленных
значений: [min,
default, max]. Эти
параметры
используются
TCP для
управления
размером
буфера
отправления.
TCP
динамически
корректирует
размер
буфера
отправления
от
значений
по
умолчанию,
указанных
ниже, в
диапазоне
этих
переменных
и в
зависимости
от
количества
доступной
памяти.
- min
- Минимальный
размер
буфера
отправления,
используемый
каждым
сокетом TCP
По
умолчанию
равен
размеру
системной
страницы (в
Linux 2.4 значение
равно 4 КБ).
Это
значение
используется
для того,
чтобы
размещение
страниц
памяти
меньше
этого
значения в
режиме
давления
(pressure) все
равно
выполнялось.
Не
ограничивает
размер
буфера
отправления,
объявленного
для сокета
с помощью
SO_SNDBUF.
- default
- Размер
буфера
отправления
по
умолчанию
для
сокетов TCP
Это
значение
переопределяет
начальный
размер
буфера по
умолчанию,
взятый из
общей
глобальной
переменной
/proc/sys/net/core/wmem_default,
определённой
для всех
протоколов.
По
умолчанию
равно 16 КБ.
Если
желательны
большие
размеры
буферов
отправления,
то это
значение
должно
быть
увеличено
(влияет на
все
сокеты).
Для
разрешения
больших
размеров
окон TCP
значение
/proc/sys/net/ipv4/tcp_window_scaling
должно
быть
ненулевым
(по
умолчанию).
- max
- Максимальный
размер
буфера
отправления,
используемый
каждым
сокетом TCP.
Это
значение
не
переопределяет
значение
переменной
/proc/sys/net/core/wmem_max. Не
используется
для
ограничения
размера
буфера
отправления,
объявленного
для сокета
через SO_SNDBUF.
Значение
по
умолчанию
рассчитывается
по
следующей
формуле
-
max(65536, min(4 МБ,
tcp_mem[1]*PAGE_SIZE/128))
- (в Linux 2.4
значение
по
умолчанию
равно 128 КБ,
уменьшается
до 64 КБ в
системах с
малым
количеством
памяти).
- tcp_workaround_signed_windows
(Boolean; по
умолчанию:
выключено;
начиная с Linux
2.6.26)
- Если
включено,
то
предполагать,
что
неполучение
параметра
окна
масштабирования
означает,
что
удалённый
TCP
повреждён
и считать
размер
окна как
число со
знаком.
Если
выключено,
то
предполагается,
что
удалённый
TCP не
повреждён,
даже если
мы не
получаем
от него
параметр
окна
масштабирования.
Параметры
сокета
Для
получения
и задания
параметров
сокетов TCP
используйте
вызов getsockopt(2) и
setsockopt(2),
соответственно.
Значение
аргумента
уровня
параметров
должно
быть равно
IPPROTO_TCP. Если не
указано
обратное,
optval — это
указатель
на int. Кроме
того,
сокетам TCP
доступно
большинство
параметров
сокета IPPROTO_IP.
Дополнительная
информация
приведена
в ip(7).
В
следующем
списке
представлены
параметры
только для
сокетов TCP. О
других
параметрах,
применимых
к сокетам TCP,
читайте в
socket(7).
- TCP_CONGESTION
(начиная с Linux
2.6.13)
- Аргументом
этого
параметра
является
строка.
Данный
параметр
позволяет
вызывающему
задать
используемый
алгоритм
управления
перегрузкой
TCP, для
каждого
сокета. Для
непривилегированных
процессов
выбор
ограничен
одним из
алгоритмов
tcp_allowed_congestion_control
(описано
выше).
Привилегированные
процессы
(CAP_NET_ADMIN) могут
выбирать
любой из
доступных
алгоритмов
контроля
перегрузки
(смотрите
описание
tcp_available_congestion_control
выше).
- TCP_CORK
(начиная с Linux
2.2)
- Если
установлен,
то не
посылать
частичные
кадры. Все
поставленные
в очередь
частичные
кадры
будут
отосланы,
когда этот
параметр
будет
очищен. Это
полезно
для
подготовки
заголовков
перед
вызовом
sendfile(2) или для
оптимизации
пропускной
способности.
В текущей
реализации
отводится
максимум (ceiling)
200
миллисекунд,
в течение
которых
вывод
закупоривается
(corked) из-за TCP_CORK.
Если этот
максимум
достигнут,
то данные в
очереди
передаются
автоматически.
Этот
параметр
можно
совмещать
с TCP_NODELAY
только
начиная с Linux
2.5.71. Данный
параметр
не должен
использоваться,
если
требуется
переносимость
кода.
- TCP_DEFER_ACCEPT
(начиная с Linux
2.4)
- Позволяет
слушающему
просыпаться
только при
поступлении
данных на
сокет.
Принимает
целое
значение
(секунды),
может
ограничить
максимальное
количество
попыток TCP
закрытия
этого
соединения.
Данный
параметр
не должен
использоваться,
если
требуется
переносимость
кода.
- TCP_INFO
(начиная с Linux
2.4)
- Используется
для сбора
информации
об этом
сокете.
Ядро
возвращает
структуру
struct tcp_info,
определённую
в файле
/usr/include/linux/tcp.h.
Данный
параметр
не должен
использоваться,
если
требуется
переносимость
кода.
- TCP_KEEPCNT
(начиная с Linux
2.4)
- Максимальное
число
проверок
(keepalive probes) TCP,
отправляемых
перед
сбросом
соединения.
Данный
параметр
не должен
использоваться,
если
требуется
переносимость
кода.
- TCP_KEEPIDLE
(начиная с Linux
2.4)
- Время (в
секундах)
простоя (idle)
соединения,
по
прошествии
которого TCP
начнёт
отправлять
проверочные
пакеты (keepalive probes),
если для
сокета
включён
параметр
SO_KEEPALIVE. Данный
параметр
не должен
использоваться,
если
требуется
переносимость
кода.
- TCP_KEEPINTVL
(начиная с Linux
2.4)
- Время в
секундах
между
отправками
отдельных
проверочных
пакетов (keepalive
probes). Данный
параметр
не должен
использоваться,
если
требуется
переносимость
кода.
- TCP_LINGER2
(начиная с Linux
2.4)
- Время
жизни
брошенных
(orphaned) сокетов
в
состоянии
FIN_WAIT2. Этот
параметр
может
использоваться
для
переопределения
общесистемного
параметра
из файла
/proc/sys/net/ipv4/tcp_fin_timeout
данного
сокета.
Значение
не должно
противоречить
параметру
SO_LINGER уровня
сокета socket(7).
Данный
параметр
не должен
использоваться,
если
требуется
переносимость
кода.
- TCP_MAXSEG
- Максимальный
размер
сегмента
для
исходящих
пакетов TCP. В
Linux 2.2 и ранее, и
в Linux 2.6.28 и новее,
если этот
параметр
задан до
установления
соединения,
то
меняется
также и
значение MSS,
сообщаемое
другой
стороне в
начальном
пакете.
Значения,
превышающие
MTU
интерфейса,
игнорируются.
TCP также
будет
определять
минимальную
и
максимальную
границу
поверх
этих
значений.
- TCP_NODELAY
- Если
включён, то
отменяется
выполнение
алгоритма
Nagle. Это
означает,
что
сегменты
всегда
отсылаются
при первой
же
возможности,
даже если к
отправке
назначено
небольшое
количество
данных.
Если
выключен,
то данные
буферизируются
и будут
отправлены
только
после
набора
достаточно
большого
количества
данных,
поэтому
небольшие
пакеты с
данными не
отправляются.
Этот
параметр
переопределяется
TCP_CORK; однако,
установка
данного
параметра
вызывает
явную
очистку
ожидающих
вывода
данных,
даже если
установлен
TCP_CORK.
- TCP_QUICKACK
(начиная с Linux
2.4.4)
- Включает
режим quickack при
установке
или
выключает
при сбросе.
В этом
режиме все
уведомления
отправляются
немедленно,
а не с
некоторой
задержкой
в
соответствии
с обычной
работой TCP.
Этот флаг
не
постоянный,
он только
включает
или
выключает
режим quickack.
Последующие
операции с
протоколом
TCP будут по
своему
включать/выключать
этот режим
в
зависимости
от своих
внутренних
протоколов,
настроек и
факторов.
Данный
параметр
не должен
использоваться,
если
требуется
переносимость
кода.
- TCP_SYNCNT
(начиная с Linux
2.4)
- Устанавливает
количество
повторных
передач SYN,
которое
должен
послать TCP
до отмены
попытки
установки
соединения.
Не должно
превышать
255. Данный
параметр
не должен
использоваться,
если
требуется
переносимость
кода.
- TCP_USER_TIMEOUT
(начиная с Linux
2.6.37)
- Типом
аргумента
этого
параметра
является
unsigned int. Если
значение
больше 0, то
им
задаётся
максимальное
количество
времени в
миллисекундах,
которое
передаваемые
данные
могут
оставаться
неподтверждёнными
до того,
как TCP
принудительно
закроет
соответствующее
соединение
и
приложению
вернётся
ETIMEDOUT. Если
значение
равно 0, то TCP
будет
использовать
значение
по
умолчанию.
- Увеличение
пользовательского
времени
задержки
позволяет
соединению
TCP
продолжать
существовать
дополнительные
периоды
при
отсутствии
связи.
Уменьшение
пользовательского
времени
задержки
позволяет
приложениям
«быстро
упасть»,
если это
нужно. В
противном
случае
ошибка
может быть
отложена
до 20 минут
при
текущих
системных
значениях
по
умолчанию
в обычной
среде WAN.
- Этот
параметр
может быть
задан при
любом
состоянии
соединения
TCP, но будет
задействован
только при
синхронизации
состояний
соединения
(ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING и
LAST-ACK). Кроме
этого,
когда
используется
параметр
поддержания
TCP (SO_KEEPALIVE), TCP_USER_TIMEOUT
отменит
действие
поддержания
для
определения
нужно ли
закрывать
соединение
из-за
ошибки
поддержания.
- Этот
параметр
не
действует,
если TCP
перепосылает
пакет, или
посылается
проба
поддержания.
- Этот
параметр,
как и
многие
другие,
наследуется
сокетом,
возвращаемым
accept(2), если он
установлен
у
прослушивающего
сокета.
- Подробней
о свойстве
пользовательского
времени
задержки
смотрите
RFC 793 и RFC 5482 («TCP User Timeout
Option»).
- TCP_WINDOW_CLAMP
(начиная с Linux
2.4)
- Ограничивает
размер
предлагаемого
окна
указанным
значением.
Ядро
считает
минимальный
размер как
SOCK_MIN_RCVBUF/2. Данный
параметр
не должен
использоваться,
если
требуется
переносимость
кода.
Программный
интерфейс
сокетов
TCP
предоставляет
ограниченную
поддержку
внеполосных
данных в
виде
(одного
байта)
срочных
данных. В Linux
это
означает,
что если
другая
сторона
посылает
новые
внеполосные
данные, то
старые
срочные
данные
вставляются
как
обычные
данные в
поток (даже
когда SO_OOBINLINE
не
установлен).
В этом
отличие от
реализации
стека в BSD.
По
умолчанию
в Linux
используется
совместимая
с BSD
интерпретация
поля
срочного
указателя.
Это
нарушает
RFC 1122, но
требуется
для
правильного
взаимодействия
с другими
стеками.
Это можно
изменить
через
/proc/sys/net/ipv4/tcp_stdurg.
Возможно
получить
внеполосные
данные с
помощью recv(2)
и флага MSG_PEEK.
Начиная с
версии 2.4, Linux
поддерживает
использование
MSG_TRUNC в
аргументе
flags вызова recv(2)
(и recvmsg(2)). Этот
флаг
принуждает
отбросить
принятые
байты
данных, а не
передавать
их обратно
в буфер,
предоставленный
вызывающим.
Начиная с Linux
2.4.4, MSG_TRUNC также
обладает
этим
свойством,
если
используется
вместе с MSG_OOB
для приёма
внеполосных
данных.
Системные
вызовы (ioctl)
Следующие
вызовы ioctl(2)
возвращают
информацию
в
аргументе
value.
Синтаксис:
int value;
error = ioctl(tcp_socket, ioctl_type, &value);
Значением
ioctl_type может
быть одно
из:
- SIOCINQ
- Возвращает
количество
непрочитанных
данных в
очереди в
приёмном
буфере.
Сокет не
должен
быть в
состоянии
LISTEN, иначе
возвращается
ошибка (EINVAL).
Значение
SIOCINQ
определено
в <linux/sockios.h>. В
качестве
альтернативы
вы можете
использовать
синоним FIONREAD,
определённый
в <sys/ioctl.h>.
- SIOCATMARK
- Возвращает
истинное
значение
(т.е., value
отличное
от нуля),
если
входящие
данные
потока
отмечены
как
срочные.
- Если
установлен
параметр
сокета SO_OOBINLINE
и SIOCATMARK
возвращает
истинное
значение,
то при
следующем
чтении из
сокета
будут
получены
срочные
данные.
Если
параметр
сокета SO_OOBINLINE
не
установлен
и SIOCATMARK
возвращает
истинное
значение,
то при
следующем
чтении из
сокета
будут
получены
байты,
размещённые
после
срочных
(для
действительного
чтения
срочных
данных
требуется
флаг recv(MSG_OOB)).
- Заметим,
что при
чтении
никогда не
происходит
чтения за
меткой
срочности.
Если
приложение
проинформировано
о наличии
срочных
данных с
помощью select(2)
(с
аргументом
exceptfds) или
доставкой
сигнала SIGURG,
то оно
может
переместить
метку
дальше с
помощью
цикла, в
котором
постоянно
проверяется
SIOCATMARK, и
выполнить
чтение
(запросив
любое
количество
байт) пока
SIOCATMARK
возвращает
ложь.
- SIOCOUTQ
- Возвращает
количество
не
отправленных
данных в
очереди
отправки
сокета.
Сокет не
должен
быть в
состоянии
прослушивания
LISTEN, иначе
возвратится
ошибка (EINVAL).
Значение
SIOCOUTQ
определено
в <linux/sockios.h>. Или
же вы
можете
использовать
его аналог
TIOCOUTQ,
определённый
в <sys/ioctl.h>.
Обработка
ошибок
При
возникновении
сетевой
ошибки TCP
пытается
отправить
пакет
повторно.
Если в
течение
некоторого
времени
этого
сделать не
удаётся, то
возвращается
либо ETIMEDOUT,
либо
последняя
ошибка,
произошедшая
в этом
соединении.
Для
некоторых
приложений
требуется
более
быстрое
уведомление
об ошибках.
Это может
быть
выполнено
на уровне
IPPROTO_IP с
помощью
параметра
сокета IP_RECVERR.
Если этот
параметр
включён, то
все
входящие
ошибки
немедленно
передаются
программе
пользователя.
Используйте
этот
параметр
осторожно:
он
приводит к
тому, что TCP
становится
более
чувствительным
к сменам
маршрутов
и другим
событиям,
обычным
для сети.