2009-12-23 15 views
15

¿Cuándo se requiere IPPROTO_UDP?¿Cuándo se requiere IPPROTO_UDP?

¿Hay algún caso en que UDP sea no el protocolo predeterminado para SOCK_DGRAM? (Casos reales, no hipotético "Podría ser", por favor ")

es decir, cuáles son las situaciones en las que las dos líneas siguientes se no producir un comportamiento idéntico

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

Respuesta

12

Dadas estas declaraciones:?

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

la ip(7) página del manual en Linux dice:

Los únicos valores válidos para el protocolo son 0 e IPPROTO_TCP para sockets TCP, y 0 e IPPROTO_UDP para sockets UDP. Para SOCK_RAW puede especificar un protocolo de IANA IP válido definido en RFC 1700 números asignados.

Esas dos líneas en sus preguntas siempre producirán el mismo resultado.

+0

Creo que usar 'IPPROTO_UDP' en el inicio de cero no es el mismo resultado ya que se obtiene un socket que requiere que complete todos los encabezados. – WilliamKF

14

Algunos sistemas operativos (por ejemplo, kernel Linux después de 2.6.20) admiten un segundo protocolo para SOCK_DGRAM, llamado UDP-Lite. Si su sistema lo admite, se habilitaría proporcionando IPPROTO_UDPLITE como el tercer argumento de la llamada socket().

Se diferencia del UDP normal al permitir que se aplique la suma de comprobación solo a una parte del datagrama. (Normalmente, la suma de comprobación de UDP es un esfuerzo de todo o nada.) De esta forma, el protocolo puede ser más resistente a las fallas de suma de comprobación debido a la transmisión fragmentada, en el caso de que algunos fragmentos fuera del área de suma de comprobación se hayan perdido en tránsito. Siempre que los fragmentos que cubren la porción de suma de comprobación se hayan recibido con éxito, la mayor parte del datagrama posible se entregará a la aplicación.

Por compatibilidad con versiones anteriores con el código existente, sospecho (pero no puedo garantizar) que el socket de llamada (AF_INET, SOCK_DGRAM, 0) continuará por defecto al UDP normal, incluso en sistemas que admiten UDP-Lite.

Cuestiones relacionadas