【Linux】传输层协议UDP
目录
再谈端口号
端口号范围划分
UDP协议
UDP协议端格式
UDP的特点
UDP的缓冲区
UDP注意事项
进一步深刻理解
再谈端口号
在上图中,有两个客户端A和B,客户端A打开了两个浏览器,这两个客户端都访问同一个服务器,都访问服务器的80端口,由于A和B的IP地址是不一样的,服务器在返回应答时就能根据双方的IP地址区分这两台不同的主机。同一台主机上两个不同的请求对应的端口号不一样,服务器在应答时就可以准确把应答推送给特定端口号。在未来通过TCP/UDP通信时,TCP/UDP报文里会包含端口信息,IP报文里会包含源IP目标IP,构成了四元组,构成套接字通信。在客户端发起请求时,要把服务器的IP和端口以及自己的IP和端口写进来,构成上图的报文,推送给服务器端,这就是服务器端为什么能收到你发来的数据也同时能知道你客户端的源IP和源端口号,也就知道这个消息是谁发的。这样的四元组一定出现在底层的网络报文中的。
另外,还有一个叫“协议号”的东西,会在IP首部里面有一个协议号,用来表明通信时采用的上层协议是TCP/UDP的,方便把IP报文交给传输层。这样,在TCP/IP协议中,我们就可以通过用“源IP”、“源端口号”、“目的IP”、“目的端口号”、“协议号”这样一个五元组来标识一个通信,衡量通信的双方是谁、用什么协议来通信(可以通过netstat -n查看)。
端口号范围划分
- 0-1023:知名端口号,HTTP、FTP、SSH这些广为使用的应用层协议,它们的端口号是固定的。
- 1024-65535:操作系统动态分配的端口号。客户端的端口号,就是在这个范围内选择。
知名端口号
有些服务器非常常用,为了方便使用,人们约定了一些常见的服务器,一些常见的知名端口号:
- ssh服务器,使用22号端口
- ftp服务器,使用21号端口
- http服务器,使用80号端口
- https服务器,使用443号端口
使用cat /etc/services可以查看知名端口号都有哪些。
有两个问题:
1.一个进程是否可以bind多个端口号?
可以,我们要的是从端口号到服务进程的唯一性。
2.一个端口号是否可以被多个进程bind?
不可以,理由同上。
我们再来理解一下端口号和进程之间的关系,进程在系统内就是struct task_struct,可以认为OS维护了一张哈希表,key就是端口号,value就是进程pcb对应的地址。当底层有数据来了,报文里必定携带了目的端口号,那目的端口号去查哈希表找到进程,就可以把数据交给进程。所以可以认为bind就是把port和进程pcb做关联。因为key值必须唯一,所以一个端口不能绑定多个进程。
UDP协议
UDP协议端格式
UDP的报头是一个结构体,报头里的每个字段都是结构体中的成员属性。通过源端口号和目的端口号就可以知道是哪个进程发的以及发给哪个进程。16位UDP长度,代表报文的总长度,包括UDP首部+UDP数据。报头部分是8字节。如果校验出错,就直接丢弃,所以UDP不保证可靠性。
无论哪种协议,都必须解决两个子问题,
- 如何将报头和有效载荷进行分离(封装)
- 如何将有效载荷进行分用?
对于第1个问题,通过使用固定长度的报头(8字节)分离,前8个字节就是报头。UDP是面向数据报的,通过16位UDP长度保证读到的报文是完整的,整个报头的长度减去8字节就是有效载荷的长度。对于第2个问题,因为报文里包含了16位目的端口号,找到对应的进程,就可以将数据分用到应用进程。
我们在来理解一个问题:在之前写套接字时,为什么端口号的类型是uint16_t呢?因为协议就是这么规定的!
UDP的特点
- 无连接:知道对端的IP和端口号就可以直接进行通信,不需要建立连接。
- 不可靠:没有确认机制,没有重传机制,如果因为网络故障该段无法发送到对方,UDP协议层也不会给应用层返回任何错误信息。
- 面向数据报:应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并。
用UDP传输100个字节数据:
- 如果发送端调用一次 sendto, 发送 100 个字节, 那么接收端也必须调用对应的,一次 recvfrom, 接收 100 个字节; 而不能循环调用 10 次 recvfrom, 每次接收 10 个字节。
UDP的缓冲区
UDP没有真正意义上的发送缓冲区,调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作。但是有接收缓冲区,但这个接收缓冲区不能保证收到的UDP报和发送的UDP报顺序一致,如果缓冲区满了,再到达的UDP数据就会被丢弃。UDP支持全双工,可以同时读写。由于UDP不需要做可靠性保证,所以没有发送缓冲区。
UDP注意事项
UDP协议首部有一个16位的最大长度,所以UDP报文最大长度是2^16位(约64K,包含UDP首部),所以单个UDP报文长度不能超过64K。如果超过64K,就需要在应用层手动分包,多次发送,在接收端手动拼装。
进一步深刻理解
1.udp报头
在进行UDP协议的交换时,用的是对结构体二进制流序列化和反序列化。可以这么做的原因是因为内核不涉及到业务,并且任何OS都是C语言写的,只要转化为网络序列就不会出错。OS的标准化程度比较高。而应用层所用的语言不同,不同语言,不能统一,需要序列化和反序列化。
2.对报文的理解
OS内可能同时存在大量的报文,有的可能正在被向上交付,有的在被向下交付,所以OS要对报文进行管理,先描述,在组织。
相关文章:

