【Linux】UDP协议

news2024/11/16 21:57:13

​🌠 作者:@阿亮joy.
🎆专栏:《学会Linux》
🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根
在这里插入图片描述

目录

    • 👉传输层👈
      • 再谈端口号
      • 端口号范围划分
      • 认识知名端口号
      • netstat
      • pidof
    • 👉UDP协议👈
      • UDP协议端格式
      • UDP的特点
      • UDP的缓冲区
      • UDP使用注意事项
      • 基于UDP的应用层协议
    • 👉总结👈

👉传输层👈

传输层在网络层提供的不可靠服务之上,主要负责两台计算机之间的端到端的通信,为应用层提供可靠的数据传输服务。

再谈端口号

端口号的作用

端口号(Port)标识了一个主机上进行网络通信的不同的应用程序,当主机从网络中获取数据时,数据需要自底向上进行交付,而上层存在多个应用程序,那么交付给哪一个应用程序就有端口号来决定。

在这里插入图片描述

五元组标识一个通信

在 TCP / IP 协议中, 用 “源IP”,“源端口号”,“目的IP”,“目的端口号” 和 “协议号” 这样一个五元组来标识一个通信。其中 IP 地址和端口号标识网络中唯一的一个进程,而协议号是一个整数,用于标识传输层使用的协议类型。常见的传输层协议包括 TCP 协议、UDP 协议等。

五元组可以通过 netstat 命令来查看

  • -a:显示所有网络连接,包括正在监听的和建立的连接。
  • -n:以数值形式显示网络地址和端口号,而不是域名和服务名。
  • -p:显示与连接相关的进程和程序名。
  • -r:显示当前系统的路由表信息。
  • -s:显示网络统计信息,如 TCP 和 UDP 的错误、丢包等。
  • -t:显示所有 TCP 连接。
  • -u:显示所有 UDP 连接。
  • -l:显示处于监听状态的连接。
netstat -nltp #显示TCP连接
netstat -nlup #显示UDP连接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

端口号范围划分

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

认识知名端口号

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

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

执行下面的命令,可以看到知名端口号。

cat /etc/services
vim /etc/services

在这里插入图片描述

在这里插入图片描述
sshd 是 Secure Shell Daemon 的缩写,它是 OpenSSH 服务器的守护进程,其端口号是 22。

一个进程可以绑定多个端口号吗?

一个进程可以绑定多个端口号。因为在计算机网络中,一个进程可能需要提供不同的服务或处理不同类型的数据流,因此需要监听不同的端口来处理来自网络的不同请求。

例如:一个 Web 服务器进程可能需要同时监听 HTTP 和 HTTPS 协议的请求,因此需要绑定80和443端口。

一个端口号可以被多个进程绑定吗?

通常情况下,一个端口号只能被一个进程绑定。这是因为端口号用于标识网络上的特定服务,当客户端尝试连接到服务器的某个端口时,操作系统需要知道哪个进程负责处理该连接请求。如果多个进程绑定到同一个端口号,操作系统将无法确定应该将连接请求发送给哪个进程。因此,当一个进程试图绑定到已经被另一个进程占用的端口时,操作系统通常会返回错误。

但是如果采取的通信协议不同,就可以绑定同一个端口号。例如:一个进程可以使用 TCP 协议绑定到端口号 80,而另一个进程可以使用 UDP 协议绑定到端口号 80。这是因为操作系统不仅根据端口号,还根据通信协议来区分不同的服务。因此,当客户端尝试连接到服务器的某个端口时,操作系统会根据客户端使用的通信协议来确定应该将连接请求发送给哪个进程。

某个报文经过网络传输到达了指定的计算机,它是如何交给指定的进程处理的呢?

当进程调用 accept 函数获取到一个新连接后,会返回一个文件描述符。那么一个连接相当于就是一个文件,而接收到报文就相当于将数据放入到文件的接收缓冲区中,此时进程就收到了这些数据了。那么现在的问题就转换成如何通过进程绑定的端口号来找到进程了。

当一个报文到达指定的计算机时,它首先会被网络协议栈处理。网络协议栈会根据报文中的信息,如目标 IP 地址和目标端口号,来确定报文应该交给哪个进程处理。操作系统会维护一个端口号到进程的映射表,当网络协议栈确定了报文应该交给哪个端口号时,它会查询这张映射表,找到对应的进程,然后将报文传递给该进程进行处理。

