《TCP/IP详解 卷一》第10章 UDP和IP分片

news2024/11/16 7:54:09

目录

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1476898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】实时查看服务器信息

查看服务器CPU使用率 使用命令mpstat 1。这里的1表示每隔1秒更新一次CPU使用率。如果系统未安装mpstat,可以通过安装sysstat包来获取它。 在基于Debian的系统(如Ubuntu)上,使用命令: sudo apt-get update sudo apt-…

微服务之qiankun主项目+子项目搭建

主项目使用history,子项目使用hash模式 1. 下载安装"qiankun": "^2.10.13"2. 手动调用qiankun,使用vue脚手架搭建的项目1. 主项目配置(我使用的是手动调用乾坤,在指定页面显示内容)1. 要使用的页面中引入乾坤…

LeetCode 2125.银行中的激光束数量

银行内部的防盗安全装置已经激活。给你一个下标从 0 开始的二进制字符串数组 bank ,表示银行的平面图,这是一个大小为 m x n 的二维矩阵。 bank[i] 表示第 i 行的设备分布,由若干 ‘0’ 和若干 ‘1’ 组成。‘0’ 表示单元格是空的&#xff0…

WebServer -- 日志系统(下)

目录 🌼整体思路 🎂基础API fputs 可变参数宏 __VA_ARGS__ fflush 🚩流程图与日志类定义 流程图 日志类定义 🌼功能实现 生成日志文件 && 判断写入方式 日志分级与分文件 🌼整体思路 日志系统分两部…

Vue+Flask电商后台管理系统

在这个项目中,我们将结合Vue.js前端框架和python后端框架Flask,打造一个功能强大、易于使用的电商后台管理系统 项目演示视频: VueFlask项目 目录 前端环境(Vue.js): 后端环境(python-Flask&…

面试数据库篇(mysql)- 07索引创建原则与失效及优化

索引创建原则 1). 针对于数据量较大,且查询比较频繁的表建立索引。 2). 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。 3). 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。 4). 如果是字符…

OpenCV实现目标追踪

目录 准备工作 语言: 软件包: 效果演示 代码解读 (1)导入OpenCV库 (2)使用 cv2.VideoCapture 打开指定路径的视频文件 (3)使用 vid.read() 读取视频的第一帧,ret…

ts的重载

官网示例 TypeScript: Documentation - Template Literal Types 这里大概理解是 T 继承了Number|sting 加上&#xff1f;条件判断就是 T继承Number|sting 部分为true 没有继承部分为false&#xff0c; 就是输入string, 为true, 输入 null 则为false, type Exclude<T, U&…

如何访问内网服务器?

访问内网服务器是在网络架构中常见的需求。内网服务器是指在一个局域网中运行的服务器&#xff0c;可以提供各种服务&#xff0c;如文件共享、网站托管等。由于安全性的考虑&#xff0c;内网服务器一般不直接暴露在公网中&#xff0c;所以需要通过特定的方法来访问。 一种常见的…

【管理咨询宝藏资料29】某大型集团房地产战略报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏资料29】某大型集团房地产战略报告 【格式】PPT版本&#xff0c;可编辑 【关键词】战略规划、地产发展、管理咨询 【文件核心观点】 - 以住宅为…

PyTorch基础(19)-- torch.take_along_dim()方法

一、前言 在深挖ML4CO的代码过程中&#xff0c;遇到了torch.take_along_dim()这个方法&#xff0c;影响到我后续的代码阅读&#xff1b;加之在上网搜索资料的过程中&#xff0c;网络上对此函数的介绍文章少之又少&#xff0c;即使有&#xff0c;也是对torch官网文档中的解释进…

医疗行业数据分析,为医疗提质增效提供科学支持

信息化时代的到来&#xff0c;医疗行业数据分析已成为提升医疗服务质量和效率的重要手段。医院拥有大量的医疗数据&#xff0c;医疗数据中包含着很多宝贵的信息与规律&#xff0c;通过深入的数据分析&#xff0c;能够为决策者提供直观、深入的数据洞察&#xff0c;帮助医疗服务…

千兆单口(百兆双口)小体积 24PIN 网络变压器 H82409S 特点

Hqst华轩盛(石门盈盛)电子导读&#xff1a;千兆单口&#xff08;百兆双口&#xff09;小体积 24PIN 网络变压器 H82409S 特点 大家好&#xff0c;石门盈盛电子科技有限公司工程盛先生&#xff0c;今天向大家介绍石门盈盛电子科技有限公司的一款优势产品 - 千兆单口&#xff08;…

一个实时波形图的封装demo(QT)(qcustomplot)

前言&#xff1a; 封装的一个实时波形图的类&#xff0c;可以直接提升使用。 提供了接口&#xff0c;可以更改颜色&#xff0c;样式&#xff0c;等等 参考&#xff1a; Qt Plotting Widget QCustomPlot - Introduction 另外参考了一个大神的作品&#xff0c;链接没找到。 项目…

15.prometheus.yml的rule_files配置

平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我。 跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~ 1.rule_files配置 1.1.rule_files配置解读…

【北京迅为】《iTOP-3588开发板网络环境配置手册》第2章 电脑、开发板直连交换机或路由器

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

BeautifulSoup+xpath+re+css简单复习+新的scrapy的学习

1.BeautifulSoupsoup BeautifulSoup(html,html.parser)all_icosoup.find(class_"DivTable") 2.xpath trs resp.xpath("//tbody[idcpdata]/tr") hong tr.xpath("./td[classchartball01 or classchartball20]/text()").extract() 这个意思是找…

【竞技宝】DOTA2-梦幻联赛S22:AR命悬一线 XG确定晋级淘汰赛

北京时间2024年2月28日&#xff0c;DOTA2梦幻联赛S22的比赛在昨日进入小组赛第三个比赛日&#xff0c;本次梦幻联赛共有AR、XG、IG三支中国区的队伍参赛&#xff0c;那么经过三日激烈的比赛之后&#xff0c;目前三支队伍的积分情况以及晋级形势如何呢&#xff1f; XG XG是小组…

手机使用Python轻松下载闲鱼短视频

目录 一、Python与手机端的结合 二、闲鱼短视频下载原理 三、使用Python实现下载 安装必要的库 捕获视频流 保存视频文件 四、案例分析 五、注意事项 六、总结 在数字化时代&#xff0c;短视频已成为人们获取信息、娱乐休闲的重要方式之一。闲鱼&#xff0c;作为国内知…

(PWM呼吸灯)合泰开发板HT66F2390-----点灯大师

前言 上一篇文章相信大家已经成为了点灯高手了&#xff0c;那么进阶就是成为点灯大师 实现PWM呼吸灯 接下来就是直接的代码讲解了&#xff0c;不再讲PWM原理的 这里部分内容参考了另一个博主的文章 合泰杯——合泰单片机工程7之PWM输出 如果有小伙伴不理解引脚设置和delay函数…