【网络通信】传输层之UDP协议
【网络通信】传输层之UDP协议
- 传输层
- 端对端通信
- 实现端到端通信的关键技术
- UDP协议
- 再谈端口号
- 端口号划分
- 关于端口号的两个问题
- UDP协议基本格式
- UDP通信的特点
- UDP的缓冲区
- UDP数据报的最大长度
- 基于UDP的应用层协议
- 如何封装UDP报文以及如何交付UDP报文
- 进一步理解封装和解包
传输层
传输层(Transport Layer)是计算机网络体系结构中的一个重要层次,它主要负责端到端的通信,确保数据能从一个终端(节点)传到另一个终端(节点)。它是OSI七层模型中的第四层,也是TCP/IP协议中的重要层之一。它主要提供面向连接和无连接的服务。
端对端通信
端对端通信简单来说就是只关注两个终端之间的直接通信,而忽略了底层网络的差异,为用户提供简单的网络通信模型。端:终端设备。
我们举个通俗点的例子来理解端对端的通信:
假设此时你在给你的朋友写信,信写完后会通过快递员运输,虽然可能你的信件会经过很多地方,但是这些地方都不会关注你的信件的具体内容(它只有到你朋友这里才会被拆封),最终信件到你朋友这里,逻辑上就好像你们直接通信一样:
端对端通信就像这样,只不过是在网络中,一条信息经过主机A发送给主机B,中间可能经过很多的路由节点,但是这些路由节点只负责传输数据,并不关系具体内容,最终消息会到主机B手中。逻辑上可以认为是这两个终端直接通信。
实现端到端通信的关键技术
- 传输层协议:如前面提到的TCP和UDP。TCP提供了一种面向连接的服务,保证了数据的可靠传输;而UDP则是一种无连接的服务,虽然不保证数据的可靠性,但是具有较低的延迟,适用于实时性要求较高的场景。
- 路由选择:利用IP地址和路由算法决定数据包的最佳路径。尽管路由器不知道所承载的应用层数据的具体意义,但它们根据网络拓扑结构来决定如何最有效地转发数据包。
- 防火墙与NAT穿越:为了确保端到端的安全性和可访问性,还需要解决诸如防火墙限制和网络地址转换(NAT)带来的挑战。这通常涉及到特定的技术,如STUN、TURN和ICE等,用于帮助建立P2P连接。
下面我们来介绍传输层的两大重要协议:UDP
与TCP
协议。
UDP协议
再谈端口号
端口号是用来标识某个主机中提供网络服务的进程的,它可以区分不同的提供网络服务的进程,因为主机中可能有很多进程在同一时刻提供网络服务。
在TCP/IP
协议中使用源IP
、源端口号
、目的IP
、目的端口号
、协议号
这样一个五元组来标识一个通信,我们可以使用指令netstat -n
来查看:
- Proto:协议(Protocol)。显示使用的网络协议,这里为
tcp
,表示使用的是TCP协议。 - Recv-Q:接收队列(Receive Queue)。显示连接当前在本地等待上层应用处理的数据量大小。对于已建立的连接,如果这个值不为0,可能意味着数据没有被及时读取。在这个例子中,它的值是
0
,表明没有未处理的数据。 - Send-Q:发送队列(Send Queue)。显示连接当前等待远端主机确认的数据量大小。通常,在连接正常工作时,这个值应该是0,除非远端主机没有正确地确认接收到的数据包。此例中也为
0
。 - Local Address:本地地址。显示本地计算机上的IP地址和端口号。这里的
127.0.0.1:44636
表示这是一个本地回环接口上的连接,即连接发生在本机上,端口号为44636
。 - Foreign Address:外部地址。显示远程计算机的IP地址和端口号。同样地,这里的
127.0.0.1:36731
表示这也是一个本地回环接口上的连接,端口号为36731
。这意味着该连接实际上是在同一台机器上的两个进程之间进行的通信。 - State:状态。表示TCP连接的状态。常见的状态包括
LISTEN
(监听)、ESTABLISHED
(已建立)、TIME_WAIT
等。这里的TIME_WAIT
表示该连接已经完成了正常的关闭过程,但为了确保网络上的所有数据包都被清除,连接暂时保持在这个状态一段时间。
端口号划分
端口号的范围为0~65535
,根据注册和用途,大致可以分为以下三类:
-
知名端口:
-
范围
:0~1023 -
描述
:这些端口通常不会开放给开发者使用,它们用作特殊的服务,为常见的服务器保留。例如:80
HTTP:超文本传输协议,用于网页浏览。443
HTTPS:安全的HTTP连接,通过SSL/TLS加密。25
SMTP:简单邮件传输协议,用于发送电子邮件。22
SSH:安全外壳协议,用于安全地远程登录到另一台计算机。
-
-
注册端口:
-
范围
:1024~49151 -
描述
:这些端口没有被像知名端口一样严格被定义,它可以开放给开发者使用。尽管如此,许多动态服务也会选择在这个范围内运行,只要不与已知的服务冲突即可。8080
常用作HTTP代理服务器或其他Web服务的备用端口。1433
Microsoft SQL Server
默认实例使用的端口。
-
-
动态/私有端口
-
范围
:49152到65535 -
描述
:这些端口主要用于客户端的临时通信。因为客户端一般进行网络服务时,bind
源端口号都是系统动态bind
,所bind
的都是这里面的端口号,由于这些端口是动态分配的,因此不应该长期固定地分配给任何特定的服务。
-
关于端口号的两个问题
- 一个进程是否可以
bind
多个端口号。- 同一个进程是可以
bind
多个端口号的,如果你想提供不同的服务的话。但是同一个套接字不能bind
多个端口号,可以在同一个进程中创建不同的套接字,同时给它们bind
不同的套接字,这两个套接字分别用于提供不同的服务。
- 同一个进程是可以
- 同一个端口号是否可以被多个套接字
bind
。- 一般情况下,同一个端口号不能被多个套接字同时
bind
。每个套接字bind
一个特定的IP地址和端口号组合,如果将第二个套接字bind
在已经被bind
的套接字上,就会bind
失败。- 存在特殊情况,在
bind
前设置套接字模式为SO_REUSEADDR
选项,允许多个套接字绑定到相同的IP地址和端口组合,但这通常仅适用于监听套接字,并且主要用于实现高可用性的服务器架构,其中多个实例可以接受客户端连接,这种情况只是为了让服务器可以快速启动,并不是这个端口被多个服务器bind
了,因为服务器在被ctrl C
终止后,连接会处于一个TIME_WAIT
的状态,所以需要等待一段时间,但是这个只有TCP
才会出现这种问题。
- 存在特殊情况,在
- 一般情况下,同一个端口号不能被多个套接字同时
UDP协议基本格式
传输层在OS内核中就是结构体数据,例如上面的UDP协议也是可以由结构体来描述其数据的,像http协议一样:
struct udphdr {__u16 source;//源端口号__u16 dest;//目的端口号__u16 len;//UDP长度__u16 check;//校验和
};
相关字段介绍:
16位源端口号:填充本进程在网络通信中使用的端口号。
16位目的端口号:填充通信方在网络通信中使用的端口号。
16位UDP长度:填充UDP数据报的总长度,包括头部8字节的数据。
16位UDP校验和:虽然UDP是不可靠的,但是还是提供了简单的数据校验的方法,通常这个校验和的计算是有一个固定的方式的(与此次通信的协议中的字段相关),通过计算填充到这个字段中,通过网络传输后再次计算,如果两次结果不同就证明传输过程中出现了问题。
UDP通信的特点
-
无连接:UDP通信不需要事先建立连接,这一点相信很好理解,如果你学习过UDP套接字通信,编写过UDP网络通信的
echo
代码的话。 -
不可靠:UDP协议简单,并没有提供很多对数据检验的方法,所以数据没有TCP可靠。
-
面向数据报:这一点在网络编程中有体现,在创建UDP的套接字时,需要将其设置为
SOCK_DGRAM
,DGRAM
的中文翻译就是数据报。上述UDP
的一个协议就构成一个数据报,它是一个独立的实体,每个数据报都有自己的头部和有效载荷。
应用层会把数据交付给传输层,如果传输层使用的是UDP协议,它既不会拆分也不会合并而是原样发送。
example:假设此时调用
sendto
发送1000字节的数据给客户端,客户端也必须调用recvform
一次性接收1000字节,而不能调用10次recvfrom
循环接收,因为数据包不会被拆分。
UDP的缓冲区
-
UDP没有发送缓冲区,调用
sendto
后,数据会被交给内核中的传输层(通过不同的套接字交给不同的协议),然后进行相应的封装(添加数据头部),之后由OS交给网络层。 -
UDP有接收缓冲区,但是这个接收缓冲区不能保证发送的数据报的顺序是否和发送时一致,同时当这个缓冲区满了之后,数据报会被丢弃。
UDP是全双工的,可以同时接收,同时发送。
UDP数据报的最大长度
在IPv4中,理论上最大的UDP数据报长度可以达到65,535字节(因为UDP长度字段是16位,能表示的最大值是65,535)。如果超过了这个值,需要使用者在应用层手动的进行分片。
基于UDP的应用层协议
基于UDP(用户数据报协议)的应用层协议有很多,它们利用了UDP的低延迟、无连接特性,适用于那些对实时性要求较高但可以容忍一定程度的数据丢失或乱序的应用场景。以下是一些常见的基于UDP的应用层协议:
-
DNS (Domain Name System)
- 用途:用于将域名转换为IP地址。
- 为什么使用UDP:DNS查询通常很小且需要快速响应,UDP的低开销和低延迟使其成为理想选择。尽管有时也会使用TCP,但大多数DNS查询是通过UDP进行的。
-
DHCP (Dynamic Host Configuration Protocol)
- 用途:自动分配IP地址和其他网络配置参数给设备。
- 为什么使用UDP:DHCP消息较短且频繁,使用UDP可以减少处理时间,提高效率。
-
TFTP (Trivial File Transfer Protocol)
- 用途:简单的文件传输协议,主要用于启动无盘工作站或在网络设备间传输配置文件等。
- 为什么使用UDP:TFTP设计简单,不提供复杂的错误恢复机制,适合小规模文件传输。
-
NTP (Network Time Protocol)
- 用途:同步计算机时钟到协调世界时(UTC)。
- 为什么使用UDP:NTP需要高精度的时间同步,UDP的低延迟特性有助于实现这一目标。即使偶尔丢失数据包也不会严重影响整体同步精度。
如何封装UDP报文以及如何交付UDP报文
-
封装
UDP
报文:- 当我们从上层(应用层)拿到数据时,直接在数据的前面添加UDP的报头即可。
-
交付
UDP
报文:-
当我们从网络层拿到了一个完整的
UDP
报文接下来如何将UDP
报文的数据交付给上层应用呢?我们结合UDP
协议来画图分析(只关心相关的层):
-
进一步理解封装和解包
如果仅仅理解封装和解包到图的角度,还是太肤浅了,我们尝试在代码级理解封装和解包。
我们都知道传输层和网络层都属于OS的一部分,OS中是可能存在很多报文的,这些报文还没来得及处理,可能在网络层也可能在传输层的缓冲区,我们需要对这些报文做管理:先描述后组织。
封装:
解包:
所以最终的解包和封装就转化成了指针的加减。
管理报文:
对报文的管理就转化为了对链表的增删查改。
相关文章:

