【传输层协议】UDP协议 {端口号的范围划分;UDP数据报格式;UDP协议的特点;UDP的缓冲区;基于UDP的应用层协议}

一、再谈端口号

1.1 端口号标识网络进程

如何通过端口号找到主机上的网络进程?

  1. 在socket编程中bind绑定是最为重要的一步:
  2. 他将套接字与指定的本地 IP 地址和端口号关联起来,这意味着指定的套接字可以接收来自指定 IP 地址和端口号的数据包。
  3. 同时系统也会为端口号与进程pcb指针建立映射关系,这意味着通过端口号就可以找到与之关联的进程。

1.2 使用“五元组”标识一个通信

在这里插入图片描述

端口号(Port)标识了一个主机上进行通信的不同的应用程序

在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看);

netstat 查看网络状态的重要工具


1.3 端口号的范围划分

在这里插入图片描述

  • 0 - 1023:这个范围内的端口号被保留用于一些特定的服务和应用程序,称为“系统端口”或“熟知端口”Well-Know Port Number)。例如:HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的。系统一般不允许用户自己绑定这个范围内的端口号。
  • 1024 - 65535:这个范围内的端口号大多数是可以自由绑定的,但也有个别例外,比如mysql绑定3306号端口。除去这些例外,其他的端口号可以由用户显式bind绑定,也可以由操作系统动态分配(客户端端口号绑定)。

常用的熟知端口

有些服务器是非常常用的, 为了使用方便, 人们约定一些常用的服务器, 都是用以下这些固定的端口号:

  • ssh服务器, 使用22端口
  • ftp服务器, 使用21端口
  • telnet服务器, 使用23端口
  • http服务器, 使用80端口
  • https服务器, 使用443端口

提示:在/etc/services文件中可以查看到系统中所有的知名端口号。我们自己编写的程序使用端口号时, 要避开这些知名端口号.

两个问题

  1. 一个进程是否可以bind多个端口号?当然可以,一个进程可以从多个端口收发数据。
  2. 一个端口号是否可以被多个进程bind?不可以,端口号指向系统中唯一的一个进程。

介绍两个小工具:

  1. pidof <进程名>:通过进程命查看进程ID,在查看服务器的进程ID时非常方便。
  2. ... | xargs proc ...:xargs可以将前面命令行中管道文件的输出转换为之后程序的命令行参数。

打一套组合拳:

在这里插入图片描述


二、UDP协议

2.1 UDP数据报格式

UDP(User Datagram Protocol,用户数据报协议)是工作在OSI(开放系统互连,Open Systems Interconnection)模型中传输层的一种协议,使用IP作为底层协议。UDP协议的格式相对简单,主要由以下几个部分组成:

在这里插入图片描述

UDP数据报分为首部和用户数据部分,整个UDP数据报作为IP数据报的数据部分封装在IP数据报中。UDP数据报文结构包括:

  • 源端口号(Source Port):占用2个字节(16位),表示发送方端口号。在要求对方回信时选用,不要求时可使用全0。
  • 目的端口号(Destination Port):占用2个字节(16位),表示接收方端口号。在终点交付报文时必须使用。
  • 长度(Length):占用2个字节(16位),表示UDP数据报的长度,包括首部和数据部分。其标定的长度最小值是8B(只有首部),最大值是2^16 = 64KB。
  • 校验和(Checksum):占用2个字节(16位),用于检测UDP数据报在传输过程中是否有错误。如果检测到校验和出错,就会直接丢弃该报文。
  • 数据(Data):占用0个或多个字节,是实际传输的数据部分。

UDP如何将报头与有效载荷进行分离?

  • UDP采用定长报头,UDP在读取报文时读取完前8个字节后剩下的就都是有效载荷

UDP如何决定将有效载荷交付给上层的哪一个协议?

  • UDP是通过报头当中的目的端口号来找到对应的应用层进程的,即由目的端口号决定。
  • 当UDP数据报到达时,操作系统会根据目的端口号找到相应的应用程序或服务,并将数据报交付给它进行处理

在Linux内核中数据报是怎样被封装和管理的?

