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


当前回答

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

其他回答

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

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

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

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

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

TCP API中没有包。

底层协议中通常有一些数据包,比如TCP在IP上运行时,你对这些数据包不感兴趣,因为它们与用户没有任何关系,除了非常微妙的性能优化,你可能对这些性能优化不感兴趣(根据问题的提法)。

如果你问在一个API调用中可以发送()的最大字节数是多少,那么这取决于实现和设置。您通常会调用send()来获取最多几千字节的数据块,并随时准备好系统完全或部分拒绝接受它,在这种情况下,您必须手动管理将数据分割为更小的数据块,以便将数据送入TCP send() API。

IP协议(Ip4)中TCP设置的包大小。对于这个字段(TL),分配了16位,因此数据包的最大大小为65535字节:IP协议细节

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或更多。而且很多硬件都有下限。

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