【网络通信】传输层之UDP协议
【网络通信】传输层之UDP协议 传输层端对端通信实现端到端通信的关键技术 UDP协议再谈端口号端口号划分关于端口号的两个问题 UDP协议基本格式UDP通信的特点UDP的缓冲区UDP数据报的最大长度基于UDP的应用层协议如何封装UDP报文以及如何交付UDP报文进一步理解封装和解包 传输层 …...
Python环境搭建与量化交易开发:从基础到实战
Python环境搭建与量化交易开发:从基础到实战 在量化交易领域,Python因其强大的数据处理能力和丰富的库支持而成为首选编程语言。本文将指导您如何在本地搭建一个适合量化交易的Python环境,并介绍一些实用的工具和技巧。 《QMT开通规则分享》…...
软著申请(六)软著返修流程【2025年最新版】
软著申请(六)软著返修流程【2025年最新版】 一、软著返修流程1、软著返修流程须知2、相关细节二、针对大模型特殊补正条件三、备注本服务提供详细的软件著作权申请流程指导。申请人严格按照指导步骤完成申请,若最终未能成功获得著作权登记,可联系服务提供方进行免费咨询和指…...
SOUI基于Zint生成Code11码
Code 11 是一种高密度的数字条形码,主要用于标识电信设备和电子元件。它的名称来源于其能够编码 11 种字符:数字 0-9 和连接符 -。Code 11 是一种双向可读的条形码,支持校验位以提高数据准确性。 在使用BARCODE_CODE11码制生成code 11码时可指…...
sqlilabs第八关
?id1 and sleep(2)-- 发现页面存在注点,使用时间盲注脚本进行注入--- import requestsdef inject_database(url):name #name用于存储猜测出的数据库名称 for i in range(1, 20): # 假设数据库名称长度不超过20low 48 # 0high 122 # zmiddle (low high…...