【Linux】传输层协议UDP
目录 再谈端口号 端口号范围划分 UDP协议 UDP协议端格式 UDP的特点 UDP的缓冲区 UDP注意事项 进一步深刻理解 再谈端口号 在上图中,有两个客户端A和B,客户端A打开了两个浏览器,这两个客户端都访问同一个服务器,都访问服务…...

玩机搞机基本常识-------列举安卓机型一些不常用的adb联机命令
前面分享过很多 常用的adb命令,今天分享一些不经常使用的adb指令。以作备用 1---查看当前手机所有app包名 adb shell pm list package 2--查看当前机型所有apk包安装位置 adb shell pm list package -f 3--- 清除指定应用程序数据【例如清除浏览器应用的数据】 …...

unity学习14:unity里的C#脚本的几个基本生命周期方法, 脚本次序order等
目录 1 初始的C# 脚本 1.1 初始的C# 脚本 1.2 创建时2个默认的方法 2 常用的几个生命周期方法 2.1 脚本的生命周期 2.1.1 其中FixedUpdate 方法 的时间间隔,是在这设置的 2.2 c#的基本语法别搞混 2.2.1 基本的语法 2.2.2 内置的方法名,要求更严…...
pytorch 比较两个张量的是否相等的函数介绍
在 PyTorch 中,可以使用多种函数来比较两个张量是否相等,具体选择取决于对比较精度的需求以及可能的数值误差。以下是常用的比较方法: 1. 完全相等的比较 (1) torch.eq 逐元素比较两个张量是否相等,返回布尔张量。 import torc…...
MySQL Windows 11 的 MySQL 配置文件 (my.ini) 路径查找指南
✅ Windows 11 的 MySQL 配置文件 (my.ini) 路径查找指南 在 Windows 11 上,MySQL 的 ini 配置文件(通常是 my.ini 或 my.cnf)的位置取决于 MySQL 的安装方式。下面是一些常见的路径和方法来找到这个配置文件。 🔍 方法 1&#…...

