TCP连接的最大数据包大小是多少,或者如何获得最大数据包大小?


当前回答

TCP数据包大小的绝对限制是64K(65535字节),但实际上这远远大于您将看到的任何数据包的大小,因为较低的层(例如以太网)具有更小的数据包大小。

例如,以太网的MTU(最大传输单元)是1500字节。某些类型的网络(如令牌环)具有较大的mtu,而某些类型的mtu较小,但每个物理技术的值都是固定的。

其他回答

通常,这取决于连接使用的接口。您可以使用ioctl()来获得MTU,如果是以太网,通常可以通过从硬件头的大小减去硬件头的大小来获得最大数据包大小,对于没有VLAN的以太网,硬件头的大小为14。

只有当整个网络的MTU至少有这么大时,才会出现这种情况。TCP可能使用路径MTU发现来减少有效MTU。

问题是,你为什么这么在乎?

如果您使用的是Linux机器,“ifconfig eth0 mtu 9000 up”是设置接口mtu的命令。然而,我不得不说,如果网络传输不是那么稳定,大MTU有一些缺点,它可能会使用更多的内核空间内存。

This is an excellent question and I run in to this a lot at work actually. There are a lot of "technically correct" answers such as 65k and 1500. I've done a lot of work writing network interfaces and using 65k is silly, and 1500 can also get you in to big trouble. My work goes on a lot of different hardware / platforms / routers, and to be honest the place I start is 1400 bytes. If you NEED more than 1400 you can start to inch your way up, you can probably go to 1450 and sometimes to 1480'ish? If you need more than that then of course you need to split in to 2 packets, of which there are several obvious ways of doing..

问题是,您正在谈论创建一个数据包并通过TCP将其写入,但当然还有附加的头数据等等,因此您有“包袱”,使您达到1500或更多。而且很多硬件都有下限。

如果你“推它”,你会看到一些非常奇怪的事情发生。显然,我很少看到被截断的数据,或者丢失的数据。损坏的数据也很少发生,但肯定会发生。

根据http://en.wikipedia.org/wiki/Maximum_segment_size的说法,网络上IPV4数据包的默认最大大小是536字节(字节大小为8位)。参见RFC 879

似乎互联网上的大多数网站都使用1460字节作为MTU值。有时它是1452,如果你是在VPN上,它会为IPSec头降低更多。

默认窗口大小变化很大,最大可达65535字节。我使用http://tcpcheck.com查看我自己的源IP值,并检查其他互联网供应商正在使用什么。