《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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式(十二)享元模式

请直接看原文: 原文链接:设计模式(十二)享元模式-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 享元模式定义 享元模式是结构型设计模式的一种&am…

两天学会微服务网关Gateway-Gateway简介

锋哥原创的微服务网关Gateway视频教程: Gateway微服务网关视频教程(无废话版)_哔哩哔哩_bilibiliGateway微服务网关视频教程(无废话版)共计17条视频,包括:1_Gateway简介、2_Gateway工作原理、3…

lv20 QT主窗口4

熟悉创建主窗口项目 1 QAction 2 主窗口 菜单栏:fileMenu menuBar()->addMenu(tr("&File")); 工具栏:fileToolBar addToolBar(tr("File")); 浮动窗:QDockWidget *dockWidget new QDockWidget(tr("Dock W…

C语言-简单实现单片机中的malloc示例

概述 在实际项目中,有些单片机资源紧缺,需要mallloc内存,库又没有自带malloc函数时,此时,就需要手动编写,在此做个笔录。(已在项目上使用),还可进入对齐管理机制。 直接…

韦东山嵌入式Liunx入门驱动开发五

文章目录 一、驱动程序基石1-1 休眠与唤醒1-2 POLL机制1-3 异步通知(1) 异步通知程序解析(2) 异步通知机制内核代码详解 1-4 阻塞与非阻塞1-5 定时器(1) 内核函数(2) 定时器时间单位 1-6 中断下半部 tasklet 本人学习完韦老师的视频,因此来复习巩固,写以…

2023年第十四届蓝桥杯大赛软件类省赛C/C++大学A组真题

2023年第十四届蓝桥杯大赛软件类省赛C/C大学A组部分真题和题解分享 文章目录 蓝桥杯2023年第十四届省赛真题-平方差思路题解 蓝桥杯2023年第十四届省赛真题-更小的数思路题解 蓝桥杯2023年第十四届省赛真题-颜色平衡树思路题解 蓝桥杯2023年第十四届省赛真题-买瓜思路题解 蓝桥…

c/c++ | 静态链接、动态链接

正如标题所见,我们就来讲讲开发时遇到的一些问题,以及解决方案 这里不介绍动态库、静态库的生成与调用, 无论是静态库还是动态库,都是在编译项目的时候链接器会根据编译命令去调用的 如果直接把库(动态、静态不论&…

自己本地模拟内存数据库增删改查

目录 学习初衷准备代码实现结果感谢阅读 学习初衷 用于满足自己的测试要求,不连接数据库,也不在意数据丢失 准备 maven依赖 org.springframework.boot spring-boot-starter-test test 代码实现 内存数据库(InMemoryDatabase&#xff0…

玩转SpringBoot:动态排除Starter配置,轻松部署

引言 在软件开发中,进行本地单元测试是一项常规且必要的任务。然而,在进行单元测试时,有时需要启动一些中间件服务,如Kafka、Elasticjob等。举例来说,我曾经遇到过一个问题:项目中使用了Redisson锁&#x…

试手一下CameraX(APP)

书接上回。 首先还是看谷歌的官方文档: https://developer.android.com/media/camera/camerax?hlzh-cn https://developer.android.com/codelabs/camerax-getting-started?hlzh-cn#1 注:这里大部分内容也来自谷歌文档。 官方文档用的是Kotlin&…

JavaWeb之 创建 Web项目,使用Tomcat 部署项目,使用 Maven 构建Web项目(一万八千字详解)

目录 前言3.1 Tomcat 简介3.1.1 什么是 Web服务器3.1.2 Tomcat 是什么3.1.3 小结 3.2 Tomcat 的基本使用3.2.1 下载 Tomcat3.2.2 安装 Tomcat3.2.3 卸载 Tomcat3.2.4 启动 Tomcat3.2.5 关闭 Tomcat3.2.6 配置 Tomcat3.2.7 在 Tomcat 中部署 Web项目 3.3 在 IDEA 中创建 Web 项目…

探索前景:机器学习中常见优化算法的比较分析

目录 一、介绍 二、技术背景 三、相关代码 四、结论 一、介绍 优化算法在机器学习和深度学习中至关重要,可以最小化损失函数,从而改善模型的预测。每个优化器都有其独特的方法来导航损失函数的复杂环境以找到最小值。本文探讨了一些最常见的优化算法&…

Python爬虫——解析常用三大方式之JsonPath

目录 JsonPath 安装 使用 我们的json数据 基本使用 案例 总结 JsonPath 主要适用于解析一些json的数据 安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ jsonpath 使用 obj json.load(open( json文件 , r , encoding utf-8 ) )ret jsonpath.…

一些C语言知识

C语言的内置类型&#xff1a; char short int long float double C99中引入了bool类型&#xff0c;用来表示真假的变量类型&#xff0c;包含true&#xff0c;false。 这个代码的执行结果是什么&#xff1f;好好想想哦&#xff0c;坑挺多的。 #include <stdio.h>int mai…

EdgeX Foundry 安全模式安装部署

文章目录 一、安装准备1.官方文档2. 克隆服务器3.安装 Docker4.安装 docker-compose 二、安装部署1.docker-comepse2.启动 EdgeX Foundry3.访问 UI3.1. consul3.2. EdgeX Console EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.org.cn/docs…

机器学习|KNN和Kmeans

KNN和Kmeans KNN KNN-K个最近的邻居&#xff0c;而K是可人先预设出来的。 所谓近朱者赤&#xff0c;近墨者黑。 可以选取离当前最近的K个样本来作为辅助判断&#xff0c;因为本样本和最近的K个样本应该是处于一种相似的状态。 以下是一个苹果和梨的识别任务。 图上会出现一个未…

立式学习灯值得买吗?五款立式学习灯真实测评

现在人们注重健康生活&#xff0c;特别是在面对目前青少年严峻的近视情况&#xff0c;大路灯作为补充光线的照明电器&#xff0c;在市场热度持续高涨&#xff0c;但其负面评价也屡见不鲜。有人反映使用后眼睛更容易疲劳、酸疼等不适症状。作为一名专业测评师&#xff0c;我提醒…

pdf编辑软件哪个好用?5款PDF编辑器分享

pdf编辑软件哪个好用&#xff1f;PDF编辑软件在现代办公和学术研究中发挥着举足轻重的作用&#xff0c;它们不仅具备基础的编辑和修改功能&#xff0c;还能够支持多种注释工具&#xff0c;帮助我们高效地管理和整理PDF文件。无论是需要调整文档布局、添加文本或图像&#xff0c…

Linux系统——LNMP架构

目录 一、LNMP架构定义 1.LNMP定义 1.1LNMP工作原理 2.FASTCGI 2.1CGI的由来 2.2为什么会有FastCGI 3.PHP 3.1什么是PHP-FPM 3.2PHP配置 3.1.1对配置文件的修改生效方法 3.1.2/etc/php.ini配置文件格式 3.1.3注释符&#xff1a; 3.1.4php.ini配置参考文档 3.1.5…

【Linux取经路】文件系统——inode与软硬链接

文章目录 一、前言二、认识硬件——磁盘2.1 磁盘的存储构成2.2 磁盘的逻辑抽象 三、操作系统对磁盘的使用3.1 再来理解创建文件3.2 再来理解删除文件3.3 再来理解目录 四、硬链接五、软链接六、结语 一、前言 在之前的【Linux取经路】文件系统之被打开的文件——文件描述符的引…