Eth*_*her 167
TCP数据包大小的绝对限制是64K(65535字节),但实际上这远远大于您将看到的任何数据包的大小,因为较低层(例如以太网)具有较低的数据包大小.
例如,以太网的MTU(最大传输单元)为1500字节.某些类型的网络(如令牌环)具有更大的MTU,并且某些类型具有更小的MTU,但是每个物理技术的值是固定的.
Nek*_*ios 79
这是一个很好的问题,我实际上在工作中遇到了很多.有很多"技术上正确"的答案,如65k和1500.我已经做了很多编写网络接口的工作,使用65k是愚蠢的,1500也可以让你遇到大麻烦.我的工作涉及很多不同的硬件/平台/路由器,说实话,我开始的地方是1400字节.如果你需要超过1400你可以开始上升,你可能会到1450年,有时到1480年?如果您需要更多,那么当然您需要拆分为2个数据包,其中有几个明显的方法.
问题是你正在谈论创建一个数据包并通过TCP写出来,但当然还有标题数据等等,所以你有"行李"让你达到1500或更高......还有一个很多硬件都有下限.
如果你"推它",你可以得到一些非常奇怪的事情.显然,截断的数据或丢失的数据我很少见到.损坏的数据也很少但肯定会发生.
Bri*_*ndy 20
在应用程序级别,应用程序使用TCP作为面向流的协议.TCP依次具有段并且抽象出使用不可靠IP分组的细节.
TCP处理段而不是数据包.每个TCP段具有包含在TCP头部内的序列号.TCP段中发送的实际数据是可变的.
某些操作系统支持getsockopt的值,您可以使用这个值称为TCP_MAXSEG,它检索最大TCP段大小(MSS).但是并非所有操作系统都支持它.
我不确定你要做什么,但如果你想减少使用的缓冲区大小,你也可以考虑:SO_SNDBUF和SO_RCVBUF.
一般来说,这取决于连接所使用的接口。您可以使用 ioctl() 来获取 MTU,如果是以太网,通常可以通过从中减去硬件标头的大小来获得最大数据包大小,对于没有 VLAN 的以太网,该大小为 14。
仅当整个网络中的 MTU 至少如此大时才会出现这种情况。TCP 可能会使用路径 MTU 发现来减少有效 MTU。
问题是,你为什么关心?
TCP API 中没有数据包。
底层协议中经常有数据包,比如当 TCP 通过 IP 完成时,你不感兴趣,因为它们与用户无关,除了你可能不感兴趣的非常微妙的性能优化(根据问题的表述)。
如果您询问send()在一次 API 调用中可以使用的最大字节数是多少,那么这取决于实现和设置。您通常会为最大几千字节的块调用 send() ,并随时准备好让系统拒绝完全或部分接受它,在这种情况下,您将不得不手动管理拆分为更小的块以将您的数据输入到TCP 发送() API。
| 归档时间: |
|
| 查看次数: |
338289 次 |
| 最近记录: |