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


当前回答

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

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

其他回答

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

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

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

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

一种解决方案是将套接字选项TCP_MAXSEG (http://linux.die.net/man/7/tcp)设置为一个对底层网络“安全”的值(例如,设置为1400在以太网上是安全的),然后在发送系统调用时使用一个大的缓冲区。 这样可以减少昂贵的系统调用。 内核将拆分数据以匹配MSS。

这样可以避免截断数据,应用程序也不必担心缓冲区太小。

TCP API中没有包。

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

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

如果您使用的是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或更多。而且很多硬件都有下限。

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