基于HAL库的按钮实验
实验目的 掌握STM32 HAL库的GPIO输入配置方法。 实现通过按钮控制LED亮灭(支持轮询和中断两种模式)。 熟悉STM32CubeMX的外部中断(EXTI)配置流程。 实验硬件 开发板:STM32系列开发板(如STM32F103C8T6、N…...

DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?
随着人工智能技术的飞速发展,大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世,为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲!!! 目录 一、…...
prompt技术结合大模型 生成测试用例
要利用prompt技术结合大模型对目标B/S架构软件系统进行测试,以下以使用Python调用OpenAI的GPT模型进行功能测试用例生成,再借助Selenium库执行测试为例,给出一个完整的实现示例。 前提条件 安装依赖库:你需要安装openai和selenium库,可以使用以下命令进行安装:pip insta…...
【C++ 真题】P2920 [USACO08NOV] Time Management S
P2920 [USACO08NOV] Time Management S 题目描述 Ever the maturing businessman, Farmer John realizes that he must manage his time effectively. He has N jobs conveniently numbered 1…N (1 < N < 1,000) to accomplish (like milking the cows, cleaning the …...
pip安装指定版本的包
个人博客地址:pip安装指定版本的包 | 一张假钞的真实世界 使用以下命令安装指定版本的包: # pip install pyspark2.3.3...
【pytest】获取所有用例名称并存于数据库
数据库操作包,引用前面创建的py文件,【sqlite】python操作sqlite3(含测试) #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2025-02-11 8:45 # Author : duxiaowei # File : get_filename.py # Software: 这个文…...

Java中原子操作的实现原理
目录 一、处理器如何实现原子操作? 1.使用总线锁保证原子性 1.使用缓存锁保证原子性 二、Java如何实现原子操作? 1)使用循环CAS实现原子操作 2)CAS实现原子操作的三大问题 3)使用锁机制实现原子操作 前言 原子&…...

