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

news2024/11/30 8:35:55

在这里插入图片描述

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

从零开始理解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, 就需要在应用层手动的分包,多次发送, 并在接收端手动拼装。多次发送,接收端手动拼装!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

个性化图像生成新SOTA!阿里开源MIP-Adapter,可将无需微调的IP-Adapter推广到同时合并多个参考图像。

今天给大家介绍阿里最近开源的个性化图像生成的新方法MIP-Adapter,将无需微调的预训练模型(IP-Adapter)推广到同时合并多个参考图像。MIP-Adapter会根据每个参考图像与目标对象的相关性来给这些图像分配不同的“重要性分数”。这样&#xff0…

OpenShift 4 - 云原生备份容灾 - Velero 和 OADP 基础篇

《OpenShift 4.x HOL教程汇总》 说明: 本文主要说明能够云原生备份容灾的开源项目 Velero 及其红帽扩展项目 OADP 的概念和架构篇。操作篇见《OpenShift 4 - 使用 OADP 对容器应用进行备份和恢复(附视频) 》 Velero 和 OADP 包含的功能和模…

十、Python基础语法(循环-while循环)

什么是循环&#xff1f;在满足条件的情况下,让指定的代码重复执行 。 一、while循环 while是python中的关键字&#xff0c;作用是用来实现循环的。 语法&#xff1a; 需求&#xff1a; 打印10次“我爱学习” a 0while a < 10:print(我爱学习)a 1运行结果&#xff1a;…

C++(类和对象—对象特性)

对象的初始化和清理 生活中我们买的电子产品都基本会有出厂设置&#xff0c;在某一天我们不用时候也会删除一些自己信息数据保证安全。 C中的面向对象来源于生活&#xff0c;每个对象也都会有初始设置以及对象销毁前的清理数据的设置。 1.构造函数和析构函数 对象的初始化和清理…

ROS理论与实践学习笔记——5 ROS机器人系统仿真之URDF、Gazebo与Rviz综合应用

6.1 机器人运动控制以及里程计信息显示 &#xff08;1&#xff09;ros_control 简介 场景&#xff1a;如何在不同的机器人系统上实现同一套 ROS 程序的部署&#xff1f;例如&#xff0c;在开发阶段&#xff0c;为了提高测试效率&#xff0c;程序通常在仿真平台&#xff08;如 …

vue2 Canvas 多边形区域绘制组件封装

效果预览&#xff1a; CanvasBox组件 <!-- 区域设置canvas --> <template><div class"all" ref"divideBox"><!-- <div><button click"test">清空</button></div> --><img id"img"…

FineReport 标题冻结,冻结表头,冻结行列

先进行重复标题行和重复标题列设置&#xff0c;然后再进行分页冻结设置 1、冻结列 SELECT * FROM S人员花名册选定列 – 右击 – 设置重复标题列 2、冻结行 选定行 – 右击 – 设置重复标题行 3、重复与冻结设置 模板 – 重复与冻结设置 冻结重复标题有分页冻结和填报…

Leecode刷题之路第20天之有效的括号

题目出处 20-有效的括号-题目出处 题目描述 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 1.左括号必须用相同类型的右括号闭合…

GraphRAG:知识图谱+RAG技术

由于RAG的一些缺陷&#xff0c;最近工作中用到了GraphRAG&#xff0c;可以简单理解为知识图谱RAG工作&#xff0c;在进行QFS与深度推理上表现良好。老板希望&#xff0c;在类似于库存管理、预测上面&#xff0c;可以结合更多的上下文信息和逻辑关系&#xff0c;进行推理和结果的…

一文带你了解,2024年世界职业院校技能大赛该如何备赛

2024年世界职业院校技能大赛&#xff08;以下简称“大赛”&#xff09;即将拉开帷幕&#xff0c;这不仅是一次展示职业院校学生专业技能的舞台&#xff0c;更是促进国际职业教育交流与合作的重要契机。为了确保参赛队伍能在比赛中取得优异成绩&#xff0c;以下是一些具体建议&a…

