【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. 如何将报头和有效载荷进行分离(封装)
  2. 如何将有效载荷进行分用?

对于第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要对报文进行管理,先描述,在组织。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据架构演变

一、离线数仓 缺点: ETL计算、存储、时间成本高数据处理链路过长无法支持实时、近实时的数据分析数据采集对业务库造成影响 二、Lambda架构,离线实时分开 缺点: 组件多,不方便管理很难保证数据一致数据探查困难,出现…

进程间通讯

简介: 进程间通讯方式有: 1.内存映射(mmap): 使用mmap函数将磁盘空间映射到内存 2.管道 3.信号 4.套接字(socket) 5.信号机制 通过进程中kill函数,去给另一个函数发送信号&a…

毕业项目推荐:基于yolov8/yolov5的行人检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

[桌面运维]windows自动设置浅深色主题

设置自动浅色/深色主题 我看很多up主的教程过于繁琐,需要添加四个功能,并且有些还不能生效! 大多数都是教程: 自动任务栏浅色 add HKCUSOFTWAREMicrosoftWindowsCurrentVersionThemesPersonalize/v SystemUsesLightTheme /t …

LQ quarter 5th

目录 B. 开赛主题曲 C. BlueAI E. 精准难度 B. 开赛主题曲 (1)两层循环枚举所有子串。第一层子串长度,第二层子串起点 (2)判子串是否合法还要一个 for,26 * 26 * 2e5 快要超时,因此计算每个字母…

Directx12 chapter4

官方的初始化需要的组件 Initialize 初始化涉及到首次设置全局变量和类,initialize 函数必须准备管道和资产。 初始化管道。 启用调试层。创建设备。创建命令队列。创建交换链。创建渲染器目标视图 (RTV) 描述符堆。 备注 可将描述符堆视为描述符的数组。 其中…

STM32 软件I2C读写

单片机学习! 目录 前言 一、软件I2C读写代码框架 二、I2C初始化 三、六个时序基本单元 3.1 引脚操作的封装和改名 3.2 起始条件执行逻辑 3.3 终止条件执行逻辑 3.4 发送一个字节 3.5 接收一个字节 3.5 发送应答&接收应答 3.5.1 发送应答 3.5.2 接…

计算机网络--UDP和TCP课后习题

【5-05】 试举例说明有些应用程序愿意采用不可靠的UDP, 而不愿意采用可靠的TCP。 解答: 这可能有以下几种情况。 首先,在互联网上传输实时数据的分组时,有可能会出现差错甚至丢失。如果利用 TCP 协议对这些出错或丢失的分组进行重传&…

【C++】B2099 矩阵交换行

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述题目描述输入格式输出格式输入输出样例输入 #1输出 #1 💯题目分析💯不同解法分析我的做法实现步骤:优点:不足&#…

[微服务]redis主从集群搭建与优化

搭建主从集群 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 1. 主从集群结构 下图就是一个简单的Redis主从集群结构: 如图所示,集群中有一个master节点、两个s…

使用WebSocket 获取实时数据

回车发送数据&#xff0c;模拟服务器发送数据 效果图&#xff1a; 源码&#xff1a; <template><div><h1>WebSocket 实时数据</h1><input type"text" v-model"ipt" keyup.enter"sendMessage(ipt)"><div v-if…

Element-UI:如何实现表格组件el-table多选场景下根据数据对某一行进行禁止被选中?

如何实现表格组件el-table多选场景下根据数据对某一行进行禁止被选中&#xff1f; 在使用 Element UI 的 Table 组件时&#xff0c;如果你想要禁用某一行的选中&#xff08;特别是在多选模式下&#xff09;&#xff0c;可以通过自定义行的 selectable 属性来实现。selectable …

移动端自动化测试Appium-java

一、Appium的简介 移动端的自动化测试框架 模拟人的操作进行功能自动化常用于功能测试、兼容性测试 跨平台的自动化测试 二、Appium的原理 核心是web服务器&#xff0c;接受客户端的连接&#xff0c;接收客户端的命令&#xff0c;在手机设备上执行命令&#xff0c;收集命令…

Geoserver修行记-后端调用WMS/WMTS服务无找不到图层Could not find layer

项目场景 调用geoserver地图服务WMS,找不到图层 我在进行地图服务调用的时候&#xff0c;总是提示我找不多图层 Could not find layer&#xff0c;重点是这个图层我明明是定义了&#xff0c;发布了&#xff0c;且还能够正常查看图层的wms的样式&#xff0c;但是在调用后端调用…

深入探讨 Android 中的 AlarmManager:定时任务调度及优化实践

引言 在 Android 开发中&#xff0c;AlarmManager 是一个非常重要的系统服务&#xff0c;用于设置定时任务或者周期性任务。无论是设置一个闹钟&#xff0c;还是定时进行数据同步&#xff0c;AlarmManager 都是不可或缺的工具之一。然而&#xff0c;随着 Android 系统的不断演…

玉米识别数据集,4880张图,正确识别率可达98.6%,支持yolo,coco json,pasical voc xml格式的标注,可识别玉米

玉米识别数据集&#xff0c;4880张图&#xff0c;正确识别率可达98.6%&#xff0c;支持yolo&#xff0c;coco json,pasical voc xml格式的标注&#xff0c;可识别玉米 数据集下载地址&#xff1a; yolo v11:https://download.csdn.net/download/pbymw8iwm/90230969 yolo v9:…

【UI自动化测试】selenium八种定位方式

&#x1f3e1;个人主页&#xff1a;謬熙&#xff0c;欢迎各位大佬到访❤️❤️❤️~ &#x1f472;个人简介&#xff1a;本人编程小白&#xff0c;正在学习互联网求职知识…… 如果您觉得本文对您有帮助的话&#xff0c;记得点赞&#x1f44d;、收藏⭐️、评论&#x1f4ac;&am…

【前端系列01】优化axios响应拦截器

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、axios响应拦截器&#xff1a;☀️☀️☀️2.1 为什么前端需要响应拦截器element ui的消息组件 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;回报在行动之中。 这个系列可…

【C语言程序设计——选择结构程序设计】求阶跃函数的值(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1. 选择结构基本概念 2. 主要语句类型​&#xff08;if、if-else、switch&#xff09; 3. 跃迁函数中变量的取值范围 4. 计算阶跃函数的值 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;输入x的值&#x…

利用 NineData 实现 PostgreSQL 到 Kafka 的高效数据同步

记录一次 PostgreSQL 到 Kafka 的数据迁移实践。前段时间&#xff0c;NineData 的某个客户在一个项目中需要将 PostgreSQL 的数据实时同步到 Kafka。需求明确且普遍&#xff1a; PostgreSQL 中的交易数据&#xff0c;需要实时推送到 Kafka&#xff0c;供下游多个系统消费&#…