netstat

netstat 是一个用来查看网络状态的重要工具。

语法: netstat [选项]
功能:查看网络状态
常用选项:

  • n 拒绝显示别名,能显示数字的全部转化成数字
  • l 仅列出有在 Listen (监听) 的服务状态
  • p 显示建立相关链接的程序名
  • t(tcp)仅显示 tcp 相关选项
  • u(udp)仅显示 udp 相关选项
  • a(all)显示所有选项,默认不显示 LISTEN 相关

在这里插入图片描述

pidof

pidof 命令用于查找指定名称进程的进程 ID。

在这里插入图片描述
pidof HttpServer | xargs kill -9命令的作用是强制杀死名为 HttpServer 的进程。首先,pidof HttpServer 命令会查找名为HttpServer 的进程的进程 ID。然后,这些进程 ID 会通过管道传递给 xargs kill -9命令。xargs 命令会将接收到的进程 ID 作为参数传递给 kill -9 命令。最后,kill -9 命令会向这些进程发送 SIGKILL 信号,强制杀死这些进程。

xargs 命令是一个给命令传递参数的过滤器,也是组合多个命令的一个工具。它可以将管道或标准输入(stdin)数据转换成命令行参数传递给后一个命令,也能够从文件的输出中读取数据。xargs还可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行

将文件的时间更为最新时间

ls | xargs touch

在这里插入图片描述

将当前目录下文件名中包含 “foo” 的所有文件删除

find . -name "*foo*" | xargs rm -rf

👉UDP协议👈

UDP协议端格式

在这里插入图片描述

UDP 报文分为 UDP 报头和 UDP 数据区两部分。报头由 4 个 16 位长(2字节)字段组成,分别说明该报文的源端口、目的端口、报文长度和校验值。

  • 源端口:这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。
  • 目的端口:接收端计算机上 UDP 软件使用的端口,占据 16位。
  • 长度:该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8。
  • 校验值:该字段占据 16 位,可以检验数据在传输过程中是否被损坏。如果数据报未被损坏,网络协议栈会将其传递给上层应用程序进行处理。但是如果数据报在传输过程中丢失或损坏,UDP 协议并不会对其进行重传。

UDP 是如何将报头和有效载荷进行分离或如何对有效载荷进行封装,以及如何将有效载荷交给上层呢?

由于 UDP 报头中包含了源端口、目的端口、报文长度和校验值等信息,网络协议栈可以通过这些信息来分离报头和有效载荷。具体来说,网络协议栈会根据报文长度字段的值来确定 UDP 报文头和有效载荷的边界。

在分离出有效载荷后,网络协议栈会将其传递给上层应用程序进行处理。操作系统会维护一个端口号到进程的映射表,当网络协议栈确定了数据报应该交给哪个端口号时,它会查询这张映射表,找到对应的进程,然后将有效载荷传递给该进程进行处理。

为什么应用层使用的端口号类型是 uint16_t 呢?

应用层使用的端口号类型是 uint16_t 是因为在 UDP 和 TCP 报文头中,源端口和目的端口字段都是 16 位长。这意味着端口号的取值范围是 0 到 65535。uint16_t 类型正好可以表示这个范围内的所有整数,因此它被用作应用层端口号的类型。

理解 UDP 报文本身

在这里插入图片描述
在这里插入图片描述

UDP的特点

UDP 协议是一种无连接的、不可靠、面向数据报的传输协议。

  • 无连接:知道对端的 IP 和端口号就直接进行传输,不需要建立连接。
  • 不可靠:没有确认机制,没有重传机制。如果因为网络故障该段无法发到对方,UDP 协议层也不会给应用层返回任何错误信息。
  • 面向数据报:不能够灵活的控制读写数据的次数和数量。

为什么说 UDP 协议是面向数据报的呢?

UDP 协议是面向数据报的,这意味着它将应用层传递给它的数据作为一个独立的数据报来处理。每个数据报都包含了足够的信息,使得接收端能够将其独立地传递给上层应用程序。

