networking - protocolo - puertos tcp
tamaño máximo de paquete para una conexión TCP (10)
De acuerdo con http://en.wikipedia.org/wiki/Maximum_segment_size , el tamaño predeterminado más grande para un paquete IPV4 en una red 536. Ver RFC 879
¿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?
El tamaño del paquete para una configuración de 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
En el nivel de la aplicación, la aplicación utiliza TCP como un protocolo orientado a la transmisión. El TCP a su vez tiene segmentos y abstrae los detalles del trabajo con paquetes IP no 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 intenta hacer, pero si desea reducir el tamaño del búfer que se utiliza, también podría examinar: SO_SNDBUF y SO_RCVBUF.
En general, esto dependerá de la interfaz que esté usando la conexión. Probablemente pueda usar un ioctl () para obtener el MTU, y si es ethernet, generalmente puede obtener el tamaño máximo de paquete al restarle 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 usar el descubrimiento MTU de ruta para reducir su MTU efectiva.
La pregunta es, ¿por qué te importa?
Esta es una pregunta excelente y en realidad me toco mucho con esto en el trabajo. Hay muchas respuestas "técnicamente correctas" como 65k y 1500. He trabajado mucho escribiendo interfaces de red y usar 65k es una tontería, y 1500 también puede llevarlo a un gran problema. Mi trabajo va en un montón de diferentes hardware / plataformas / enrutadores, y para ser honesto, el lugar donde empiezo es 1400 bytes. Si NECESITA más de 1400, puede comenzar a acercarse, probablemente pueda ir a 1450 y, a veces, a 1480 ''¿verdad? 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ás hablando de crear un paquete de datos y escribirlo a través de TCP, pero por supuesto hay datos de encabezado añadidos, etc., para que tengas "equipaje" que te pone en 1500 o más. Y también un gran cantidad de hardware tiene límites más bajos.
Si lo "presionas" puedes tener algunas cosas realmente raras. Datos truncados, obviamente, o datos perdidos que he visto raramente. Los datos corruptos también rara vez pero ciertamente suceden.
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 (Maximum Transmission Unit) 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ños, pero los valores se fijan para cada tecnología física.
No hay paquetes en TCP API.
Hay paquetes en protocolos subyacentes a menudo, como cuando TCP se realiza a través de IP, que no le interesa, porque no tienen nada que ver con el usuario, excepto por optimizaciones de rendimiento muy delicadas que probablemente no le interesen (según el formulación de la pregunta).
Si pregunta cuál es la cantidad máxima de bytes que puede send()
en una llamada a la API, esto depende de la implementación y la configuración. Por lo general, debe llamar 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 deberá administrar manualmente la división en fragmentos más pequeños para alimentar sus datos en el TCP send () API.
Parece que la mayoría de los sitios web en Internet usan 1460 bytes para el valor de MTU. A veces es 1452 y si está en una VPN caerá aún más para los encabezados de 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 para verificar lo que otros proveedores de Internet están usando.
Si está con máquinas Linux, "ifconfig eth0 mtu 9000 up" es el comando para configurar la MTU para una interfaz. Sin embargo, tengo que decir que una gran MTU tiene algunas desventajas si la transmisión de la red no es tan estable y puede usar más memorias de espacio en el kernel.
Una solución puede ser establecer la opción de socket TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) a un valor que sea "seguro" con la red subyacente (por ejemplo, establecer 1400 para estar seguro en ethernet) y luego use un buffer grande en la llamada al sistema de envío. De esta forma, puede haber menos llamadas al sistema que son costosas. Kernel dividirá los datos para que coincidan con MSS.
De esta forma puede evitar los datos truncados y su aplicación no tiene que preocuparse por los pequeños búferes.