TCP连接的最大数据包大小是多少,或者如何获得最大数据包大小?
当前回答
似乎互联网上的大多数网站都使用1460字节作为MTU值。有时它是1452,如果你是在VPN上,它会为IPSec头降低更多。
默认窗口大小变化很大,最大可达65535字节。我使用http://tcpcheck.com查看我自己的源IP值,并检查其他互联网供应商正在使用什么。
其他回答
一种解决方案是将套接字选项TCP_MAXSEG (http://linux.die.net/man/7/tcp)设置为一个对底层网络“安全”的值(例如,设置为1400在以太网上是安全的),然后在发送系统调用时使用一个大的缓冲区。 这样可以减少昂贵的系统调用。 内核将拆分数据以匹配MSS。
这样可以避免截断数据,应用程序也不必担心缓冲区太小。
通常,这取决于连接使用的接口。您可以使用ioctl()来获得MTU,如果是以太网,通常可以通过从硬件头的大小减去硬件头的大小来获得最大数据包大小,对于没有VLAN的以太网,硬件头的大小为14。
只有当整个网络的MTU至少有这么大时,才会出现这种情况。TCP可能使用路径MTU发现来减少有效MTU。
问题是,你为什么这么在乎?
似乎互联网上的大多数网站都使用1460字节作为MTU值。有时它是1452,如果你是在VPN上,它会为IPSec头降低更多。
默认窗口大小变化很大,最大可达65535字节。我使用http://tcpcheck.com查看我自己的源IP值,并检查其他互联网供应商正在使用什么。
如果您使用的是Linux机器,“ifconfig eth0 mtu 9000 up”是设置接口mtu的命令。然而,我不得不说,如果网络传输不是那么稳定,大MTU有一些缺点,它可能会使用更多的内核空间内存。
TCP数据包大小的绝对限制是64K(65535字节),但实际上这远远大于您将看到的任何数据包的大小,因为较低的层(例如以太网)具有更小的数据包大小。
例如,以太网的MTU(最大传输单元)是1500字节。某些类型的网络(如令牌环)具有较大的mtu,而某些类型的mtu较小,但每个物理技术的值都是固定的。