目录

IPv4协议

分片可能引起的问题

参考文章


  • IPv4协议

先看一个流传得比较多的图,这里直入主题,只说与分片相关的字段。

标识(identification):占16位。IP软件在存储器中维持一个计数器,每产生一个 数据报,计数器就加1,并将此值赋给标识字段。

标志(flag):占3位,但目前只有两位有意义。最低位记为MF (More Fragment)。MF = 1即表示后面“还有分片” 的数据报。MF = 0表示这已是若千数据报片中的最后一个。标志字段中间的一位记为DF (Don’t Fragment),意思是“不能分片”。只有当DF = 0时才允许分片。

片偏移 :占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对 位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移 单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。

总长度:总长度指数据报的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16 - 1 = 65535字节。然而实际上传送这样长的数据报在现实中 是极少遇到的。

UDP单个数据包的长度由于总长度的原因,不会超过65535字节。而由于MTU的原因,udp数据包超过某一长度(为MTU的值,通常为1500字节)后,会分片传输。

举个例子,主机A向主机B发送一个长度为8000字节的udp数据包,假设mtu为1500,那么数据报将会如何分片传送呢?

假设MTU是1500,实际上每个数据包要包括20字节固定大小的IP头开销,且第一个分片需要包括UDP协议头(8字节),其它分片只需要伪首部即可。所以实际的数据分片载荷为首包1472字节,中间6包1480字节,尾包608字节。

接收端根据包标识+片偏移组包,源地址与标识相同的认为是同一个数据包,使用片偏移排序,最后使用第一个包的udp头校验和检验数据正确性,如果通过校验,则分片组包成功,数据包通知到应用层。如果分片包超过一段时间未完整组包,或是校验不通过,则数据丢弃。

分片可能引起的问题

由于包标识字段是自增的,所以这个验证是不会有问题,乍一看,感觉简直完美。

而实际上,标识字段只有16位,最多只能表示65536个不同的udp数据包。假设分片组包超时的时间为t秒,那么t秒内,如果发送的udp数据包超过了65536会出现什么问题呢?

当然,正常情况下是不会有问题的,我们假设一种异常的情况,一个udp包被分成了两个分片,在包标识为N的时候,分片1没有被接收端接收到,分片2接收到并保留在接收端的内存中,等待超时时间t秒内,又接收到不一样的数据,而标识为N的分片1,这时内存中第一次接收到的分片2就与第二次接收到的分片1组包。由于数据本身不一致,udp校验和不通过,该包丢弃。接下来第二次的分片2又停留在内存中,等待已经被丢弃并永远不会到来的正确的分片1,超时时间又从0开始计时。假设数据发送端一直以相同的速率发送数据,那么第二次分片2等待到的只会是第三次的分片1,然后丢弃。第三次的分片2等待到第四次的分片1,丢弃。。。。。。如此便是一个恶性循环。标识为N的数据包永远都是一个结果:被丢弃。

有人会觉得这不是一个问题,你把超时时间t设置小一点不就万事大吉了吗?然而很不幸,windows 2000之后的内核都是对t值是硬编码,t=60秒,不可改变。
所以如果不是特殊需求的话,最好不要让udp数据包的长度超过mtu的值。如果不得不这样做的话,还有另外一种方法,可以在特定环境下曲线解决这个问题。这里就不详细说明了。

还有另一种情况, 当别有用心的客户端每次发送一个不完整的分片到指定windows服务器,服务器一直等待超时,那么服务器内存能否撑满呢?(以下仅为理论上的推测,未进行相关的测试。)