在这里插入图片描述

  1. 首先Linux内核是使用C语言编写的,那么UDP作为传输层协议(内核中)自然也是一样。

  2. 所以UDP报头结构在内核中其实就是一个结构体类型:

    在这里插入图片描述

  3. 所以当应用程调用sendto接口发送数据时,系统就会创建并填充UDP报头。

  4. sk_buff(socket buffer)结构是linux网络代码中重要的数据结构,它负责管理和控制接收或发送数据包的信息

  5. sk_buff结构其实就是对数据报的封装,将UDP协议的报头和数据内容封装成一份完整的数据报。

  6. sk_buff结构中包含prev和next指针,操作系统将所有进程发出的sk_buff通过链表组织到一起,按序发送到网络。

  7. 对端主机将接收到的数据存入新创建的sk_buff结构当中,并依据端口号将其分派给对应进程的UDP接收缓冲区。

  8. 客户端调用recvfrom接口从UDP缓冲区读取数据,得到源端口号和报文内容。

注意:sk_buff结构较为复杂,上面的内容只是我片面的理解,甚至可能存在错误。

详情请阅读:Linux内核:sk_buff解析 - 唐稚骅 - 博客园 (cnblogs.com)


2.2 UDP协议的特点

  • 无连接:UDP在发送数据前不进行连接,发送结束时也没有连接可以释放,减少了开销和发送数据之前的时延。
  • 不可靠:没有确认机制,没有重传机制,如果因为网络故障使该段无法发送到对方,UDP协议层也不会给应用层返回任何错误信息。也正是因为UDP不保证可靠交付,使得主机不必维持复杂的连接状态。
  • 面向报文:发送方的UDP对应用程序交下来的报文,再添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。发送方发送了多少次数据报,接收方就需要接收多少次,不能一次性合并接收,也不存在接收到不完整的数据报。
  • 无拥塞控制:很多实时应用(如IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许网络发生拥塞时丢失一些数据,却不允许数据有太大的时延,UDP正好适合这种要求。
  • 首部开销小:UDP只有8个字节的首部,适用于对时间敏感、但对可靠性要求不高的应用场景。
  • 全双工通信:虽然UDP没有发送缓冲区,但是UDP的socket既能读,也能写,所以也是全双工通信协议。

综上所述,UDP协议的格式简单,开销小,适用于对实时性要求较高但对可靠性要求不高的应用场景。

面向数据报

  • 应用层交付给UDP多长的报文,UDP就原样发送,既不会拆分,也不会合并,这就叫做面向数据报。

  • 可以想像成快递:你朋友给你发了1个快递,你就只能收1个快递,你不能只收0.5个快递,也不能收2个快递,你只能收1个,即发多少就收多少。

  • UDP发送的数据不能太大,UDP的报文最大长度是64KB(UDP首部+UDP数据)

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


2.3 UDP的缓冲区

  • UDP没有真正意义上的发送缓冲区。调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作。
  • UDP具有接收缓冲区。但是这个接收缓冲区不能保证UDP数据报的接收顺序和发送顺序一致;如果缓冲区满了,再到达的UDP数据报就会被丢弃。

为什么UDP没有发送缓冲区

  • 因为不需要,UDP协议的设计目标是提供一种简单的、无连接的通信方式。
  • UDP协议的设计初衷是为了实现高效的数据传输,尽量减少协议本身的开销。不提供可靠性和流量控制的机制,因此不需要发送缓冲区
  • 调用sendto会把数据直接交给内核,由内核将数据传给网络层协议进行后续的传输动作。

为什么UDP要有接收缓冲区?

虽然 UDP 是一种无连接的、不可靠的传输协议,但仍然需要接收缓冲区来暂时存储接收到的 UDP 数据包。以下是几个理由:

  1. 数据处理速度不匹配:发送端的数据处理速度可能快于接收端的数据处理速度。如果没有接收缓冲区,接收端处理数据的速度跟不上发送端发送数据的速度,可能导致数据包在传输过程中被丢弃或溢出。通过接收缓冲区,接收端可以临时存储尚未处理的数据包,以便之后逐个处理。

  2. 数据包乱序、丢失处理:由于 UDP 协议本身不提供拥塞控制和重传机制,可能会导致数据包乱序到达或部分数据包丢失。接收缓冲区可以暂时保存乱序到达的数据包,并允许应用程序按顺序处理数据。此外,接收缓冲区还可以让应用程序检查是否丢失了某些数据包,并采取适当的措施。

  3. 简化应用程序设计:即使 UDP 是一种简单的协议,但应用程序仍需要一定的缓冲区来存储接收的数据。接收缓冲区的存在可以简化应用程序设计,让应用程序不需要关心接收时的数据处理细节,只需从缓冲区中读取数据即可。

总之,虽然 UDP 协议不提供可靠性保证,但接收缓冲区仍然是必要的,用于在一定程度上处理乱序到达、丢包等情况,并为应用程序提供一个暂存数据的地方,以便后续处理。


三、基于UDP的应用层协议

  • NFS:网络文件系统
  • TFTP:简单文件传输协议
  • DHCP:动态主机配置协议
  • BOOTP:启动协议(用于无盘设备启动)
  • DNS:域名解析协议

提示:当然, 也包括你自己写UDP程序时自定义的应用层协议。

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

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

相关文章

收银系统源码助力零售门店数字化升级

一、国内零售业数字化转型迈入深水区 近年来&#xff0c;我国零售业数字化进程显著加速&#xff0c;从线上电商到新零售模式&#xff0c;再到利用大数据、人工智能等技术优化供应链、提升体验&#xff0c;每一步都见证了行业的深刻变革。随着零售行业进入存量市场竞争&#xf…

微服务设计原则——高性能:存储设计

文章目录 1.读写分离2.分库分表3.动静分离4.冷热分离5.重写轻读6.数据异构参考文献 任何一个系统&#xff0c;从单机到分布式&#xff0c;从前端到后台&#xff0c;功能和逻辑各不相同&#xff0c;但干的只有两件事&#xff1a;读和写。而每个系统的业务特性可能都不一样&#…

LangChain框架深度解析:对Chains组件的全方位探索与实战案例

文章目录 前言一、Chains二、LLMChain⭐1.LLMChain介绍2.LLMChain案例 三、SimpleSequentialChain⭐1.SimpleSequentialChain介绍2.SimpleSequentialChain案例 四、SequentialChain⭐1.SequentialChain介绍2.SequentialChain案例 五、RouterChain⭐1.RouterChain介绍2.RouterCh…

leetcode:2520. 统计能整除数字的位数(python3解法)

难度&#xff1a;简单 给你一个整数 num &#xff0c;返回 num 中能整除 num 的数位的数目。 如果满足 nums % val 0 &#xff0c;则认为整数 val 可以整除 nums 。 示例 1&#xff1a; 输入&#xff1a;num 7 输出&#xff1a;1 解释&#xff1a;7 被自己整除&#xff0c;因…

大模型概念入门:探索这一AI技术的奥秘

一、引言 ChatGPT、Open AI、大模型、提示词工程、Token、幻觉等人工智能的黑话&#xff0c;在2023年这个普通却又神奇的年份里&#xff0c;反复的冲刷着大家的认知。让一部分人彻底躺平的同时&#xff0c;让另外一部分人开始焦虑起来&#xff0c;生怕在这个人工智能的奇迹之年…

JRE和JDK概念区分

1.JRE Java Runtime Environment&#xff1a;java运行环境。JVMJava类库。开发好的java程序&#xff0c;直接运行&#xff0c;可只安装JRE。 2.JDK Java Development Kit&#xff1a;java软件开发工具包。JREJava开发工具。编译、运行java代码。 3.总结 JRE就是运行Java字…

跨界融合,《黑神话:悟空》这把火,能否为实景三维再造商机?

8月20号&#xff0c;国产3A游戏《黑神话&#xff1a;悟空》正式上线&#xff0c;全球发售 这几天&#xff0c;国产游戏《黑神话:悟空》终于面世&#xff0c;迅速引爆了全球游戏市场。 《黑神话&#xff1a;悟空》作为一款国产3A游戏&#xff0c;不仅在游戏设计和玩法上实现了…

智慧水务项目(七)vscode 远程连接ubuntu 20.04 服务器,调试pyscada,踩坑多多

一、说明 以前用过pycharm&#xff0c;远程连接还可以&#xff0c;但是vscode用以前还可以&#xff0c;就用它开发python了&#xff0c;想搞个远程&#xff0c;源码直接放服务器上&#xff0c;能远程调试&#xff0c;其实也很方便的&#xff0c;结果第一次还成功了&#xff0c;…

语雀:高效记录与整理编程学习笔记的最佳实践

目录 语雀&#xff1a;高效记录与整理编程学习笔记的最佳实践 一、编程学习笔记的要求与目的 二、记录编程学习笔记的目的 三、如何高效地记录与整理编程学习笔记 四、推荐平台&#xff1a;语雀 1、语雀的优势&#xff1a; 2、如何使用语雀整理编程学习笔记&#xff1a;…

Java二十三种设计模式-状态模式(20/23)

本文深入探讨了状态模式&#xff0c;一种允许对象根据其内部状态变化而改变行为的软件设计模式。文章从定义、组成部分、实现方式、使用场景、优缺点分析、与其他模式的比较&#xff0c;到最佳实践和建议&#xff0c;全面介绍了状态模式的各个方面。通过Java语言的实现示例和实…

Aixos食用指南,超全面详细讲解!

前言&#xff1a;axios是目前最流行的ajax封装库之一&#xff0c;用于很方便地实现ajax请求的发送。特意花费了两个小时为大家准备了一份全面详细的Aixos食用指南&#xff0c;需要的小伙伴点个关注 哦~&#x1f495; &#x1f308;&#x1f308;文章目录 Axios 简介 Axios 特…

基于cubemx的STM32F103ZET6的freertos实现多任务流水灯

1、任务概述 使用freertos多任务系统实现正点原子STM32F103ZET6开发板的流水灯点亮控制。 2、cubemx设置 &#xff08;1&#xff09;SYS设置&#xff0c;注意选择定时器源为TIM1-TIM8的任一个&#xff0c;因为滴答定时器被多任务系统占用不能选择 &#xff08;2&#xff09;时…

Oracle数据库最新的支持服务年限

根据图示&#xff0c;建议尽快升级到19c或者23ai

彻底解决win7系统文件夹选项高级设置是空白

需求背景 win7系统的文件夹选项-高级设置里面是空白的,效果图如下。 解决方法 1、新建txt文本文档 2、文档内容 复制下面的内容到txt文件中,然后保存。 Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Ad…

ClickHouse集群的安装

目录 1.clickhouse中文文档地址 2.centos安装部署 2.1采用tgz的方式安装 2.2修改配置文件 2.3修改数据目录 2.4创建角色和目录 3 集群安装 3.1配置文件修改 3.2启动zookeeper 3.3启动clickhouse-server 3.4任意节点连接clickhouse 3.5查看集群 3.6建库 3.7查看数…

一文贯通LLM推理相关知识【上下文长度、量化、模型大小】

1 不同参数量LLM推理需要多少显存&#xff1f; 2 Batch Size&#xff0c;量化对所需显存有什么影响&#xff1f; 要点&#xff1a; BatchSize增加&#xff0c;显存占用也会增加。量化可以节省显存&#xff1a;通过下表中的数据可以看到&#xff0c;6B模型在float16时占用12G显…

美国洛杉矶服务器地址在哪里?

美国洛杉矶服务器地址不是单一固定不变的&#xff0c;而是泛指那些部署在洛杉矶地区的众多服务器的IP地址和端口号。这些服务器分布于各数据中心之中&#xff0c;承担着数据存储、网络通信和云计算等多项关键任务。下面将展开介绍洛杉矶服务器地址的相关内容&#xff1a; 1.洛…

神经网络算法 - 一文搞懂BERT(基于Transformer的双向编码器)

本文将从BERT的本质、BERT的原理、BERT的应用三个方面&#xff0c;带您一文搞懂Bidirectional Encoder Representations from Transformers | BERT。 Google BERT BERT架构&#xff1a; 一种基于多层Transformer编码器的预训练语言模型&#xff0c;通过结合Tokenization、多种E…

Vue vue/cli3 与 vue/cli4 v-for 和 v-if 一起使用冲突

问题描述 异常信息&#xff1a;[vue/no-use-v-if-with-v-for] The this.$router.options.routers expression inside v-for directive should be replaced with a computed property that returns filtered array instead. You should not mix v-for with v-if.eslint-plugin-v…

几十块一年的网站SSL证书哪里申请

几十块一年的网站SSL证书通常可以通过以下几种途径申请&#xff1a; 一、选择合适的SSL证书类型 首先&#xff0c;您需要了解不同类型的SSL证书及其价格差异。对于预算有限的用户&#xff0c;域名验证&#xff08;DV&#xff09;SSL证书是一个经济实惠的选择。这类证书主要验…