TCP连接的最大数据包大小是多少,或者如何获得最大数据包大小?
答案 0 :(得分:151)
TCP数据包大小的绝对限制是64K(65535字节),但实际上这远远大于您将看到的任何数据包的大小,因为较低层(例如以太网)具有较低的数据包大小。
例如,以太网的MTU(最大传输单元)为1500字节。某些类型的网络(如令牌环)具有较大的MTU,而某些类型的MTU较小,但每种物理技术的值都是固定的。
答案 1 :(得分:74)
这是一个很好的问题,我实际上在工作中遇到了很多。有很多“技术上正确”的答案,如65k和1500.我已经做了很多编写网络接口的工作,使用65k是愚蠢的,1500也可以让你遇到大麻烦。我的工作涉及很多不同的硬件/平台/路由器,说实话,我开始的地方是1400字节。如果你需要超过1400你可以开始上升,你可能会到1450年,有时到1480年?如果您需要更多,那么当然您需要分成2个数据包,其中有几个明显的方法...
问题在于你正在谈论创建一个数据包并通过TCP写出来,但当然还有标题数据等等,所以你有“行李”让你达到1500或更高......而且很多硬件都有下限。
如果你“推它”,你可以得到一些非常奇怪的事情。显然,截断的数据或丢失的数据我很少见到。损坏的数据也很少但肯定会发生。
答案 2 :(得分:17)
在应用程序级别,应用程序使用TCP作为面向流的协议。 TCP依次具有段并且抽象出使用不可靠IP分组的细节。
TCP处理段而不是数据包。每个TCP段都有一个包含在TCP头内的序列号。 TCP段中发送的实际数据是可变的。
某些可以使用的操作系统支持getsockopt的值,称为TCP_MAXSEG,用于检索最大TCP段大小(MSS)。但是并不是所有操作系统都支持它。
我不确定你要做什么,但是如果你想减少使用的缓冲区大小,你也可以考虑:SO_SNDBUF和SO_RCVBUF。
答案 3 :(得分:6)
根据http://en.wikipedia.org/wiki/Maximum_segment_size,网络上IPV4数据包的默认最大大小为536个八位字节(大小为8位的字节)。见RFC 879
答案 4 :(得分:4)
TCP API中没有数据包。
基础协议中经常有数据包,比如TCP通过IP完成,你不感兴趣,因为它们与用户无关,除非你可能不感兴趣的非常微妙的性能优化(根据问题的提法)。
如果您在一次API调用中询问可以send()
的最大字节数是多少,那么这取决于实现和设置。您通常会调用send()来获取高达几千字节的块,并且随时准备系统拒绝完全或部分接受它,在这种情况下,您必须手动管理拆分为较小的块以将数据提供给TCP send()API。
答案 5 :(得分:3)
通常,这取决于连接使用的接口。您可以使用ioctl()来获取MTU,如果它是以太网,您通常可以通过从中减去硬件头的大小来获得最大数据包大小,对于没有VLAN的以太网,这是14。
仅当MTU在整个网络中至少那么大时才会出现这种情况。 TCP可能会使用路径MTU发现来降低您的有效MTU。
问题是,你为什么关心?
答案 6 :(得分:3)
如果您使用的是Linux机器,“ifconfig eth0 mtu 9000 up”是设置接口MTU的命令。但是,我不得不说,如果网络传输不那么稳定,大MTU会有一些缺点,它可能会使用更多的内核空间内存。
答案 7 :(得分:2)
一种解决方案是将套接字选项TCP_MAXSEG(http://linux.die.net/man/7/tcp)设置为与底层网络“安全”的值(例如设置为1400以便在以太网上安全)然后在发送系统中使用大缓冲区呼叫。 这样可以减少昂贵的系统调用。 内核将拆分数据以匹配MSS。
通过这种方式,您可以避免截断数据,并且您的应用程序不必担心小缓冲区。
答案 8 :(得分:2)
似乎互联网上的大多数网站使用1460字节作为MTU的值。有时它是1452,如果你在VPN上,IPSec标题会下降得更多。
默认窗口大小变化很大,最大为65535字节。我使用http://tcpcheck.com查看自己的源IP值并检查其他Internet供应商正在使用的内容。
答案 9 :(得分:2)
IP协议(Ip4)中TCP设置的数据包大小。对于此字段(TL),分配了16位,因此数据包的最大大小为65535字节:IP protocol details