在 UDP 协议中,应用层交给 UDP 多长的报文,UDP 原样发送,既不会拆分,也不会合并。这意味着,如果发送端调用一次 sendto 发送 100 个字节,那么接收端也必须调用一次 recvfrom 接收 100 个字节;而不能循环接收 10 次,每次接收 10 个字节。

由于 UDP 协议简单、高效,它仍然被广泛用于实时应用、多播和广播等场景。

UDP的缓冲区

在这里插入图片描述
sendto、recvfrom、send、recv、write 和 read 等 IO 类接口都是用于在应用程序和操作系统内核之间传输数据的系统调用。它们的本质是在用户空间和内核空间之间拷贝数据。

例如,当应用程序调用 sendto 函数发送数据时,它会将数据从用户空间拷贝到内核空间,然后由内核将数据发送到网络。同样,当应用程序调用 recvfrom 函数接收数据时,内核会将接收到的数据从内核空间拷贝到用户空间,供应用程序使用。

除了拷贝数据之外,这些 IO 类接口还会执行其他操作,如检查套接字状态、设置套接字选项、处理错误等。因此,它们不仅仅是简单的拷贝函数。

UDP的缓冲区

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

在这里插入图片描述

UDP的全双工

UDP 协议支持全双工通信,这意味着它可以同时进行发送和接收操作。也就是说,应用程序可以在不等待接收完成的情况下发送数据,反之亦然。这种全双工的工作方式提高了通信效率,使得 UDP 协议能够更好地满足实时应用的需求。

UDP使用注意事项

UDP 协议首部中有一个 16 位的最大长度,也就是说一个 UDP 能传输的数据最大长度是 64K(包含 UDP 首部)。然而 在当今的互联网环境下,64 K 是一个非常小的数字,如果我们需要传输的数据超过 64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。

基于UDP的应用层协议

  • NFS、TFTP、DHCP、BOOTP 和 DNS 都是基于 UDP 的应用层协议。
    • NFS 是网络文件系统,它允许客户端访问服务器上的文件。
  • TFTP 是简单文件传输协议,它用于在客户端和服务器之间传输文件。
  • DHCP 是动态主机配置协议,它用于自动分配 IP 地址和其他网络配置信息。
  • BOOTP 是启动协议,它用于无盘设备启动。
  • DNS 是域名解析协议,它用于将域名解析为 IP 地址。

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

👉总结👈

本篇博客主要讲解了端口号划分、知名端口号、nestat 和 pidof 指令、UDP 协议端格式、UDP 的特点、UDP 协议的使用注意事项以及基于 UDP 的应用层协议等等。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️

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

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

相关文章

目标检测应用场景—数据集【NO.14】行人跌倒测试

写在前面:数据集对应应用场景,不同的应用场景有不同的检测难点以及对应改进方法,本系列整理汇总领域内的数据集,方便大家下载数据集,若无法下载可关注后私信领取。关注免费领取整理好的数据集资料!今天分享…

什么是线程?线程和进程的关系?如何创建/查看线程?

文章目录 一. 认识线程(Thread)1.1 概念1.1.1 什么是线程1.1.2 线程存在的意义1.1.3 进程和线程之间的区别和联系1.1.4 Java的线程和操作系统的线程 1.2 创建线程① 继承Thread类② 实现Runnable 接口对比两种方法③ 变形写法④ 其他写法 1.3 查看线程 一. 认识线程(Thread) 1…

