когда требуется IPPROTO_UDP? - PullRequest
22 голосов
/ 23 декабря 2009

Когда требуется IPPROTO_UDP?

Есть ли когда-нибудь случай, когда UDP является , а не протоколом по умолчанию для SOCK_DGRAM? (реальные случаи, а не гипотетическое "это может быть", пожалуйста ")

Т.е., в каких ситуациях следующие две строки не приводят к одинаковому поведению?

if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
if ((s=socket(AF_INET, SOCK_DGRAM, 0))==-1)

Ответы [ 2 ]

15 голосов
/ 26 января 2011

Некоторые операционные системы (например, ядро ​​Linux после 2.6.20) поддерживают второй протокол для SOCK_DGRAM, который называется UDP-Lite. Если эта функция поддерживается вашей системой, она будет включена путем предоставления IPPROTO_UDPLITE в качестве третьего аргумента вызова socket ().

Он отличается от обычного UDP тем, что позволяет применять контрольные суммы только к части дейтаграммы. (Как правило, контрольное суммирование UDP является попыткой «все или ничего».) Таким образом, протокол может быть более устойчивым к сбоям контрольной суммы из-за фрагментированной передачи, в случае, если некоторые фрагменты за пределами области контрольной суммы могут быть потеряны при передаче. До тех пор, пока фрагменты, покрывающие часть контрольной суммы, были успешно получены, как можно большая часть дейтаграммы будет доставлена ​​приложению.

Для обратной совместимости с существующим кодом, я подозреваю (но я не могу гарантировать), что сокет вызова (AF_INET, SOCK_DGRAM, 0) будет по умолчанию возвращаться к обычному UDP, даже в системах, которые дополнительно поддерживают UDP-Lite.

15 голосов
/ 23 декабря 2009

С учетом этих деклараций:

tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
raw_socket = socket(AF_INET, SOCK_RAW, protocol);

Страница руководства ip (7) в linux гласит:

Единственными действительными значениями для протокола являются 0 и IPPROTO_TCP для сокетов TCP, и 0 и IPPROTO_UDP для сокетов UDP. Для SOCK_RAW вы можете указать действительный Протокол IANA IP, определенный в RFC 1700 присвоенные номера.

Эти две строки в ваших вопросах всегда будут давать один и тот же результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...