【计网】从零开始理解UDP协议 --- 理解端口号和UDP结构

在这里插入图片描述

我依旧敢和生活顶撞,
敢在逆境里撒野,
直面生活的污水,
永远乐意为新一轮的月亮和日落欢呼。
--- 央视文案 ---

从零开始理解UDP协议

  • 1 再谈端口号
  • 2 理解UDP 报头结构
  • 3 UDP 的特点
  • 4 UDP 的缓冲区
  • 5 UDP 使用注意事项

1 再谈端口号

之前我们讲过服务器上的端口号和服务器的进程是绑定的!客户端的进程与客户端的端口号也是绑定的!再通过IP地址,就可以快速找到网络中需要进行通信的进程!
在这里插入图片描述

用 “源 IP”, “源端口号”, “目的 IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信,可以明确目标进程和来源进程以及通信协议

端口号范围划分
• 0 - 1023:知名端口号, HTTP,FTP,SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的。
• 1024 - 65535:操作系统动态分配的端口号。客户端程序的端口号, 就是由操作系统从这个范围分配的。

我们之前测试的时候都是绑定的8888端口,如果今天绑定0 - 1023的端口,就会绑定失败:
在这里插入图片描述
只有我们使用超级用户的权限,我们才可以绑定0-1023端口号!普通用户是不能随便绑定知名端口号的!知名端口号都是与特定的服务联系在一起的!也就是说未来客户端可以在不知道端口号的情况下链接特定服务时直接使用知名端口号!

有些服务器是非常常用的, 为了使用方便, 人们约定一些常用的服务器, 都是用以下这些固定的端口号:
• ssh 服务器, 使用 22 端口
• ftp 服务器, 使用 21 端口
• telnet 服务器, 使用 23 端口
• http 服务器, 使用 80 端口
• https 服务器, 使用 443

现在有两个问题

  1. 一个进程是否可以bind多个端口号?
    可以的!我们要的是端口号到服务的唯一性,一个进程可以创建多个Socket,每个Socket都可以绑定一个端口号!
    • 多线程/多进程: 进程可以创建多个线程或子进程,每个线程或子进程可以有自己的socket,并且每个socket可以绑定到不同的端口号。
    • 多路复用: 进程可以使用I/O多路复用技术(如select, poll, epoll等),在单个进程中同时处理多个socket。尽管这些socket可能监听不同的端口,但它们是由操作系统统一管理的,而不是进程“绑定”了多个端口。
  2. 一个端口号是否可以被多个进程bind?
    原则上是不可以的!因为服务和对应端口是紧密联系的!除非使用了特殊的套接字选项。

理解端口号和进程的关系
在操作系统内部有这样一个描述进程的结构体task_struct !操作系统还有这样一个哈希表,K为端口号,V为进程的结构体task_struct !进绑定时就是将端口号与进程结构体建立哈希关系!这样传输层从网络层解析出来端口号时,你可以找到对应的进程,进入应用层!这样也就理解了一个端口号不能被多个进程bind,不然就产生哈希冲突了!

2 理解UDP 报头结构

协议是一种约定,是双方都认识的结构化数据!在学习应用层时,我们自己设计了自己的结构体作为协议!那么UDP也就是一种结构体!
在这里插入图片描述

  1. 任何协议都要解决如何经报头与有效载荷进行分离:UDP这里报头是固定的前8个字节!可以开始将报头与有效载荷进行分离!
  2. 如何将有效载荷进行分用!根据UDP报头中的16位端口号就可以找到对应的进程,然后进行分用!

我们来看源代码中的UDP报头结构:
在这里插入图片描述
这个结构体十分的简单奥!其中的UDP校验和是用来检验数据是否正常的,如果数据校验出错,就会直接丢弃数据!所以说UDP协议是不可靠的

作为一种协议,那么是不是就要进行序列化与反序列化?那为什么没有看到UDP的序列化和反序列化?其实报头就是一个结构体变量,直接加到报文前,读取是直接进行二进制读取获取到结构体变量!**但是应用层是不能这样写的!应用层涉及不同语言,大小端机器等很多问题!!!**而内核没有业务!报文该是多少就是多少,不会增添新的内容!并且双方操作系统都是C语言写的!都要先转大端序列!那么内核就能直接读取结构体变量,并且不会出现问题了!!!

3 UDP 的特点

