【Linux】UDP协议

​🌠 作者:@阿亮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.mzph.cn/news/16171.shtml

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

相关文章

Mysql的锁

加锁的目的 对数据加锁是为了解决事务的隔离性问题,让事务之前相互不影响,每个事务进行操作的时候都必须先加上一把锁,防止其他事务同时操作数据。 事务的属性 (ACID) 原子性 一致性 隔离性 持久性 事务的隔离级别 锁…

Python入门【__init__ 构造方法和 __new__ 方法、类对象、类属性、类方法、静态方法、内存分析实例对象和类对象创建过程(重要)】(十四)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…

[C++] 类与对象(上)

目录 1、前言 2、类的引入 3、类的定义 3.1 类的两种定义方式 4、类的访问限定符 5、类的作用域 6、类的实例化 7、类对象模型 7.1 内存对齐规则 7.1 类对象的存储方式 8、this指针 8.1 this指针的特性 8.2 this指针是否可以为空 1、前言 C语言是面向过程的&#…

DUBBO服务多网卡,服务调用失败

如果服务器是多网卡的,比如安装了docker,有一个docker虚拟网卡,一个实体网卡eth0,当我们运行springboot应用后,dubbo注入到zk的地址是 docker虚拟网卡的地址172网段,而不是实际内网地址192网段,…

类的封装和包(JAVA)

封装 所有的OOP语言都会有三个特征: 封装;继承;多态。 本篇文章会为大家带来有关封装的知识。 在我们日常生活中可以看到电视就只有那么几个按键(开关,菜单……)和一些接口,而而我们通过这些东…

【计算机视觉|人脸建模】SOFA:基于风格、由单一示例的2D关键点驱动的3D面部动画

本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 标题:SOFA: Style-based One-shot 3D Facial Animation Driven by 2D landmarks 链接:SOFA: Style-based One-shot 3D Facial Animation Driven by 2D landmarks | Proceedings of …

jmeter压力测试指标解释

目录 RT(response time) Throughput 吞吐量 并发用户数 QPS (query per seconds) TPS (transition per seconds) PV和UV 聚合报告: RT(response time) 什么是RT? RT就是指系统在接收到请求和做出相应这段时间跨度 但是值得一提的是RT的值越高,并不真的就能…

什么是云原生和 CNCF?

一、CNCF简介 CNCF:全称Cloud Native Computing Foundation(云原生计算基金会),成立于 2015 年 12 月 11 日,是一个开源软件基金会,它致力于云原生(Cloud Native)技术的普及和可持续…

Klipper seria.c 文件代码分析

一. 前言 Klipper 底层硬件的串口模块程序写的是否正确是决定下位机与上位机能否正常通信的前提,如果这个文件的驱动没写好,那上位机控制下位机就无从谈起,更无法通过上位机去验证下位机程序的正确性。 本篇博文将详细解析 Klipper src 文件夹…

809协议

809协议 目录概述需求: 设计思路实现思路分析1.809协议数据流——链路管理类 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,…

在idea中添加try/catch的快捷键

在idea中添加try/catch的快捷键 在idea中添加try/catch的快捷键 ctrlaltt 选中想被try/catch包围的语句,同时按下ctrlaltt, 出现下图 选择try/catch即可。

Elasticsearch搜索引擎系统入门

目录 【认识Elasticsearch】 Elasticsearch主要应用场景 Elasticsearch的版本与升级 【Elastic Stack全家桶】 Logstash Kibana Beats Elasticsearch在日志场景的应用 Elasticsearch与数据库的集成 【安装Elasticsearch】 安装插件 安装Kibana 安装Logstash 【认…

C# 2的幂

231 2的幂 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n 2x ,则认为 n 是 2 的幂次方。 示例 1: 输入:n 1 输出&a…

【图论】三种中心性 —— 特征向量、katz 和 PageRank

维基百科:在图论和网络分析中,中心性指标为图中相应网络位置的节点分配排名或数值。中心性这一概念最初起源于社交网络分析,因此很多衡量中心性的术语也反映了其社会学背景。 不同中心性指标对 “重要” 的衡量方式不同,因此适用于…

惊喜!1行Python代码,瞬间测你工作量,分享一个统计代码行数的神器

大家好,这里是程序员晚枫。 **你想不想知道一个项目中,自己写了多少行代码?**我用今天的工具统计了一下开源项目:python-office的代码行数,竟然有21w行! 我们一起看一下怎么用最简单的方法,统…

mac下安装vue cli脚手架并搭建一个简易项目

目录 1、确定本电脑下node和npm版本是否为项目所需版本。 2、下载vue脚手架 3、创建项目 1、下载node。 如果有node,打开终端,输入node -v和npm -v , 确保node和npm的版本,(这里可以根据自己的需求去选择,如果对最新版本的内容有…

IO进程线程day3(2023.7.31)

一、Xmind整理&#xff1a; 文件描述符概念&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;用fread和fwrite实现文件拷贝 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <head.h> int main(int argc, const char…

什么叫前后端分离?为什么需要前后端问题?解决了什么问题?

单体架构出现的问题 引出&#xff1a;来看一个单体项目架构的结构 通过上述可以看到单体架构主要存在以下几点问题&#xff1a; 开发人员同时负责前端和后端代码开发&#xff0c;分工不明确开发效率低前后端代码混合在一个工程中&#xff0c;不便于管理对开发人员要求高(既会前…

千元内合板和单板吉他怎么选?SAGA萨伽SF600和VEAZEN费森CLR300怎么样?哪一款更适合初学者入门使用!【吉他评测】

对于预算不多的朋友&#xff0c;在选购前翻阅查询很多资料&#xff0c;吉他材质、桶型和尺寸等等疑问&#xff0c;不知道怎么选&#xff0c;无从下手&#xff0c;还容易遇到烧火棍&#xff0c;在这里介绍这两款VEAZEN费森CLR300&#xff08;单板&#xff09;和SAGA萨伽SF600&am…

vuejs源码阅读之代码生成器

代码生成器是模版编译的最后以后&#xff0c;它的作用是将AST转换成渲染函数中的内容&#xff0c;这个内容可以称为代码字符串。 代码字符串可以被包装在函数中执行&#xff0c;这个函数就是我们通常说的渲染函数。 渲染函数被执行之后&#xff0c;可以生成一份VNode&#xf…