25农村发展研究生复试面试问题汇总 农村发展专业知识问题很全! 农村发展复试全流程攻略 农村发展考研复试真题汇总
农村发展复试当然有好的建议!前提是复试重点面试题背好! 你是不是也在为农村发展考研复试发愁?担心自己准备不充分、表现不好?别急!今天,学姐——复试面试拿下90分成功上岸的学姐,来给大家分享…...
一维前缀和与二维前缀和
前缀和(Prefix Sum)是一种用于高效计算数组区间和的预处理技术,尤其适用于需要频繁查询子数组或子矩阵和的场景。下面详细讲解一维前缀和与二维前缀和的原理、构建方法及应用。 一、一维前缀和 1. 定义 前缀和数组 prefix 的每个元素 prefi…...
3×2 MIMO系统和2×2 MIMO系统对比
从 SVD(奇异值分解)预编码 的角度分析,32 MIMO 系统相比 22 MIMO 系统在容量、功率分配灵活性和抗干扰能力方面具有潜在优势。以下是具体分析: 1. SVD预编码的基本原理 SVD 预编码是一种基于信道状态信息(CSI…...

【MySQL — 数据库基础】深入解析 MySQL 的联合查询
1. 插入查询结果 语法 insert into table_name1 select* from table_name2 where restrictions ;注意:查询的结果集合,列数 / 类型 / 顺序 要和 insert into 后面的表相匹配;列的名字不要求相同; create table student1(id int , …...

【医院运营统计专题】3.解码医院运营统计:目标、原则与未来蓝图
医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、医院运营统计的关键意义 在医疗行业持续发展与变革的大背景下,医院运营统计作为医院管理的关键组成部分,其重要性愈发凸显。从国内医院的普遍现状来看,运营统计已深度融入日常管理,为医院的有序运转提…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atomic_cmp_set 函数
目录 修正 执行 ./configure 命令时,输出: checking for OS Linux 6.8.0-52-generic x86_64 checking for C compiler ... found using GNU C compiler gcc version: 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) 所以当前环境是 x86_64 于是在 src…...

CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测,光伏功率预测
代码地址:CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测,光伏功率预测 CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测 一、引言 1.1、研究背景和意义 光伏功率预测在现代电力系统中占有至关重要的地位。随着可再生能源…...

【YOLO系列】YOLOv5 NMS源码理解、更换为DIoU-NMS
代码来源:GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite 使用的代码是YOLOv5 6.1版本 参考笔记:YOLOv5改进系列(八) 更换NMS非极大抑制DIoU-NMS、CIoU-NMS、EIoU-NMS、GIoU-NMS 、SIoU-NMS、Soft-…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...