《TCP/IP详解 卷一》第10章 UDP和IP分片
目录
10.1 引言
10.2 UDP 头部
10.3 UDP校验和
10.4 例子
10.5 UDP 和 IPv6
10.6 UDP-Lite
10.7 IP分片
10.7.1 例子:IPV4 UDP分片
10.7.2 重组超时
10.8 采用UDP的路径MTU发现
10.9 IP分片和ARP/ND之间的交互
10.10 最大UDP数据报长度
10.11 UDP服务器的设计
10.11.1 IP地址和UDP端口号
10.11.2 限制本地IP地址
10.11.3 使用多地址
10.11.4 限制远端IP地址
10.11.5 每端口多服务器的使用
10.11.6 跨越地址族:IPv4和IPv6
10.11.7 流量和拥塞控制的缺失
10.12 UDP/IPV4和UDP/IPV6数据报的转换
10.13 互联网中的UDP
10.14 与UDP和IP分片相关的攻击
10.15 总结
10.1 引言
UDP(User Datagram Protocol):用户数据报协议。一种传输层协议。
IPv4中协议字段值:17。
特点:
有消息边界。
开销更小,因为没有TCP复杂机制。
当UDP应用程序每次调用send/write,就发出一个UDP数据报。
而TCP不一定,因为TCP可能分段,重组。
即TCP应用程序执行多次send/write调用会组合成一个数据包发送,或可能一个send/write调用被分成多个数据包发送。
10.2 UDP 头部
头部格式如下:

字段:
源端口
目的端口
长度:UDP报文总长度,包括头部和数据。
校验和:校验整个UDP报文。
每个socket在创建时必须指定协议类型(TCP或UDP),并绑定到特定端口。
因此,一个套接字不能同时监听TCP/UDP相同端口。
一个主机可以创建两个socket,分别监听TCP和UDP的相同端口号,表示两种不同服务。
10.3 UDP校验和
UDP校验和:校验范围覆盖UDP头部、UDP数据,伪头部。
伪头部(pseudo-header):
计算UDP校验和时,根据IP头信息生成的虚拟头部。
伪头部格式通常包括:
源IP、目标IP、协议类型(UDP),UDP数据报总长等。
作用:提供更多信息,确保校验更精确。
伪头部细节如下图:

NAT会改变报文IP和端口,所以经过NAT后需要重新校验和。
IPv4头中也有校验和,但只校验IPv4头内容,不包括IP载荷。
在每跳都要重新计算,因为TTL字段值减小。
小结:
IPv4头的校验和字段:只校验IPv4头内容。
传输层TCP/UDP头的校验和字段:校验范围不仅包含传输层头,还有载荷。
10.4 例子
10.5 UDP 和 IPv6
IPv6中TCP/UDP都需要伪头部来计算校验和。
Teredo隧道:
IPv6数据被封装成IPv4 UDP数据报后,发给Teredo中继,中继解封装后把IPv6报文转发给主机。
Teredo和GRE对比:
通用性:
GRE更通用,可封装任何类型数据包。
Teredo只用于IPv4 UDP封装IPv6数据。
实现方式:
GRE:不需要服务器或中继。
Teredo:需要服务器和中继。
10.6 UDP-Lite
UDP:校验是可选的,要么校验整个UDP报文,要么不校验。
UDP-Lite:对UDP数据一部分校验,而不是整个数据报校验。
所以未校验部分,容忍比特差错。
UDP-Lite:有单独的IPv4协议和IPv6协议号。算是一种新的传输层协议。
所以UDP- Lite有一个校验和覆盖范围字段,表示需要校验哪部分数据。
最小值为8,即只校验UDP-Lite头。
特殊值:0,表示校验整个负载。
socket简化程序举例,设置UDP-Lite校验和覆盖范围:
int main() {
int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE);
int send_cscov = 8; // 只校验UDP-Lite头。
setsockopt(sockfd, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, &send_cscov, sizeof(send_cscov)) ;
int recv_cscov = 0; // 校验整个负载
setsockopt(sockfd, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, &recv_cscov, sizeof(recv_cscov));
}
10.7 IP分片
IPv6只允许源主机分片,不允许中间转发设备分片,可减少中间设备负担。
IPv4既允许源主机分片,也允许中间路由器分片。
IP数据报大于MTU则分片。
被分片IP数据报,到了目的地才会重组,这样设计有两个原因:
1. 减轻中间路由器转发负担。
2. 同一数据报的不同分片可能经不同路径到达目的地,此时路径上路由器不能收到所有分片,搜到没有能力重组原始数据。
10.7.1 例子:IPV4 UDP分片