假设一个数据包是1514字节(mtu1500字节+14字节数据链路头)。一个发送端理论上至少可在60秒内发送65535个不同标识的不完整数据包(或多个同一个标识的不完整分片。65535*((最大UDP数据长度)%(MTU)个),所以最多能发送4266459570字节≈4GB的数据,这些数据是常驻内存的。理想情况下,只需要16个不同的客户端,就能对一个开放了UDP端口的且内存64GB以下的Windows 2000以上版本的服务器进行拒绝服务攻击。

当然,这只是理想情况。实际呢,服务器可能设置了不允许udp分片,或者udp缓存本身很小、网络丢包、带宽限制、防火墙等因素也可能导致了攻击不可行。

[经过2018-12-31实际测试win7 x64系统,使用大量分片并不会导致目标系统的内存暴涨或宕机,而对网络占用和CPU的增长是存在的。所以此类攻击在新版系统中的影响是有限的]

参考文章

IP协议头详解

ip分片组包超时

欢迎提问

IPv4协议中的UDP分片问题相关推荐

  1. 计网 - IPv4 协议:路由和寻址的区别是什么?

    文章目录 Pre 什么是 IP 协议? IP 协议的工作原理 分片(Fragmentation) 增加协议头(IP Header) "鱼和熊掌"不能兼得--延迟.吞吐量.丢包率 延 ...

  2. Python中的端口协议之基于UDP协议的通信传输

    阅读目录 UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较) 3.利用socketserver模块实现udp传输协议的并发通 ...

  3. 在Delphi中关于UDP协议的实现

    首先我把UDP无连接协议的套接字调用时序图表示出来 在我把在Delphi中使用UDP协议实现数据通讯收发的实现方法总结如下: 例子描述:下面例子是我的一个实际设备通讯的例子,使用UDP协议在4660端 ...

  4. TCP/IP中的传输层协议TCP、UDP

    TCP提供可靠的通信传输,而UDP则常用于让广播和细节控制交给应用的通信传输. 传输层协议根据IP数据报判断最终的接收端应用程序. TCP/IP的众多应用协议大多以客户端/服务端的形式运行.客户端是请 ...

  5. ipv6协议与网络服务器有关,IPv6与IPv4协议网络中的双工通信差异

    我们都知道IPv6与IPv4协议网络的本质区别.那么在进行双向会话通信过程中两者有什么差异呢?下面我们就来详细说一下这方面的内容.Ipv6和IPv4协议动态NAT一样,NAT-PT只能用于由IPv6网 ...

  6. 夜影:Near协议中的分片设计

    夜影:Near协议中的分片设计 原版参见 Nightshade.pdf 原著: Alex Skidanov      Twitter: /AlexSkidanov      Email: alex@n ...

  7. java dtls server_DTLS协议(基于UDP)中client/server的认证过程和密钥协商过程

    我的总结:DTLS的握手就是协商出一个对称加密的秘钥(每个客户端的秘钥都会不一样),之后的通信就要这个秘钥进行加密通信.协商的过程要么使用非对称加密算法进行签名校验身份,要么通过客户端和服务器各自存对 ...

  8. 网络 · IPv4协议

    IP协议学习总结   一.IP协议来源 Internet上连接的所有计算机,从大型机到微型计算机都是以独立的身份出现,我们称它为主机.为了实现各主机间的通信,每台主机都必须有一个唯一的网络地址.就好像 ...

  9. Internet网际协议---IPv4协议

    IPv4协议 一.IPv4协议简介 二.IPv4数据报格式(由首部和数据组成) 三.数据报分片与重组 四.IP协议功能及报头字段总结 一.IPv4协议简介 1.IPv4协议:网际协议版本4,一种无连接 ...

最新文章

  1. OpenCV(八)形态学操作3--形态学梯度实现轮廓分析(基本梯度、内部梯度、外部梯度、方向梯度X(Y))
  2. cannot find -lcudart
  3. 开发日记-20190403
  4. python matplotlib.pyplot 如何实时绘制三维动态窗口?(可鼠标拖动角度)
  5. CiberCut_5.6 标牌制作
  6. 如何加快C++代码的编译速度
  7. 5个冷门的MacOS快捷键,小众但好用
  8. Machine Learning and Data Science 教授大师
  9. java并发编程(1)并发程序的取消于关闭
  10. @RequestBody 接收数组、List 参数、@Deprecated 标记废弃方法
  11. atitit.常用编程语言的性能比较 c c++ java
  12. LINGO语法及软件操作
  13. 人口增长模型——基于matlab语言
  14. 数据库安全关键技术之数据库脱敏技术详解
  15. Android 适配深色模式
  16. mysql命令报错-bash: mysql: command not found
  17. java脚手架_Java代码重构
  18. Linux 配置网络案例
  19. C语言编程勾股数,C语言求勾股数
  20. vue2.0引入icon.styl不断报错

热门文章

  1. 聊一聊前端中常说的接口
  2. hutool 合并单元格
  3. php+获取上午还是下午,pm是上午还是下午?
  4. ADATE320介绍
  5. windows10 WIFI功能不能使用了、没有WIFI模块或驱动安装失败
  6. Linux clamav杀毒
  7. 5种快速查找容器文件系统中文件的方法
  8. 放置类游戏用过的资源存档
  9. 2009年9月语言排行榜:PHP排名第三
  10. 搜索与回溯典型题目解析