¿Cuál es el tamaño máximo de paquete para una conexión TCP o cómo puedo obtener el tamaño máximo de paquete?
¿Cuál es el tamaño máximo de paquete para una conexión TCP o cómo puedo obtener el tamaño máximo de paquete?
Respuestas:
La limitación absoluta en el tamaño del paquete TCP es 64K (65535 bytes), pero en la práctica esto es mucho más grande que el tamaño de cualquier paquete que verá, porque las capas más bajas (por ejemplo, ethernet) tienen tamaños de paquete más bajos.
La MTU (Unidad de transmisión máxima) para Ethernet, por ejemplo, es de 1500 bytes. Algunos tipos de redes (como Token Ring) tienen MTU más grandes, y algunos tipos tienen MTU más pequeñas, pero los valores son fijos para cada tecnología física.
Esta es una excelente pregunta y realmente me encuentro con esto en el trabajo. Hay muchas respuestas "técnicamente correctas", como 65k y 1500. He trabajado mucho escribiendo interfaces de red y usando 65k es una tontería, y 1500 también puede meterte en grandes problemas. Mi trabajo abarca muchos hardware / plataformas / enrutadores diferentes, y para ser sincero, el lugar donde empiezo es 1400 bytes. Si NECESITAS más de 1400, puedes comenzar a aumentar poco a poco, ¿probablemente puedas ir a 1450 y a veces a 1480? Si necesita más que eso, por supuesto, necesita dividirlo en 2 paquetes, de los cuales hay varias formas obvias de hacerlo ...
El problema es que está hablando de crear un paquete de datos y escribirlo a través de TCP, pero, por supuesto, hay datos de encabezado añadidos y demás, por lo que tiene un "equipaje" que lo lleva a 1500 o más ... y también a gran cantidad de hardware tiene límites inferiores.
Si lo "empujas", puedes hacer que ocurran algunas cosas realmente extrañas. Datos truncados, obviamente, o datos descartados que he visto raramente. Los datos dañados también rara vez, pero ciertamente suceden.
send()
si es conveniente.
1480'ish
deberías ser 1460
. El encabezado IP y el encabezado TCP ocupan al menos 20 bytes cada uno (a menos que se usen campos de encabezado opcionales) y, por lo tanto, el máximo para Ethernet (no Jumbo frame) es 1500 - 20 -20 = 1460
.
A nivel de la aplicación, la aplicación utiliza TCP como un protocolo orientado a la transmisión. TCP a su vez tiene segmentos y extrae los detalles de trabajar con paquetes IP poco confiables.
TCP trata con segmentos en lugar de paquetes. Cada segmento TCP tiene un número de secuencia que está contenido dentro de un encabezado TCP. Los datos reales enviados en un segmento TCP son variables.
Hay un valor para getsockopt que es compatible con algunos sistemas operativos que puede usar llamado TCP_MAXSEG que recupera el tamaño máximo de segmento TCP (MSS). Sin embargo, no es compatible con todos los sistemas operativos.
No estoy seguro de qué es exactamente lo que está tratando de hacer, pero si desea reducir el tamaño del búfer que se usa, también puede consultar: SO_SNDBUF y SO_RCVBUF.
Según http://en.wikipedia.org/wiki/Maximum_segment_size , el tamaño más grande predeterminado para un paquete IPV4 en una red es 536 octetos (bytes de tamaño 8 bits). Ver RFC 879
No hay paquetes en la API TCP.
A menudo hay paquetes en los protocolos subyacentes, como cuando TCP se realiza sobre IP, en los que no tiene interés, porque no tienen nada que ver con el usuario, excepto las optimizaciones de rendimiento muy delicadas que probablemente no le interesen (de acuerdo con formulación de la pregunta).
Si pregunta cuál es el número máximo de bytes que puede send()
en una llamada API, esto depende de la implementación y la configuración. Por lo general, llamaría a send () para fragmentos de hasta varios kilobytes, y siempre estará listo para que el sistema se niegue a aceptarlo total o parcialmente, en cuyo caso tendrá que gestionar manualmente la división en fragmentos más pequeños para alimentar sus datos en el TCP send () API.
En general, esto dependerá de la interfaz que utilice la conexión. Probablemente pueda usar un ioctl () para obtener la MTU, y si es ethernet, generalmente puede obtener el tamaño máximo de paquete restando el tamaño del encabezado de hardware, que es 14 para ethernet sin VLAN.
Este es solo el caso si la MTU es al menos tan grande en toda la red. TCP puede utilizar el descubrimiento de MTU de ruta para reducir su MTU efectiva.
La pregunta es, ¿por qué te importa?
Si está con máquinas Linux, "ifconfig eth0 mtu 9000 up" es el comando para configurar la MTU para una interfaz. Sin embargo, debo decir que la gran MTU tiene algunas desventajas si la transmisión de la red no es tan estable y puede usar más memorias de espacio del núcleo.
Parece que la mayoría de los sitios web en Internet usan 1460 bytes por el valor de MTU. A veces es 1452 y si está en una VPN, caerá aún más para los encabezados IPSec.
El tamaño predeterminado de la ventana varía bastante hasta un máximo de 65535 bytes. Utilizo http://tcpcheck.com para ver mis propios valores de IP de origen y verificar qué otros proveedores de Internet están utilizando.
Una solución puede ser establecer la opción de socket TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) en un valor que sea "seguro" con la red subyacente (por ejemplo, establecer en 1400 para que sea seguro en Ethernet) y luego use un búfer grande en la llamada al sistema de envío. De esta manera puede haber menos llamadas al sistema que son caras. Kernel dividirá los datos para que coincidan con MSS.
De esta manera, puede evitar datos truncados y su aplicación no tiene que preocuparse por pequeños buffers.
El tamaño del paquete para una configuración TCP en el protocolo IP (Ip4). Para este campo (TL), se asignan 16 bits, en consecuencia, el tamaño máximo del paquete es 65535 bytes: detalles del protocolo IP