C++之科学技术法e使用(一百七十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

阿里云服务器全方位介绍_性能功能优势和租用费用

阿里云服务器全方位介绍包括云服务器ECS优势、云服务器租用价格、云服务器使用场景及限制说明,阿里云服务器网分享云服务器ECS介绍、个人和企业免费试用、云服务器活动、云服务器ECS规格、优势、功能及应用场景详细说明: 目录 什么是云服务器ECS&#…

学习笔记22 set

一、概述 Set是一种集合类型,可以快速在大量数据中查找特定值。 Set存储无序序列中的元素,并且不允许重复。与列表不同,列表中的数据可以通过索引访问,但是在集合中,元素没有与集合中的位置相关联。 Set是优化了搜索…

消息队列总结(4)- RabbitMQ Kafka RocketMQ高性能方案

1.RabbitMQ的高性能解决方案 1.1 发布确认机制 RabbitMQ提供了3种生产者发布确认的模式: 简单模式(Simple Mode):生产者发送消息后,等待服务器确认消息已经被接收。这种模式下,生产者发送消息后会阻塞&am…

M5ATOMS3基础03给ROS1发一个问候(rosserial)

引出问题 关于之前2020年的博客: 01. ESP8266和ROS调试一些问题汇总 02. ESP8266和ESP32配置(需使用ROS1和ROS2) 效果展示 使用M5ATOMS3与ROS1(kinetic,melodic,noetic)版本通信比较通用的是…

BUU [网鼎杯 2020 朱雀组]phpweb

BUU [网鼎杯 2020 朱雀组]phpweb 众生皆懒狗。打开题目,只有一个报错,不知何从下手。 翻译一下报错,data()函数:,还是没有头绪,中国有句古话说的好“遇事不决抓个包” 抓个包果然有东西,仔细一看这不就分别是函数和参…

【算法基础:贪心】6. 贪心

文章目录 区间问题905. 区间选点(排序 贪心)908. 最大不相交区间数量(排序 贪心)906. 区间分组(排序 优先队列 贪心)⭐907. 区间覆盖(排序 贪心) Huffman树148. 合并果子&#…

【LeetCode 75】第十四题(643)子数组最大平均数

题目: 示例: 分析: 给一个数组,问数组里长度为k的连续数组中的最大平均值是多少. 这题已经把意思说的很明白了,并且连子数组的长度都固定了,并且是连续的,这里可以直接使用固定长度的滑动窗口来计算. 用两个指针来在数组里划定一个长度为k的范围,然后计算指针范围内的平均数…

数组传参,指针传参

文章目录 一维数组传参二维数组传参一级指针传参二级指针传参 一维数组传参 二维数组传参 一级指针传参 二级指针传参

CentOS 8 上安装 Nginx

Nginx是一款高性能的开源Web服务器和反向代理服务器,以其轻量级和高效能而广受欢迎。在本教程中,我们将学习在 CentOS 8 操作系统上安装和配置 Nginx。 步骤 1:更新系统 在安装任何软件之前,让我们先更新系统的软件包列表和已安…

【树链剖分+MST】CF609E

Problem - E - Codeforces 题意: 思路: 先把全局的MST求出来,然后对于一条边,如果它本来就在MST中,说明代价就是MST的权值和,否则它加入MST中,此时MST形成了环,我们把环中最大的那…

深入探究Java面向对象的三大特征:封装、继承、多态

文章目录 1. 封装(Encapsulation)2. 继承(Inheritance)3. 多态(Polymorphism)结语 导语:Java是一门面向对象的编程语言,其核心思想是将现实世界中的事物抽象成对象,并通过…

Python(五十二)列表元素的判断及遍历

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

自己整理的JAVA集合

概括: 数组,链表,散列表,二分查找树,红黑树是五种不同的数据结构,它们有各自的特点和用途。ArrayList,LinkedList,HashTable,LinkedHashMap,HashMap 是 Java…

Camera组件

Clear Flags: Skybox:天空盒 Solid Color:填充颜色,当有空白处时填充背景颜色 Depth Only:只渲染想要渲染的层级 Dont Clear:不清除上一帧所留下来的数据,可以做类似残影的效果 Culling Mas…

Unity Addressable

Unity重要目录 工程中的几个重要目录 Assets存放资源、代码、配置Library大部分的资源导入到Assets目录之后,会转化成Unity认可的文件,转化后的文件会存储在这个目录Logs日志文件Packages第三方插件ProjectSettings存放各种项目设定UserSettings用户偏好…

CentOS 8 错误: Error setting up base repository

配置ip、掩码、网关、DNS VMware网关可通过如下查看 打开网络连接 配置镜像的地址 vault.centos.org/8.5.2111/BaseOS/x86_64/os/

java 阿里云 发送短信功能实现

1. 注册短信平台(以阿里云为例) 常用短信服务平台:阿里云、华为云、腾讯云、京东、梦网、乐信等 2. 注册成功后,开通短信服务 3. 设置短信签名、短信模板、AccessKey AccessKey 是访问阿里云 API 的密钥,具有账户的完全权限,我们…