06-RabbitMQ基础
目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.安装 2.2.收发消息 2.2.1.交换机 2.2.2.队列 2.2.3.绑定关系 2.2.4.发送消息 2.3.数据隔离 2.3.1.用户管理 2.3.2.virtual host 3.SpringAMQP 3.1.导入Demo工程 3.2.快速入门 3.2.1.消…...
关于markdown实现页面跳转(调查测试:csdn(博客编写效果、发布效果)、typroa中md转pdf的使用情况)
一-方法介绍 [点击跳转到标题0](#1) <a href"#2">正文2</a>### <span id"2">标题0</span>二、跳转测试区 点击跳转到标题0 正文2 三、测试结果 场景MDspan-可标题写博客时候,右侧显示区效果可以发布博客的效果可以…...
el-dialog 组件 在<style lang=“scss“ scoped>标签
vue3 中使用element-plus的el-dialog 组件 <style> .el-dialog.plan-text-pdf .el-dialog__body {height: 1485px; // 需要在 style 标签写。 建议新增个类名 .plan-text-pdf 防止重复样式 } </style><style lang"scss" scoped> :deep() .el-dial…...
《深度学习梯度消失问题:原因与解决之道》
在深度学习的训练过程中,梯度消失是一个常见且棘手的问题,它会严重影响模型的训练效果和性能。以下是对该问题的原因分析与解决办法。 梯度消失问题的原因 首先是激活函数选择不当。像Sigmoid和Tanh这类传统激活函数,在输入值较大或较小时&…...
中高级运维工程师运维面试题(十一)之 Docker
目录 往期回顾前言基础知识1. 什么是 Docker?2. Docker 的核心组件有哪些?3. Docker 镜像和容器有什么区别?4. 什么是 Dockerfile? 高级知识5. 什么是多阶段构建?如何使用?6. Docker 网络有哪些模式&#x…...

Gitee图形界面上传(详细步骤)
目录 1.软件安装 2.安装顺序 3.创建仓库 4.克隆远程仓库到本地电脑 提交代码的三板斧 1.软件安装 Git - Downloads (git-scm.com) Download – TortoiseGit – Windows Shell Interface to Git 2.安装顺序 1. 首先安装git-2.33.1-64-bit.exe,顺序不能搞错2. …...
WebSocket 实现指南
WebSocket 实现指南 目录 1. 依赖安装 1.1 安装必要的包 # 安装 gorilla/websocket go get github.com/gorilla/websocket# 安装 gin 框架 go get github.com/gin-gonic/gin1.2 更新 go.mod require (github.com/gin-gonic/gin v1.9.1github.com/gorilla/websocket v1.5.3…...

TRELLIS - 生成 3D 作品的开源模型
TRELLIS 是一个大型 3D 资产生成模型。它接收文本或图像提示,并生成各种格式的高质量 3D 资产,例如 Radiance Fields、3D Gaussians 和网格。TRELLIS 的基石是统一的结构化 LATent (SLAT) 表示,它允许解码为不同的输出…...

uni-app图文列表到详情页面切换
需求:参考若依框架后,想实现首页浏览文章列表,没有合适的样式参考,所以需要有效果做到“图文列表到详情页面切换”,查阅了一下案例 发现有相应的案例,在导航栏“模板”中找到了 DCloud 插件市场 PC电脑端访…...

ros2-3.4话题通信最佳实践
3.4.1 工程架构设计 需求背景: 第一,通过这个小工具可以看到系统的实时状态信息包括记录信息的时间、主机名称、CPU使用率、内存使用率、内存总大小、剩余内存、网络接收数据量和网络发送数据量; 第二,要有一个简单的界面,可以将…...

Vmware安装centos
用来记录自己安装的过程 一、创建虚拟机安装centos镜像 点击完成后,等待一会会进入centos的系统初始化界面 二、centos初始化配置 三、配置网络 1、虚拟网络编辑器,开启VMnet1、VMnet8的DHCP vmware左上角工具栏,点击【编辑】->【虚拟网…...

51单片机——按键实验
由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms,为了确保 CPU 对按键的…...
QT c++ 自定义按钮类 加载图片 美化按钮
如果你有需要利用图片美化按钮的情况,本文能帮助你。 鼠标左键按下按钮和松开,按钮显示不同的图片。 1.按钮类 //因为此类比较简单,1个头文件搞定,没有cpp文件 #ifndef CUSTOMBUTTON_H #define CUSTOMBUTTON_H #include <Q…...
Django:构建高效Web应用的强大框架
在当今快速发展的Web开发领域,选择一个合适的框架对于项目的成功至关重要。Django,作为Python编程语言中最受欢迎的Web框架之一,凭借其强大的功能、高度的可扩展性和简洁的语法,成为了众多开发者心中的首选。本文将深入探讨Django…...
代码随想录算法【Day11】
150. 逆波兰表达式求值 class Solution { public:int evalRPN(vector<string>& tokens) {// 力扣修改了后台测试数据,需要用longlongstack<long long> st; for (int i 0; i < tokens.size(); i) {if (tokens[i] "" || tokens[i] &…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...