问题标签 [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.
python - 使用 Scapy 发送带有随机偏移量的分片包
我想发送 8 字节大小的分段数据包和随机起始偏移量。还想遗漏最后一个碎片数据包。
到目前为止,我得到了一切,除了片段
上面的代码是做什么的?它将大小为 8 字节的 IP 片段数据包发送到目标 IP 地址。
我想发送带有随机片段偏移量的 IP 片段数据包。我找不到任何关于fragment()
我能够编辑的唯一字段是在 IP 数据包中,而不是在每个分段的 IP 数据包中。
有人有办法做到这一点吗?
信息:Python2.7,最新版本的 scapy (pip)
java - 为 UDP 套接字程序设置的 DF 位
我在Java中尝试了一个简单的UDP套接字代码,分析表明DF位总是设置在数据包的IP头中,有没有办法清除标志?
我也在 TCP 中尝试了一个代码,服务器和客户端代码都在同一台机器上。只是想知道标志是否有默认设置,如果没有,如何清除它。
networking - IPV6 分片中的分片大小
我正在尝试使用 IPV6 进行分段。使用 scapy 制作数据包。我的有效负载大小为 1400 字节,选择的片段大小为 500 字节并发送 3 个片段,这样最后一个片段就永远不会发送。我看到 scapy 正在生成有效负载大小为 432 字节的片段。片段扩展头大约 8 个字节。IPV6 标头为 40 个字节。
如果我们将其全部加起来,那么片段大小将达到 480 字节,而我已将其指定为 500 字节。这个计算是如何进行的?片段有效负载大小是如何决定为 432 字节的?
c - 在链接聚合方案中禁用 IP 重组/碎片整理
下图描述了一个网络,该网络涉及三个慢速通道吞吐量的聚合WAN
。每台路由器都试图重新组装分段的 IP 数据包,这会导致数据丢失,因为这些分段采用随机路径通过三个路由器,并且通常一台路由器无法收集所有数据包分段以成功重组。
来自快速主机的 IP 流量分段并随机到达三个路由器(但始终来自54.239.98.8
)。我无法控制这种碎片化(企业政治,去看看) - 我怀疑碎片化是由快速主机故意完成的。
我修改了内核模块nf_defrag_ipv4
以禁用PREROUTING
钩子中的有问题的碎片整理,如下所示:
该模块的完整源代码可以在这里查看。
有更好的解决方案吗?特别是一种仅对来自 WAN @ 上的快速主机的数据包选择性禁用 IP 碎片整理的方法ip.src == 54.239.98.8
。
(@)上的快速主机正在与( @ )WAN
上54.239.98.8
的主机通信,后者通过三个慢速通道连接到运行 Linux v4.14.151 和/防火墙的三个路由器:LAN
192.168.0.100
WAN
netfilter
iptables
networking - Determine if IPv4 packet is fragmented
What is the right way to test if IP packet is a fragment?
Currently I only look at MF
(More Fragments) bit in the IPv4 header. Is it sufficient?
tcp - 在 Linux 上清除不分段位
我有一个测试要求,要求我明确不要对流经 Linux 机器(cent-OS)的数据包进行分段。
我尝试设置 net.ipv4.ip_forward_use_pmtu=1 但它似乎只禁用 MTU 路径发现并且不清除 DF 位。
清除数据包上的 DF 位的方法/方法是什么?
tcp - 视频流协议 - 处理碎片
最近我试图通过 udp 流式传输由网络摄像头捕获的实时视频。我采用的方法是读取一帧,通过 udp 发送并在接收端读取数据并显示它。
现在,我知道通过 udp/tcp 发送数据会导致碎片化,这种碎片化会以任何随机方式发生,具体取决于传输层的 MTU,并且底层 IP 协议并不能保证将交付的帧数。任何数据层的最小 MTU 被称为 1500 字节。
但是,我的每一帧都是 1MB(~1048576 字节)。因此,考虑到 1500 字节的数据碎片,单个帧可能会被碎片化,然后接收器将获得约 700 个数据包 (1048576/1500)。现在接收器需要为一帧累积所有这 700 个数据包的数据,这涉及到额外的处理。这是正常的吗,仅 1 帧数据 700 个数据包!如果我想将帧速率保持在 24fps,这意味着接收器必须处理 700*24 = 16800 个数据包/秒,这似乎不可行。
我想了解另一个流媒体网站是如何工作的,它们绝对不会处理 16800 个数据包/秒。他们将使用其他流协议,如 RTSP,但是这些协议是建立在 UDP/TCP 之上的,这意味着这些协议也需要处理碎片。现在流媒体网站可以提供 4k 视频,每个帧大小将远大于 1MB,但 MTU 仍然是 1500 字节。他们还必须进行数据压缩,但压缩到什么程度。即使他们设法将帧大小减少了 50%(这也需要在接收端进行解压缩,这意味着额外的处理),对于低质量的 24fps 视频,他们仍然需要每秒处理约 8000 个数据包。他们如何处理它,他们如何管理这些规模的数据碎片。
networking - 互联网真的能以 1500 字节运行吗?
MTU(最大传输单元)是可以传输的最大帧大小。当我们谈论 MTU 时,它通常是硬件级别的上限,并且适用于较低级别的层 - 数据链路和物理层。
现在,考虑到 OSI 层,无论上层的效率如何,或者它们应用了什么样的魔法酱,数据链路层总是会构造大小小于 1500 字节(或者 MTU 是什么)的帧和任何东西在“互联网”中将始终以该帧大小传输。
互联网的传输速率真的上限为 1500 字节吗?现在,我们看到 10-100 Mbps 甚至 Gbps 的速度。我想知道这样的速度,帧是否仍然以 1500 字节传输,这将意味着接收器处的大量碎片和重新组装。这种规模,上层是如何实现效率的?!
[编辑]
根据以下评论,我重新提出我的问题:
如果数据层以 1500 字节帧传输,我想知道接收器的上层如何处理如此巨大的传入数据帧。
例如:如果互联网速度为 100 Mbps,则上层必须处理 104857600 字节/秒或 104857600/1500 = 69905 帧/秒。网络层也需要重新组装这些帧。网络层如何能够处理这样的规模。
networking - 在接收端选择哪种数据结构进行 ip 数据报重组?
在接收方重新组装数据报时,哪种数据结构在以下方面会更好
- 如果 1-2 片段丢失,我们应该丢弃完整的数据报
- 碎片的排序应该更快
- 如果碎片进一步碎片化,那么重新组装应该很顺利。
networking - 如何在 Rust 中重新组装 IP 分段的 UDP 数据包?
我想读取一个由它生成的 pcap 文件,tcpdump
该文件包含可能已被分段的 UDP 数据包。我希望将数据包读入一个字节数组,然后用 serde 反序列化。在我的情况下,重新组装的数据包长度可达 12608 字节。
在 C++ 中,我会使用libtins
它的IPV4Reassembler
. 有没有办法可以在 Rust 中做类似的事情?