UDP 传输的过程类似于寄信

  • 无连接:知道目的端的 IP 和端口号就直接进行传输,不需要建立连接!
  • 不可靠:没有确认机制, 没有重传机制;如果因为网络故障该段无法发到对方,UDP 协议层也不会给应用层返回任何错误信息!
  • 面向数据报: 不能够灵活的控制读写数据的次数和数量!接收到报文只需要进行序列化与反序列化!不需要判断是否读取到完整信息!
    应用层交给 UDP 多长的报文,UDP 原样发送,既不会拆分,也不会合并。用 UDP 传输 100 个字节的数据:如果发送端调用一次 sendto,发送 100 个字节,那么接收端也必须调用对应的一次 recvfrom,接收 100 个字节。而不能循环调用 10 次 recvfrom,,每次接收 10 个字节;

4 UDP 的缓冲区

UDP 没有真正意义上的发送缓冲区。调用 sendto 会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作。应用层直接就通过内核发送!因为UDP没有重传机制,发送只会进行一次,并且UDP的报头结构很简单,应用层的报文直接加上8字节即可。那么就不需要同一个缓冲区来进行管理了!

但UDP 具有接收缓冲区。UDP的接收缓冲区可以提高效率,执行任务时依旧可以读取数据!但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致。如果缓冲区满了,再到达的 UDP 数据就会被丢弃!

UDP的发送与接收是独立的,那么自然就支持全双工通信了!

在网络通信过程中,操作系统会不断的接收报文,应用层产生报文。所以OS中可能同时存在大量的报文,这些报文可能正在被向上交付,也可能被向下交付!所以操作系统就要对报文进行管理!一个完整的报文不仅仅是报头和有效载荷,还需要一个管理报文的结构 !
在这里插入图片描述
管理报文的结构化字段struct_sk_buff内部一个指针指向下一个报文。是通过链式结构(Linux系统是双链表)的增删查改进行管理的!
struct_sk_buff内部有指向数据的指针。当报文向下传输时,会先将报文内部的数据写到下一层的一个缓冲区中,注意是写到缓冲区的中间位置。然后将head指针向前移动相应报头大小,之后就可以在head这片空间内写入新的报头了!向上传输就是将head指针向后移动除去报头即可!

5 UDP 使用注意事项

我们注意到,UDP 协议首部中有一个 16 位的最大长度。 也就是说一个 UDP 能传输的数据最大长度是 64K(包含 UDP 首部)。单个报文的长度不能超过64K!

然而 64K 在当今的互联网环境下,是一个非常小的数字

如果我们需要传输的数据超过 64K, 就需要在应用层手动的分包,多次发送, 并在接收端手动拼装。多次发送,接收端手动拼装!

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

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

相关文章

pycharm里debug时如何看到数据的维度

