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