问题标签 [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 投票
2 回答
690 浏览

node.js - IP 碎片化:这仍然是常态,对吧?

自从我在 PDP/11 上进行套接字编程以来,IP 分段将处理 IP 数据报(例如 UDP 数据报)大于该段允许的 MTU 的情况。

因此,我可以发送一个大小为 30 kB 的 UDP 数据报,它可能会在以太网上分段为 20 个 1.5 kB 的分段,然后稍后将每个分段分段为三个小于 576 字节的分段,用于某些特定的无线链路,只要所有碎片到达另一端,UDP数据报到达另一端。

然后,我遇到了 node.js 中 UDP 套接字的文档,该文档声称路由器将丢弃不适合下一段 MTU 的数据报。我认为这只是在标头中设置了“不分段”位的数据报的情况,但鉴于 node.js 应该是在网络圈子中具有一定可信度的高质量产品,我想知道我是否遗漏了一些东西,许多路由器现在会将所有数据报视为“不分段?”

这是链接: http ://nodejs.org/api/dgram.html#dgram_socket_send_buf_offset_length_port_address_callback

这是报价:

那么,我错过了什么,还是 node.js 文档需要更新?

0 投票
0 回答
282 浏览

packet-sniffers - WinPCap 数据包重组

我正在使用 WinPCap 编写一个应用程序,它将捕获网络上的数据包并允许我对我们的一些网络应用程序进行故障排除。一切正常,直到数据包被分段。

WinPCap 似乎向我发送了错误的数据包偏移量和碎片选项。

这是每个数据包的数据。

我总是得到 5 个带有这些值的数据包(我每次都发送相同的测试数据)。我认为偏移量和选项应该根据数据包而改变,这样我就可以正确地重新组装有效载荷数据。

我现在不知道如何使用 WinPCap 来获取任何碎片的数据包数据。

有人有想法么?任何帮助将不胜感激。

0 投票
1 回答
1471 浏览

.net - Socket 会将 IP 分段数据包作为一个重新组装的 UDP 数据包传送吗?

接收 TCP 数据包时,Socket会给我重新组装的数据包,以防它们被 IP 分段,因为我保证得到有序的、无间隙的字节流。

当接收 UDP 数据包时,我可能会以与发送不同的顺序接收数据包,或者重复接收数据包,并且其他数据包可能会在此过程中丢失,我希望每个 UDP/IP 数据包在到达时立即“原始”。另一方面,由于我没有得到 IP 标头,我无法自己重新组装数据包。换句话说,我必须依靠Socket为我做这项工作。但这意味着,对于单独的重组,(分段的)数据包必须被缓冲、排序、重复数据删除和丢弃,如果一个片段没有成功的话。

这在现实中如何运作?

0 投票
1 回答
528 浏览

php - PHP SNMP v2 Walk 分片/阻塞

在 PHP 中使用 snmp v2 时如何设置最大消息大小?

我正在使用 PHP 对设备进行 SNMP 遍历,并且我的组织有非常严格的防火墙。我遇到了一个问题,如果数据包更大并且碎片化,(snmp2_real_walk 或 snmp2_walk)会导致我的生产服务器超时。我想知道是否有办法将最大数据包大小设置为更小以防止碎片。

我在 Ubuntu 12.04 和 Net-SNMP 5.4.3 上使用 php 5.4.10。

当我捕获流量时,事实证明 snmp2_real_walk 正在使用 getBulkRequest。我收到一个响应,说数据包是分段的,以及一个较小的后续数据包。在我的本地机器上,除了防火墙之外的相同环境,这有效。在我的生产机器上,它失败了。

如果我通过命令行调用它,它适用于较小的数据包。我不明白为什么。必须有一种方法来设置数据包/消息的大小,对吧?

(删除敏感数据)。

0 投票
2 回答
2146 浏览

python - Scapy 无法对 IPv6 数据包进行分段

我目前正在从事有关 IPv6 安全性的项目。我正在尝试复制在此处找到的本文档中的结果:https ://www.tno.nl/downloads/testing_the_security_of_IPv6_implementations.pdf

向下滚动到第 4.4 节,第 29 页。

我想测试创建具有无限扩展标头的数据包实际上是否能够使系统崩溃。我一次又一次遇到的问题是,根据文档运行脚本时,我不断收到错误消息:

我需要对数据包进行分段。否则我将无法创建这个无穷无尽的扩展标题流。我正在 Debian 7 Wheezy 系统上测试它并使用 Python 2.7。

这是我正在运行的脚本:

我一直在四处寻找,但找不到任何具有相同错误的东西。我希望有人能帮帮忙。

0 投票
1 回答
1353 浏览

linux - 为什么 Linux IPSec 实现不支持加密前分片?

我正在尝试解决 ESP 数据包碎片化的问题,因为在添加 ESP 标头后超出了 MTU 大小。解决方案(每个人都这样做)是在进行 ESP 加密之前进行分段。

我的问题是,如果这很有用,为什么 Linux IPSec 实现本身不支持它。我了解 L4 流量选择器无法工作的某些限制。但并不是每个人都使用它。

此外,如果您可以分享有关添加此支持的最佳方式的任何指示,那将真的很有帮助。

谢谢。

0 投票
2 回答
4317 浏览

sockets - ip碎片有多严重

我知道在发送 ip 消息时,be 和我的数据包目的地之间的网络路径中的每一跳都会检查下一跳的 MTU 是否大于我发送的数据包的大小。如果是这样,数据包将被分片,两个数据包将分别发送到下一跳,仅在目的地(或者,在某些情况下,在遇到的第一个 NAT 路由器)重新组合。据我了解,这件事可能很糟糕,但我真的不明白为什么。

  • 我知道如果连接倾向于丢弃很多数据包,丢失一个片段意味着我必须重新发送整个数据包(这实际上是我自己想出的唯一事情)
  • 是否有可能我的数据包不会被分段而不是被丢弃?
  • 如何识别数据包碎片?我可以 100% 确定它们会正确重新组装吗?例如,如果我几乎同时向同一个目的地发送两个相同长度的 ip 数据包,那么两者的片段交换的可能性有多大,例如 AAA、BBB 重新组合成 ABA、BAB?

原则上,如果数据包没有被丢弃并且片段被正确重组,那么实际上使用数据包分段似乎是一个好主意,可以节省本地带宽并避免发送越来越多的标头而不仅仅是一个大数据包。

谢谢

0 投票
2 回答
1292 浏览

c - 是否可以使用 libnetfilter_queue 访问 ip 片段

我在 C 中使用libnetfilter_queue来捕获数据包。我正在设置一个 iptable 规则来排队传入的数据包,这些数据包稍后将由用户空间实现处理,如下所示iptables -A INPUT -j NFQUEUE --queue-num 0:我使用nfqnl_test示例作为实现捕获的框架。一切都按预期工作。但是,我注意到不可能在 ip 片段级别检查队列。也就是说,如果一个数据包是以片段的形式进来的,它在被放入队列之前首先被重新组装。但我想使用片段。那么有没有办法强制执行这种行为?我想要的是一个队列,我可以在其中观察原始传入数据包(碎片和未碎片),以便我能够相应地对它们采取行动。

我读到重组确实发生过。另一方面,使用 iptables 有-f可用的标志,所以应该有我正在寻找的“碎片粒度”。我也尝试过调整 iptable 规则(例如iptables -t raw -D PREROUTING -i eth0 -j NFQUEUE --queue-num 0),但结果还是一样。我只能观察到已经重组的数据包,我肯定知道它是分段到达的。

非常感谢任何帮助。

0 投票
1 回答
2392 浏览

erlang - 如何更改 Erlang 中 UDP 数据包的不分段(DF)标志?

在 Erlang 中,发送数据包很简单UDP,就是gen_udp:open()用来创建一个套接字,然后gen_udp:send()用来发送数据。

但是,默认情况下,TCP/IP如果 IP 数据包的大小不超过 MTU 大小,Linux 堆栈将在 IP 标头中设置不分段 (DF) 标志。如果大小超过MTU大小,UDP数据包将被分片。

有没有办法UDP只为数据包设置 DF 标志?

我知道在 C 语言中,以下代码可用于清除 DF 标志。但我在 Erlang 中找不到方法。

谢谢

0 投票
1 回答
678 浏览

linux-kernel - Linux Netfilter:在碎片整理之前将数据包排队到用户空间

问题是:如何在分片之前使用 netfilter NFQUEUE将数据包排入用户空间?

根据Linux 内核源码nf_defrag_ipv4安装在NF_INET_PRE_ROUTING(在 iptables/nftables 中称为 PREROUTING)和NF_INET_LOCAL_OUT(OUTPUT)。

所以我尝试了以下反碎片整理 nftables 过滤器(原文:https : //stackoverflow.com/a/30638753/5167443 )NF_INET_LOCAL_OUT,但我仍然收到碎片数据包。

在上面的过滤器中,-450代表优先级在NF_IP_PRI_CONNTRACK_DEFRAG=-400. 即,过滤器应该在之前工作nf_defrag_ipv4

我使用的是 Linux 3.19 (Ubuntu 15.04),这是我自己libnetfilter_queue.so.1.