问题标签 [ip-fragmentation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1418 浏览

tcp - 需要澄清网络层中的数据包分片

我确实了解数据包分段的目的。从答案中,我唯一不明白的是总长度和片段偏移量。我将非常感谢您在解决这个问题时能给我的任何帮助。

下面是问题和答案。

假设主机 A 连接到路由器 R 1,R 1 连接到另一个路由器 R 2,并且 R 2 连接到主机 B。假设包含 900 字节数据和 20 字节 TCP 头的 TCP 消息是传递给主机 A 上的 IP 代码以传递给 B。显示通过三个链路传输的每个数据包中 IP 报头的总长度、标识、DF、MF 和片段偏移字段。假设链路 A-R1 可支持最大帧大小为 1024 字节,包括 14 字节帧头,链路 R1-R2 可支持最大帧大小为 512 字节,包括 8 字节帧头,链路 R2-B最大可支持 512 字节的帧大小,包括 12 字节的帧头。

回答:

0 投票
0 回答
43 浏览

networking - IP 分片 - 如果最后一个分片在其他数据包之前到达怎么办

在碎片数据包的重组过程中,我将碎片数据包放在缓冲区中。在 timeout 到达之前,我看看最后一个片段是否已经到达,我将它们重新组装并传递给上层。

基本问题是如果最后一个片段在其他片段之前到达,重组将如何发生。

另一个疑问是使用片段缓冲区更好的数据结构是什么?将带有标识号的哈希图作为关键帮助吗?

0 投票
2 回答
852 浏览

networking - 如何根据 MTU 值发送数据包

我正在尝试通过 UDP 实现我自己的协议。

正如 Internet 上的许多手册所建议的那样,最好通过发送大小小于 MTU 的数据包来避免 IP 碎片。

我想知道获得最佳消息大小的最佳方法是什么?我应该以某种方式获得 MTU 值(例如,像这样),还是应该将它设置为 1300 或 1400 之类的东西,并希望它不会随着时间的推移而减少或改变?

我听说获取 MTU 值(https://en.wikipedia.org/wiki/Path_MTU_Discovery)存在一些问题,据我所知,这在很大程度上取决于当前路线和其他可能随时间变化的因素。

0 投票
1 回答
266 浏览

tcp - 网络上的 IP 分段失败?

考试问题(没有附加信息):

当一堆 IP 数据报片段通过网络发送,而其中只有一个没有到达目的地时,会发生什么?

我不确定这里是否涉及 ICMP。ICMP 是否向源发送错误报告,报告它需要重新发送同一片段(仅此一个片段)?

问题就在这里,我不知道 IP 片段是使用 UDP 还是 TCP,因此我不知道问题的答案。

(我已在 networkengineering.stackexchange 上发布,但我的问题被拒绝了)

0 投票
1 回答
586 浏览

udp - 建议的数据大小以避免通过 UDP 产生碎片?

我正在设计一个基于 UDP 的系统,需要知道推荐的最大数据包大小。据我所知,以太网 v2的典型 MTU是 1500 字节。但是,如果使用 PPoE,则降至 1492。

这是否意味着我系统的数据部分最大应为 1492 字节以避免典型网络上的碎片,或者我应该忽略 PPoE 并将其设为 1500 字节?

0 投票
1 回答
1252 浏览

tcp - 碎片数据包的 TCP 校验和错误

我正在开发一个使用 Linux TUN 接口的服务器/客户端套接字应用程序。

服务器直接从 TUN 接口获取数据包并将它们传递给客户端,客户端将接收到的数据包直接放入 TUN 接口。

有时,来自 Server_TUN 的数据包需要在 IP 层进行分段,然后才能传输到客户端。

所以在服务器上,我从 TUN 读取一个数据包,开始在 IP 层对其进行分段,然后通过套接字将它们发送给客户端。

实现分片逻辑时,解决方案效果不佳。

在 Client_TUN 上启动 Wireshark 后,我注意到所有传入的碎片数据包都出现 TCP 校验和错误。

线鲨捕获

在给定的屏幕截图中,号称 154 的帧在 155 中重新组装。

但声称 TCP 校验和不正确!

在服务器端,我保持 tcp 数据完整,对于给定的示例,当您在 Wireshark 中看到相反的情况时,我拆分了一个包含 1452 字节(包括 IP 标头)和 30 字节(包括 IP 标头)的数据包

我还检查了服务器上的 TCP 校验和值,它恰好是 0x935e,虽然我不认为校验和卸载对传入的数据包很重要,但我在客户端检查了卸载并且它关闭了。

尽管如此,由于该解决方案现在不起作用,我认为它不是由卸载效应引起的。

您知道为什么 TCP 校验和对于分段数据包可能不正确吗?

0 投票
0 回答
1062 浏览

c - 在服务器发送不分段 UDP 数据包并在客户端接收分段数据包

我用 C 语言创建了一个程序,它使用 UDP 数据包发送数据。

套接字制作不要使用

在服务器上使用 TSHARK 检查(debian 8 KVM 虚拟化),所有数据包都没有分段:

服务器嗅探器

但是在客户端,接收的大数据包是零散的!!

客户端wireshark

然后我想出了一些更有线的东西。IPv4 ID 字段已设置为 0!

我认为这可能是因为不分段效应(因为没有数据包会被分段)。

然后我启动 Openvpn 程序并在服务器上嗅探它的数据包,但数据包的 IPv4 ID != 0 而没有设置分段。

你们知道为什么这会发生在我身上吗?!

编辑:这是服务器副本中的另一个大数据包示例,并从 tshark 结果粘贴。

如您所见,没有设置分段,而所有大于 PMTU 的数据包都将分段接收到客户端。

这是同一服务器上 openvpn 的数据包跟踪示例。就像你看到的那样,至少计算了 IPv4 ID!

0 投票
1 回答
561 浏览

node.js - NodeJS ip 分片

这个问题表明 Node.js Net 模块不处理 ip-fragmentation: Node.js how to handle packet fragmentation with net.Server

我几乎无法想象这是真的,但我找不到任何有关此的文档(如果不难找到有关此的信息,请原谅我:-))。这是真的吗?

如果没有:谢谢,这对我来说是真正安全的一天:-)。