【第2章 开始学习C++】函数

文章目录 导语使用有返回值的函数函数变体用户定义的函数用户定义的有返回值的函数 导语 函数用于创建 C 程序的模块&#xff0c; 对 C 的 OOP 定义至关重要。 C 函数分两种&#xff1a; 有返回值的和没有返回值的。 使用有返回值的函数 有返回值的函数将生成一个值&#x…

MySQL SELECT 查询(二):复杂查询的实现

MySQL SELECT 查询&#xff08;二&#xff09;&#xff1a;复杂查询的实现 文章目录 MySQL SELECT 查询&#xff08;二&#xff09;&#xff1a;复杂查询的实现1. 多表查询1.1 常见错误&#xff1a;笛卡尔积与属性归属1.2 连接条件与规范1.3 连接类型1.4 SQL99 连接特性 2. SQL…

C++红黑树(简单易懂)

C红黑树 红黑树红黑树的概念 红黑树节点的定义红黑树的插入颜色变化红黑树的插入拷贝构造红黑树的验证全部代码实现红黑树与AVL树的比较红黑树的应用 &#x1f30f;个人博客主页&#xff1a;个人主页 红黑树 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在…

Java并发 - 线程池

文章目录 总体设计常见线程池FixedThreadPoolCachedThreadPoolSingleThreadPoolThreadPoolExecutor 核心参数工作原理生产者消费者模型创建线程池提交任务任务提交方式任务提交流程executeaddWorker Worker队列线程运行 runWoker获取任务销毁工作线程线程池关闭shutdown/shutdo…

维修数据屏:重塑热力公司运维管理新格局

在热力公司的运维管理中&#xff0c;高效的报修和维修流程是确保系统稳定运行的关键。随着科技的发展&#xff0c;维修数据屏的出现为热力公司的运维工作带来了重大变革。 一、传统热力运维面临的挑战 过去&#xff0c;热力公司在报修和维修方面存在诸多问题&#xff0c;给运维…

基于Java的超市管理系统(源码+定制+解答)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

创建包含可导入浏览器信任的SSL自签名证书

问题&#xff1a;现在的三大浏览器&#xff0c;chrome、edge、firefox 一般都默认启用https检查&#xff0c;这就要求我们自建的局域网内的网址和其他诸如nextcloud、photoprism、tiddlywiki等应用也必须要有证书。解决方法是使用openssl自己生成一个。由此则会再衍生出一个问题…

哪款宠物空净运行吸毛好、噪音小?希喂、霍尼韦尔、安德迈测评!

作为宠物领域目前最火热的产品&#xff0c;宠物空气净化器的讨论度一直很高。身为铲屎官的我在产品刚出的时候就购入了一台&#xff0c;结果让我非常失望&#xff01; 抛开产品效果不提&#xff0c;它运行起来的声音实在太大了&#xff01;我家猫根本不愿意靠近&#xff0c;每…

定焦镜头可以改变焦距吗?

1、问题背景 焦距是镜头的一个固有光学特性&#xff0c;和镜头设计相关&#xff0c;所谓定焦镜头&#xff0c;焦距肯定是固定不变的。 但有个问题一直有点疑惑&#xff0c;焦距是镜头中心到焦点的距离&#xff0c;当我们拧动镜头调焦的过程&#xff0c;就是为了使得焦点成像在传…

信息安全保障人员认证(CISAW)全攻略

由中国网络安全审查认证和市场监管大数据中心耗时六年&#xff0c;汇聚业界专家、企业翘楚、高校及研究机构学者共同精心打磨而成的针对信息安全保障的不同专业技术方向、应用领域和保障岗位&#xff0c;依循国际标准 ISO/IEC 17024《人员认证机构通用要求》所构建的、多层次的…