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

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

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

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

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

Ответы

Ответ 1

Учитывая эти объявления:

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 назначенные номера.

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

Ответ 2

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

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

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