Networking TCP连接的最大数据包大小

Networking TCP连接的最大数据包大小,networking,tcp,Networking,Tcp,TCP连接的最大数据包大小是多少,或者如何获得最大数据包大小?通常,这取决于连接使用的接口。您可能可以使用ioctl()获取MTU,如果是以太网,通常可以通过减去硬件头的大小来获取最大数据包大小,对于没有VLAN的以太网,最大数据包大小为14 只有当MTU在整个网络中至少如此大时,才会出现这种情况。TCP可能使用路径MTU发现来减少有效MTU 问题是,你为什么在意呢?TCP API中没有数据包 底层协议中经常有数据包,比如TCP是通过IP完成的,您对此不感兴趣,因为它们与用户无关,除了您可能不感

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

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

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


问题是,你为什么在意呢?

TCP API中没有数据包

底层协议中经常有数据包,比如TCP是通过IP完成的,您对此不感兴趣,因为它们与用户无关,除了您可能不感兴趣的非常微妙的性能优化(根据问题的公式)


如果您询问在一个API调用中可以
send()
的最大字节数是多少,那么这取决于实现和设置。通常情况下,您会调用send()以获取多达数千字节的数据块,并随时准备让系统拒绝全部或部分接收该数据块,在这种情况下,您必须手动将数据块拆分为较小的数据块,以将数据提供给TCP send()API。

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

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

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


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

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


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

这是一个很好的问题,我在实际工作中经常遇到这个问题。有很多“技术上正确”的答案,比如65k和1500。我在编写网络接口方面做了很多工作,使用65k是愚蠢的,1500也会给你带来大麻烦。我的工作涉及很多不同的硬件/平台/路由器,老实说,我的起点是1400字节。如果你需要超过1400英镑,你可以开始慢慢往上爬,你可能会到1450英镑,有时甚至到1480英镑?如果你需要更多,那么你当然需要分成两个包,其中有几种明显的方法

问题是,您正在谈论创建一个数据包并通过TCP将其写出来,但当然还有附加的头数据等等,所以您的“行李”会将您带到1500或更高。。而且很多硬件都有较低的限制


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

根据,网络上IPV4数据包的默认最大大小为536个八位字节(字节大小为8位)。请参见

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

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


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

似乎互联网上的大多数网站使用1460字节作为MTU值。有时是1452,如果您使用的是VPN,则IPSec报头会下降更多


默认窗口大小变化很大,最大为65535字节。我通常查看自己的源IP值,并检查其他Internet供应商正在使用什么。

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

这将仅获得第一条链路上的最大数据包大小。据我所知,路径上的任何其他节点都被允许不喜欢大数据包,并且它可能会在路径上的任何位置被拆分。是的,这是真的。。。所以你的问题很好——你为什么想要这个?我想通过lan连接传输视频/图像因为TCP是面向流的,为什么这很重要?TCP是基于流的。您担心单个数据包有什么具体原因吗?因为它下面的层是基于数据包的…典型实现->第1层-以太网物理层,第2层-以太网MAC(MAC数据包定义,第3层-互联网协议(IP数据包定义),第4层-TCP(传输控制协议)-在其下方使用基于数据包的服务。没有“TCP数据包”这样的东西。有TCP段,其长度由32位字描述,它们包含在IP数据包内或跨IP数据包,其长度由16位描述。还有以太网帧,其中包含所有这些东西。您在询问这些东西中的哪一个任何情况下,如果你是你