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


当前回答

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

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

其他回答

在应用程序级别,应用程序使用TCP作为面向流的协议。TCP则具有段,并抽象了处理不可靠IP数据包的细节。

TCP处理的是段而不是包。每个TCP段都有一个序列号,序列号包含在TCP报头中。 TCP段中实际发送的数据是可变的。

getsockopt有一个在某些操作系统上支持的值,称为TCP_MAXSEG,用于检索最大TCP段大小(MSS)。但并非所有操作系统都支持它。

我不确定你到底想做什么,但如果你想减少缓冲区的大小,你也可以看看:SO_SNDBUF和SO_RCVBUF。

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

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

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

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

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