使用表达式计算(Evaluate Expression) 调试时,使用 PyCharm 的 “Evaluate Expression” 功能可以动态查看或修改数据。具体步骤如下: 在调试模式中按 Alt F8(Windows)或 Option F8(Mac&…

Cortex-A7:如何切换ARM和Thumb状态

0 参考资料 ARM Cortex-A(armV7)编程手册V4.0.pdf1 Cortex-A7:如何切换ARM和Thumb状态 1.1 Cortex-A7支持的指令集 Cortex-A7支持的指令集包括ARM指令集和Thumb-2(ARM官方一般用Thumb表示)指令集。 ARM指令集指令大小都是32位,…

2024 年 04 月编程语言排行榜,PHP 排名创新低?

编程语言的流行度总是变化莫测,每个月的排行榜都揭示着新的趋势。2024年4月的编程语言排行榜揭示了一个引人关注的现象:PHP的排名再次下滑,创下了历史新低。这种变化对于PHP开发者和整个技术社区来说,意味着什么呢? P…

第十一章 RabbitMQ之消费者确认机制

目录 一、介绍 二、演示三种ACK方式效果 2.1. none: 不处理 2.1.1. 消费者配置代码 2.1.2. 生产者主要代码 2.1.3. 消费者主要代码 2.1.4. 运行效果 2.2. manual:手动模式 2.3. auto:自动模式 一、介绍 消费者确认机制(Consume…

【计算机网络】详谈TCP协议确认应答机制捎带应答机制超时重传机制连接管理机制流量管理机制滑动窗口拥塞控制延迟应答

一、TCP 协议段格式 1.1、4位首部长度 4位首部长度的基本单位是4字节,也就是说如果4位首部长度填6,那报头长度就是24字节。报头长度的取值范围为[0,60]字节,也就是说选项的最大长度为40字节。 二、确认应答机制 发送数据和发送应答&#x…

CSS 入门

1. CSS 1.1 概念 CSS(Cascading Style Sheet),层叠样式表,用于控制页面的样式 CSS 能够对网页中元素位置的排版进行像素级精确控制,实现美化页面的效果,能够做到页面的样式和结构分离(类似于…

Redis总结(官方文档解读)

定义 Redis是一个开源的,基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。 特征 高性能 支持丰富的数据类型 丰富的操作类型,操作是原子性的 支持周期性持久化 支持分布式 开源免费,社区活跃 数据类型 数据…

基础篇:带你打开Vue的大门(一)

学习目标: 理解Vue的基本概念:掌握Vue.js是什么,它的设计理念,以及它在现代Web开发中的应用。掌握Vue的基本语法:学习Vue的基础指令和语法,能够使用Vue构建简单的交互式界面。熟悉Vue组件化开发&#xff1…

vue3--通用 popover 气泡卡片组件实现

背景 在日常开发中,我们一般都是利用一些诸如:element-ui、element-plus、ant-design等组件库去做我们的页面或者系统 这些对于一些后台管理系统来说是最好的选择,因为后台管理系统其实都是大同小异的,包括功能、布局结构等 但是对于前台项目,比如官网、门户网站这些 …

【银行科技岗】相关考试知识点总结及部分考题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、**网络与安全**二、**软件开发与设计**三、**数据库与数据管理**四、**编程与系统**五、**计算机硬件与性能**六、**大数据与人工智能**七、**系统与应用**相关…

人型机器人技术及前景详解

随着科技的飞速发展,人型机器人作为人工智能领域的一个重要分支,正逐步走进我们的生活和工作之中。它们不仅在外形上模拟人类,更在感知、决策、行为和交互能力上展现出强大潜力。本文将深入探讨人型机器人的技术原理、当前发展状况以及未来的…

数据结构-排序2

1.快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为: 任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子…

interwirelessac9560感叹号,电脑无法连接wifi,无法搜索到wifi

interwirelessac9560感叹号 电脑无法连接wifi,无法搜索到wifi 原因 这可能是wifl模块出现了问题。 解决方案 1、winx 打开,选择【设备管理器】 2、选择网络适配器 右键打开wireless-AC,选择【卸载设备】。 3、关机2分钟后&#xff0c…

【CSS】纯css3螺旋状loading加载特效

效果图 <div class"ai-loader"><div class"dot"></div><div class"dot"></div><div class"dot"></div><div class"dot"></div><div class"dot">&…

C语言复习概要(六)

公主请阅 1. 深入理解数组与指针在C语言中的应用1.1 数组名的理解 2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序的实现5. 二级指针6. 指针数组7. 指针数组模拟二维数组8.总结 1. 深入理解数组与指针在C语言中的应用 数组与指针是C语言的核心概念之一&#xff0c;理解…

【安装JDK和Android SDK】

安装JDK和Android SDK 1 前言2 下载2.1 下载途径2.2 JDK下载和安装2.2.1 下载2.2.2 安装并配置环境变量2.2.3 验证 2.3 SDK下载和安装2.3.1 下载2.3.2 安装2.3.3 环境变量配置2.3.4 验证 1 前言 在软件开发中&#xff0c;Android应用开发通常使用Android Studio&#xff0c;但…

使用Milvus和Llama-agents构建更强大的Agent系统

代理&#xff08;Agent&#xff09;系统能够帮助开发人员创建智能的自主系统&#xff0c;因此变得越来越流行。大语言模型&#xff08;LLM&#xff09;能够遵循各种指令&#xff0c;是管理 Agent 的理想选择&#xff0c;在许多场景中帮助我们尽可能减少人工干预、处理更多复杂任…

typescript使用webpack打包编译问题

解决方案&#xff1a;在webpack.config.js中的mdule.exports中设置mode。 再次运行npm run start即可。

【软考】设计模式之中介者模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点 1. 说明 1.用一个中介对象来封装一系列的对象交互。2.中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。3.中介者模式&#xff08;Mediator Pattern&…

Copilot Coaching新功能铸就Word更强

Copilot 的意思是副驾驶。 现在&#xff0c;您的副驾驶教练来了&#xff1a;Copilot Coaching Copilot Coaching 是 Word 中的一项新 Copilot 功能&#xff0c;可在您查看内容时为您提供支持&#xff0c;以实现语法和拼写之外的改进 - 帮助您澄清想法&#xff0c;并为您提供有…