如果是真的:如果我不知道整个数据报有多大,如何处理这个问题?

情况:我有一个与嵌入式系统(Wiznet W5500)的 TCP 连接。MSS(最大段大小,主要等于 MTU - 40)将设置为 536,数据包的大小可变,可能超过 4kb。所以数据包会分多段发送。是否会在收到分段后触发“on data”事件,还是仅在收到整个包裹时触发?

附带问题:数据段(关于 Wiznet 在 MSS 寄存器的解释中所说的)equel 是 ip-fragment 对吗?因此,如果我必须发送 4000 字节(即有效负载)并且 MSS 设置为 536,我将连续收到: segment1: 536bytes payload segment2: 536bytes payload segment3: 536bytes payload segment4: 536bytes payload segment5: 536bytes payload segment6: 536bytes payload segment7: 536bytes payload segment8: 248bytes payload 可能仅在第 8 段之后触发“数据参数”事件,“数据参数”是否包含整个包是否会在每个单独接收的段之后触发“on data”事件?

在继续处理之前,我怎样才能 100% 确定我得到了整个包裹?我想到的解决方案:

  • 数据包的前 2 个字节是整个长度的字节长度,我不断连接接收到的数据,直到接收到尽可能多的字节。如果我收到超过包大小,我会假设这些连续的字节是后续数据包的开始。

我确实相信这个“​​解决方案”有点棘手,我希望它不是必需的。

提前致谢!如果缺少任何信息:对不起,请随时询问:-)。

0 投票
1 回答
497 浏览

android - LTE 是否支持 IP 分片?

我使用各种版本和供应商的 Android:即带有 4.4.4 的三星 Galaxy S4、带有 6.0.1 的小米红米 Note 3 等。

我仅在使用 LTE 时才发现应用程序的一些错误行为,最终导致 IP 数据包碎片化。

为了测试我的发现,我用各种大小 ping 8.8.8.8:

工作得很好

仅在使用 WiFi 时有效。2G、3G 和 LTE 失败。

它是运营商错误,Android错误还是标准?

0 投票
2 回答
889 浏览

networking - 更新分段数据包中的 UDP 校验和

我正在构建一个网络设备。我需要支持 NAT 和 IP 数据包分片。当我更改 UDP 数据包的源地址或目标地址时,我必须更正 UDP 校验和(以及 IP 校验和,但这很简单)。当数据包被分段时,我必须收集所有分段以重新计算校验和。我知道旧地址和新地址。我想:

  1. 取消否定校验和
  2. 减去旧地址
  3. 添加新地址
  4. 重新减少和并取反

这个过程并不总是有效。有没有办法更新校验和而不是从头开始重新计算?

我试过了:

谢谢!

编辑:在下面添加了单元测试代码