En el protocolo UDP, un socket se identifica de forma exclusiva por la IP de origen y el puerto de origen.
En el protocolo TCP, el socket se identifica de forma exclusiva por la IP de origen, el puerto de origen, la IP de destino y el puerto de destino. ¿Por qué el protocolo TCP requiere dos datos adicionales?
NB para la terminología TCP, el socket es el par dirección-puerto; Un par de enchufes define la conexión . (Por RFC 793 p5)
Me temo que está equivocado acerca de UDP, que aunque en realidad no tiene "sockets", incluso si la biblioteca Berkeley Sockets los llama así, y es razonable llamar a un par de dirección-puerto, multiplexa en esencialmente la forma idéntica a TCP.
Una situación típica en la que puede ver esto es el caso de múltiples resoluciones DNS simultáneas de un host al mismo servidor DNS, donde claramente solo el número de puerto de origen es necesariamente diferente. Puede ver que esta es exactamente la misma situación que las conexiones TCP simultáneas múltiples desde un cliente a un único servidor web.
UDP tiene datagramas sin conexión. El host A envía el datagrama fuera de un par de dirección-puerto, dirigido a un par de dirección-puerto en B, que típicamente, pero no siempre, responde por duplicado. Hablando más libremente de la "comunicación", opera exactamente sobre la misma tupla de 4 que una conexión TCP.
A veces verá referencias a una tupla de 5 (protocolo, dirección de origen, puerto de origen, dirección de destino, puerto de destino), donde el protocolo sería 17 para UDP, 6 para TCP, etc. Esto es lo que utilizan la mayoría de los firewalls, enrutadores, etc. NAT y operaciones similares para identificar este par comunicante.
a pesar de que el servidor ha establecido un socket TCP específicamente para esa sesión en un puerto diferente
Me temo que también está equivocado sobre TCP, posiblemente debido al conflicto de terminología entre la definición del protocolo TCP (RFC 793) y su implementación práctica más común, Berkeley Sockets Library, como se usa en Unix y todo lo que se deriva de eso.
Si se enfoca en el protocolo, es mucho más claro: no hay un "puerto diferente". El servidor web solo está escuchando, por ejemplo, 1.1.1.1 puerto 80. El cliente solo envía desde, por ejemplo, 2.2.2.2 puerto 56789. Cada paquete será 1.1.1.1:80 a 2.2.2.2:56789 o viceversa ; se verifica fácilmente mirando paquetes con tcpdump / wireshark / etc.
(Para muy breve digresión a la aplicación de Berkeley, un TCP de conexión está representado por un número entero por lo general, pero confusamente llamado sockfd
; una red TCP socket está representado por una struct sockaddr
La. accept()
Llamada al sistema muy confusamente habla de hacer un "nuevo socket conectado", por el cual significa nueva conexiónestructura en el estado conectado. La tupla de esta cosa resultante estaría en nuestro ejemplo (1.1.1.1, 80, 2.2.2.2, 56789). Con respecto a UDP, la biblioteca le permite considerar UDP como conectado, lo cual es una forma conveniente, aunque completamente incorrecta, de describir el intercambio de datagramas UDP entre dos procesos, y solo significa que la estructura recuerda el par de direcciones y puertos lejanos, que en términos de programación hace que UDP "conexión" se parece a una TCP. Recuerde que la biblioteca Berkeley no es solo para IP, y tiene generalizaciones de varios sistemas de redes subyacentes diferentes. Si desea seguir estos términos de programación de red, sugiero Stack Overflow, que tiene muchos programadores de red muy competentes).