数据报分片后,每个分片IPv4头中的总长度字段被修改成该分片的总长度。
任一分片丢失,整个IP数据报无法完整接收。
当TCP报文的一个分片丢失了,TCP协议栈会重传整个TCP报文段,所以通常尽量避免TCP分片。
除最后一个分片外所有分片数据部分应是8字节倍数。
tcpdump为了能打印除了第一个分片外的其他分片的端口号,尝试重组其他分片的数据报,以恢复只出现在第一个分片的UDP头部中的端口号。
10.7.2 重组超时
当任一分片最先到达时,IP层就启动计时器。
若超时前未收到所有分片,无法重组源报文,会丢弃所有分片,防止缓存耗尽。
超时时间:一般30s,60s。
只有接收到了第一个分片并且分片重组失败时,才产生ICMP错误。
10.8 采用UDP的路径MTU发现
PMTU:路径MTU 。
PMTUD:路径MTU发现。
作用:发现路径中MTU的最小值。发送报文不超过MTU,防止分片。
UDP PMTUD原理:
源端发送一个较大UDP数据报,并设置 DF(Don't Fragment)标志,确保不被分片。
某个中间路由器发现数据报超过其出接口MTU,则丢弃该数据报并回复"Packet Too Big" 的ICMP 错误消息给源端。
源端收到ICMP错误消息后,得到其中指示的MTU。于是重新发送较小的UDP数据报。
重复该过程就获得一个可在所有路由器通过的MTU,即路径最小MTU,PMTU。
IP层会基于每个目的地址缓存一个PMTUD值,有到该目的地报文则更新,否则超时需要重新尝试PMTUD。
PPPoE MTU:1492
1500字节去除了6字节PPPoE头部,2字节PPP头部。
10.9 IP分片和ARP/ND之间的交互
10.10 最大UDP数据报长度
理论一个IPv4数据报的最大长度是65535字节。
但实际存在限制,如:
1. 系统,setsocketopt设置收发缓存大小。
2. 应用程序。read/write指定读写大小数目小于一个UDP数据报,大多数时候发生API截断数据报,丢弃数据报里超过接收应用程序指定字节数的数据。
MSG_TRUNC标志位:
当socket收到超过recv函数指定接收缓冲区大小时,如果设置该标志位,系统将丢弃缓冲区以外数据,并且不报告任何错误,而是正常返回已接收数据长度。
MSG_TRUNC使用方法:
len = recvfrom(sockfd, buf, BUF_SIZE, MSG_TRUNC, (struct sockaddr *)&client_addr, &client_len);
如何获取截断数据大小:
socklen_t optlen = sizeof(recv_len);
getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &recv_len, &optlen);
而TCP是连续的字节流,没有消息边界,不会被截断。
10.11 UDP服务器的设计
10.11.1 IP地址和UDP端口号
SO_REUSEADDR:
一个socket选项,当一个socket被关闭后,它的端口号会继续一段时间的被占用。
在这个时间内,其他程序无法绑定相同端口号,出现"Address already in use"错误。
设置SO_REUSEADDR选项后,当socket关闭后,立即可以被其他程序绑定,无需等待一段时间。
如何设置SO_REUSEADDR属性:
int reuse = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
10.11.2 限制本地IP地址
两种策略:
1. 只有报文目的IP地址是该接收接口的IP时,才接收数据。
2. 任何本地接口均可接收到目的IP是某本地接口之一的数据。
10.11.3 使用多地址
一台主机上,可以开启多个服务器进程,都使用同一个端口号,但每个服务器进程使用不同本机IP地址。
通过ip addr add给本机设备配置多个IP地址。
此时需要用SO_REUSEADDR选项告诉系统允许重用相同的端口。
10.11.4 限制远端IP地址
可设置是否只接收来自指定源IPv4地址和端口号的UDP数据报。
10.11.5 每端口多服务器的使用
10.11.6 跨越地址族:IPv4和IPv6
10.11.7 流量和拥塞控制的缺失
UDP没有流量和拥塞控制机制。
10.12 UDP/IPV4和UDP/IPV6数据报的转换
10.13 互联网中的UDP
UDP占据了的互联网流量的10% ~ 40%,随着P2P应用增加,UDP流量也在上升。
互联网总体流量只有极少是分片的(大约分组数的0.3%,字节数的0.8%),而其中分片流量的68.3%是UDP。
常见分片流量如:
多媒体视频流量(应用层大包)
VPN隧道中封装/隧道流量(多层封装)
10.14 与UDP和IP分片相关的攻击
常见UDP DoS攻击:
1. 短时间大流量。UDP没有流控。
2. 放大攻击。伪造IP源成受害者地址,并设置目的地址为广播。于是广播目的地都回复报文给该受害者。
3. 泪滴攻击。构造一个重叠偏移分片,可覆盖前一分片部分数据。
4. 发送不带任何数据的分片,攻击IPv4重组程序。
10.15 总结
UDP是简单协议。
需要组播广播时使用UDP,可避免连接开销。
UDP使用场景:多媒体,P2P。
相关文章:
《TCP/IP详解 卷一》第10章 UDP和IP分片
目录 10.1 引言 10.2 UDP 头部 10.3 UDP校验和 10.4 例子 10.5 UDP 和 IPv6 10.6 UDP-Lite 10.7 IP分片 10.7.1 例子:IPV4 UDP分片 10.7.2 重组超时 10.8 采用UDP的路径MTU发现 10.9 IP分片和ARP/ND之间的交互 10.10 最大UDP数据报长度 10.11 UDP服务器…...
Android进阶之路 - RecyclerView停止滑动后Item自动居中(SnapHelper辅助类)
之前一直没注意 SnapHelper 辅助类的功能,去年的时候看到项目中仅通过俩行代码设置 RecyclerView 后就提升了用户体验,觉得还是很有必要了解一下,尝试过后才发现其 PagerSnapHelper、LinearSnapHelper 子类可以作用于不同场景,且听…...
高性能图表组件LightningChart .NET v11.0发布——增强DPI感知能力
LightningChart完全由GPU加速,并且性能经过优化,可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D,高级3D,Polar,Smith,3D饼/甜甜圈,地理地图和GIS图表以及适用于科学&am…...
神经网络系列---计算图基本原理
文章目录 计算图符号微分符号微分的步骤示例符号微分在计算图中的使用总结 数值微分前向差分法中心差分法数值微分的使用注意事项总结 自动微分1. 基本原理2. 主要类型3. 计算图4. 应用5. 工具和库6. 优点和缺点 计算图1. **计算图的建立**2. **前向传播**3. **反向传播**4. **…...
3D数字孪生
数字孪生(Digital Twin)是物理对象、流程或系统的虚拟复制品,用于监控、分析和优化现实世界的对应物。 这些数字孪生在制造、工程和城市规划等领域变得越来越重要,因为它们使我们能够在现实世界中实施改变之前模拟和测试不同的场景…...
C++惯用法之空基类优化
相关系列文章 C惯用法之Pimpl C惯用法之CRTP(奇异递归模板模式) C之std::tuple(二) : 揭秘底层实现原理 目录 1.空类 2.空基类优化 3.内存布局原则 4.实例分析 5.总结 1.空类 C 中每个对象的实例都可以通过取地址运算符获取其在内存布局中的开始位置,因此每个类…...
【生成式AI】ChatGPT 原理解析(2/3)- 预训练 Pre-train
Hung-yi Lee 课件整理 预训练得到的模型我们叫自监督学习模型(Self-supervised Learning),也叫基石模型(foundation modle)。 文章目录 机器是怎么学习的ChatGPT里面的监督学习GPT-2GPT-3和GPT-3.5GPTChatGPT支持多语言…...
Day03:Web架构OSS存储负载均衡CDN加速反向代理WAF防护
目录 WAF CDN OSS 反向代理 负载均衡 思维导图 章节知识点: 应用架构:Web/APP/云应用/三方服务/负载均衡等 安全产品:CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令:文件上传下载/端口服务/Shell反弹等 抓包技术:…...
C++多线程同步(上)
多线程同步 引言总述详情互斥锁示例运行结果分析条件变量示例一实现分析优化运行结果示例二实现代码运行结果示例三实现代码运行结果读写锁示例实现代码注意分析运行结果附言实现运行结果运行结果个人心得引言 项目中使用多线程,会遇到两种问题,一种是对共享资源的访问时需要…...
猜猜心里数字(个人学习笔记黑马学习)
1.定义一个变量,数字类型,内容随意 2.基于input语句输入猜想的数字,通过if和多次elif的组合,判断猜想数字是否和心里数字一致 num5if int(input("请输入第一次猜想的数字:"))5:print("猜对了࿰…...
实用Pycharm插件
Pycharm的离线安装:https://plugins.jetbrains.com/ 需要根据对应的Pycharm/Goland版本选取所需的 对于实用的插件如下: 实时查看每一行的git blame信息: Gittoolbox 转换IDE的英文为中文:Chinese IDE侧格式化json字符串&#…...
数据结构试题练习
(1). 假如队列未满,现有变量data需要入队,请写出表达式; if( (tail1)%SEQLEN ! head ) {seqn[tail] data;tail (tail1)%SEQLEN; } (2). 假如队列未空,现在需要从队列取一个元素并赋值给变量data,请写出表达式; if( head ! tail ) {data se…...
s-table和columns初始化不完整,造成table文件的filter报错
问题 顺藤摸瓜找errorHandler.js文件 发现文件并没有什么问题 顺藤摸瓜找index.vue文件 首先找到报错的filter,发现与columnsSetting相关 找到columnsSetting发现等于columns 返回自己使用S-table组件的地方,发现columns初始化时仅初始化为ref()未表明…...
SLA 是什么?如何实现 SLA 管理
随着业务的不断壮大,为了满足日益增长的客户需求,网络必须保持与这些需求同步。同时,为了提高最终用户的体验,运维人员/网络管理员在监控企业级网络时遇到了不少瓶颈,必须不断审查网络,以确保提供的服务质量…...
火灾安全护航:火灾监测报警摄像机助力建筑安全
火灾是建筑安全中最常见也最具破坏力的灾难之一,为了及时发现火灾、减少火灾造成的损失,火灾监测报警摄像机应运而生,成为建筑防火安全的重要技术装备。 火灾监测报警摄像机采用高清晰度摄像头和智能识别系统,能够全天候监测建筑内…...
JavaScript 基础学习笔记(五):函数、作用域、匿名函数
目录 一、函数 1.1 声明和调用 1.2 形参和实参 1.3 返回值 二、作用域 2.1 全局作用域 2.2 局部作用域 三、匿名函数 3.1 函数表达式 3.2 立即执行函数 一、函数 理解函数的封装特性,掌握函数的语法规则 1.1 声明和调用 函数可以把具有相同或相似逻辑的代…...
Qt环境配置VTK
Qt与VTK的结合为开发者提供了强大的跨平台图形界面开发能力和三维可视化处理能力。本教程旨在详细介绍如何配置Qt环境以使用VTK库,从而为开发者打造高效、强大的三维可视化应用。 一、准备工作 在开始之前,确保您的开发环境中已经安装了Qt和CMake。Qt提…...
腾讯云最新活动_腾讯云促销优惠_代金券-腾讯云官网入口
腾讯云服务器多少钱一年?62元一年起,2核2G3M配置,腾讯云2核4G5M轻量应用服务器218元一年、756元3年,4核16G12M服务器32元1个月、312元一年,8核32G22M服务器115元1个月、345元3个月,腾讯云服务器网txyfwq.co…...
如何创建自己的Spring Boot Starter并为其编写单元测试
当我们想要封装一些自定义功能给别人使用的时候,创建Spring Boot Starter的形式是最好的实现方式。如果您还不会构建自己的Spring Boot Starter的话,本文将带你一起创建一个自己的Spring Boot Starter。 快速入门 创建一个新的 Maven 项目。第三方封装的…...
数据分析---常见处理逻辑
目录 数据清洗数据转换数据聚合数据筛选增删改查(以查为例)数据清洗 去除重复值:使用DISTINCT关键字去除重复行。//这将返回一个包含所有不重复城市的结果集 SELECT DISTINCT city FROM students;处理缺失值:使用IS NULL或IS NOT NULL判断是否为空值,并使用COALESCE或CASE…...
5分钟掌握微信数据库密钥提取:Sharp-dumpkey终极指南
5分钟掌握微信数据库密钥提取:Sharp-dumpkey终极指南 【免费下载链接】Sharp-dumpkey 基于C#实现的获取微信数据库密钥的小工具 项目地址: https://gitcode.com/gh_mirrors/sh/Sharp-dumpkey 当你需要迁移微信聊天记录或恢复误删的重要对话时,是否…...
stable_baseline3 快速入门(二): 训练自定义游戏,构建Gymnasium训练环境
简介Gymnasium 为强化学习提供了一个标准化的API,它定义了 Agent 应该如何观察世界、如何做出动作以及如何获得奖励,不管是游戏,还是工业设备,只需要满足Gymnasium标准都能使用同一套代码进行训练。认识Gymnasium使用stable_basel…...
别再乱接线了!手把手教你排查家庭网线故障,从百兆到千兆的实战修复记录
家庭网络布线排错指南:从百兆瓶颈到千兆速率的实战修复 去年升级千兆宽带后,书房始终测速只有92Mbps——这个数字对网络工程师来说再熟悉不过,正是百兆以太网的物理极限。当我发现全屋六类网线竟被装修队接成四线制时,才意识到那些…...
别再死记ArcFace公式了!手把手教你用PyTorch/TensorFlow复现角度边界Margin(附完整代码)
从零实现ArcFace:代码实践中的角度边界理解与优化 第一次看到ArcFace论文里那些复杂的三角函数公式时,我完全懵了——cos(θm)展开、数值稳定性处理、梯度优化条件判断,这些数学符号怎么变成可运行的代码?直到我亲手用PyTorch实现…...
抖音批量下载器:5分钟掌握高效内容获取的专业工具
抖音批量下载器:5分钟掌握高效内容获取的专业工具 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. …...
mdcat与mdless:如何通过符号链接实现智能分页功能
mdcat与mdless:如何通过符号链接实现智能分页功能 【免费下载链接】mdcat cat for markdown 项目地址: https://gitcode.com/gh_mirrors/md/mdcat 在命令行工具中,markdown文件的阅读体验常常被忽视。mdcat作为一款强大的markdown终端渲染工具&am…...
外盘期货 Tick 级行情 API 开发服务
外盘期货 Tick 级行情 API 开发,核心是接入低延迟、稳定的实时逐笔成交 / 盘口数据流,用于量化、做市、行情展示等场景。主流路径是:经纪商原生 API / 专业数据服务商 API → WebSocket/CTP 兼容长连接 → 回调解析 Tick → 缓存 / 入库 / 策…...
26HVV行动 初 中 高 级人员招聘
一、HW人员要求及详细介绍 原文地址:https://mp.weixin.qq.com/s/vzRwUhtWj8tfibZFS7YfoA HW介绍 HW(网络安全护网行动)是国家关键信息基础设施安全攻防演练行动,旨在通过实战化攻防对抗提升行业网络安全防护能力。 城市&…...
如何零成本掌握专业音频编辑:5个实战场景+3步高效流程+7个核心技巧
如何零成本掌握专业音频编辑:5个实战场景3步高效流程7个核心技巧 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 想要创作专业级音频内容却担心成本和技术门槛?今天我将为你揭秘一款完全免…...
别再只会用BurpSuite抓包了!结合DVWA靶场,手把手教你玩转Intruder模块的密码爆破
从抓包到爆破:BurpSuite Intruder模块在DVWA靶场中的高阶实战 当你在渗透测试中遇到一个登录表单时,仅仅拦截请求可能远远不够。真正的威力在于如何将一次简单的抓包转化为系统性的自动化攻击。这就是BurpSuite Intruder模块的价值所在——它能把单调的手…...
