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

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

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

相关文章

Ubuntu 24.04 在 BPI-F3 上通过 SD 卡安装并从 NVME 运行

github 代码: https://github.com/rcman/BPI-F3 Ubuntu 24.04 现在正在我的 BPI-F3 上运行。很快会为 YouTube 制作一个视频。 这应该适用于任何版本的 Linux,仅在 Ubuntu 24.04 上测试过 入门 下载 Bianbu映像并使用您最喜欢的工具将其映像到微型 SD 卡…

【win10】VMware Workstation 16安装win10专业版及安装VMware Tools操作说明

参考链接 VMware虚拟机安装win10系统教程(巨细)_vmware安装win10-CSDN博客https://blog.csdn.net/gdidea/article/details/129523700 win10专业版安装说明 下载win10安装包 百度网盘 链接: https://pan.baidu.com/s/1kf4ORdXYgcqwAz2j86LSZw?pwdk4…

MySQL-数据库的基础操作 o(´^`)o

文本目录: ❄️一、数据库操作: ☑ 1、查看所有的数据库: ☑ 2、创建数据库: ☑ 3、使用数据库: ☑ 4、删除数据库: ❄️二、常用的数据类型: ➷ 1、数值类型: ➷ 2、字符串类型&a…

【2D/3D-Lidar-SLAM】 Cartographer详细解读

【2D/3D-Lidar-SLAM】 Cartographer详细解读 1. 摘要2. Cartographer系统数据处理流程2.1. 数据获取(Input Sensor Data)2.2 姿态外推器(PoseExtrapolator)2.3 局部建图(Local SLAM) 3. 关键模块实现 3.1 局…

MyBatis XML映射文件

XML映射文件 XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)XML映射文件的namespace属性为Mapper接口全限定名一致XML映射文件中SQL语句的id与Mapper接口中的方法名一致,并保持返…

某知名国企面试题

引言 金九银十,求职热潮再度来袭。最近,有位同学去一家知名国企应聘,回来后带回了一套面试题。这套面试题非常典型,其中包含了许多供应链金融方面的典型问题。这些问题很有分享的价值,大家也可以先自己独立思考一下&a…

Chromium cookies数据存储位置介绍c++

一、cookies数据库存储位置: C:\Users\Administrator\AppData\Local\Chromium\User Data\Default\Network\Cookies 二 、数据库操作类: net\extras\sqlite\sqlite_persistent_cookie_store.cc net\extras\sqlite\sqlite_persistent_cookie_store.h …

003 Springboot操作RabbitMQ

Springboot整合RabbitMQ 文章目录 Springboot整合RabbitMQ1.pom依赖2.yml配置3.配置队列、交换机方式一:直接通过配置类配置bean方式二:消息监听通过注解配置 4.编写消息监听发送测试5.其他类型交换机配置1.FanoutExchange2.TopicExchange3.HeadersExcha…

4D-fy: Text-to-4D Generation Using Hybrid Score Distillation Sampling技术路线

这篇文章分为四部分,首先从2021年的CLIP说起。 这篇论文的主要工作是提出了一种名为 CLIP(Contrastive Language-Image Pre-training) 的模型,它通过自然语言监督学习视觉模型,以实现视觉任务的零样本(zer…

20 Shell Script输入与输出

标出输入、标准输出、错误输出 一、程序的基本三个IO流 一)文件描述符 ​ 任何程序在Linux系统中都有3个基本的文件描述符 ​ 比如: ​ cd/proc/$$/fd ​ 进入当前shell程序对于内核在文件系统的映射目录中: [rootlocalhost ~]# cd /proc/$$/fd [rootlocalhos…

Web集群服务-代理和负载均衡

1. 概述 1. 用户----->代理--->Web节点,后面只有一个节点,一般使用的是nginx代理功能即可 2. 后面如果是集群需要使用nginx负载均衡功能 2. 代理分类 代理分类方向应用正向代理用户(服务器)-->代理--->外部(某网站)服务器通过代理实现共享上网/访问公网反向代理用…

Linux:进程控制(三)——进程程序替换

目录 一、概念 二、使用 1.单进程程序替换 2.多进程程序替换 3.exec接口 4.execle 一、概念 背景 当前进程在运行的时候,所执行的代码来自于自己的源文件。使用fork创建子进程后,子进程执行的程序中代码内容和父进程是相同的,如果子进…

Python基础语法条件

注释 注释的作用 通过用自己熟悉的语言,在程序中对某些代码进行标注说明,这就是注释的作用,能够大大增强程序的可读性。 注释的分类及语法 注释分为两类:单行注释 和 多行注释。 单行注释 只能注释一行内容,语法如下…

跟着小土堆学习pytorch(一)——Dataset

文章目录 一、前言二、dataset三、代码展示 一、前言 pytorch也是鸽了很久了,确定了下,还是用小土堆的教程。 kaggle获取数据集 二、dataset dateset:数据集——提供一种方式去获取数据及其标签 如何获取数据及其标签以及总共多少个数据…

PostgreSQL学习笔记六:模式SCHEMA

模式(Schema) PostgreSQL中的模式(Schema)是一个命名的数据库对象集合,包括表、视图、索引、数据类型、函数、存储过程和操作符等。模式的主要作用是组织和命名空间数据库对象,使得同一个数据库中可以包含…

基于gewechat制作第一个微信聊天机器人

Gewe 个微框架 GeWe(个微框架)是一个创新性的软件开发框架,为个人微信号以及企业信息安全提供了强大的功能和保障。GeWe的设计旨在简化开发过程,使开发者能够高效、灵活地构建和定制通信协议,以满足不同应用场景的需求…

JavaScript object(2)

这样的话,就变成只读了。

外包干了5天,技术明显退步

我是一名本科生,自2019年起,我便在南京某软件公司担任功能测试的工作。这份工作虽然稳定,但日复一日的重复性工作让我逐渐陷入了舒适区,失去了前进的动力。两年的时光匆匆流逝,我却在原地踏步,技术没有丝毫…

Qualitor checkAcesso.php 任意文件上传漏洞复现(CVE-2024-44849)

0x01 漏洞概述 Qualitor 8.24及之前版本存在任意文件上传漏洞,未经身份验证远程攻击者可利用该漏洞代码执行,写入WebShell,进一步控制服务器权限。 0x02 复现环境 FOFA:app="Qualitor-Web" 0x03 漏洞复现 PoC POST /html/ad/adfilestorage/request/checkAcess…

【IC验证】随机约束

1.约束 (1)注意 一般随机约束只能在类中使用; (2)实现步骤 在定义变量时,用rand/randc关键字进行修饰; 定义约束; 创建并实例化类后,调用随机约束方法; &am…