【网络】传输层——UDP协议

> 作者:დ旧言~

> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:了解传输层下的UDP协议。

> 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安!

> 专栏选自:网络

> 望小伙伴们点赞👍收藏✨加关注哟💕💕

​​

一、前言

前面我们已经学习了网络的基础知识,对网络的基本框架已有认识,算是初步认识到网络了,如果上期我们的学习网络是步入基础知识,那么这次学习的板块就是基础知识的实践,我们今天的板块是学习网络重要之一,学习完这个板块对虚幻的网络就不再迷茫!!!

主体

学习【网络】传输层------UDP协议咱们按照下面的图解:

2.1 传输层

概念:

传输层:负责负责两台计算机之间的端到端的通信,确保数据能够可靠的传送到目标主机,为应用层提供可靠的数据传输服务。我们可以简单的理解为传输层协议是将数据直接发送到了网络当中。

传输层作用:

  • 传输层能够实现端到端的连接。比如说我们用QQ与别人发信息,网络层能够将信息发送到对方的主机上,主机上使用什么协议来接受这个信息就由传输层来完成,所以传输层实现的是进程到进程间的连接。
  • 传输层提供的是应用程序间的逻辑通信,也就是说它向高层(应用层)屏蔽了下面网络层的细节,使应用程序看起来好像是在传输层之间沿着水平方向传输数据,但事实上两者之间并没有这样一条实际的物理连接。

传输层的作用:

  • 为上面的应用层提供通信服务,提供应用进程间的逻辑通信
  • 在 OSI 七层参考模型中,传输层是 面向通信部分的最高层,用户功能中的最底层
  • 两大重要的功能:1)复用,2)分用。复用是指,在发送端,多个应用进程共用一个传输层。分用是指,在接收端,传输层会根据端口号将数据分派给不同的应用进程
  • 传输层和网络层的区别:1)网络层为不同主机提供通信服务,而传输层为不同主机的不同应用提供通信服务;2)网络层只对报文头部进行差错检测,而传输层对整个报文进行差错检测

常见的传输层协议有两种:

  • TCP协议:面向连接的可靠传输协议。利用TCP进行通信时,首先要通过三步握手,以建立通信双方的连接。TCP提供了数据的确认和数据重传的机制,保证发送的数据一定能到达通信的对方。
  • UDP协议:是无连接的,不可靠的传输协议。采用UDP进行通信时不用建立连接,可以直接向一个IP地址发送数据,但是不能保证对方是否能收到。

2.2 再谈端口号

概念:

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

分析:

正是因为每一个进程都有自己的端口号(如图中TCP21,TCP22这些,后面的数字就是端口号)当发来的数据从网络中传输到应用层后,在传输层就会提取出该数据对应的目的端口号,进而确定该数据应该交付给当前主机上的哪一个服务进程。

2.2.1 五元组

概念:

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

协议号是什么:

IP是网络层协议,IP头中的协议号用来说明IP报文中承载的是哪种协议。

议号和端口号的区别:

  • 协议号是存在于IP报头当中的,其长度是8位。协议号指明了数据报所携带的数据是使用的何种协议,以便让目的主机的IP层知道应该将该数据交付给传输层的哪个协议进行处理。
  • 端口号是存在于UDP和TCP报头当中的,其长度是16位。端口号的作用是唯一标识一台主机上的某个进程
  • 协议号是作用于传输层和网络层之间的,而端口号是作用于应用层于传输层之间的。

通过 netstat 命令查看五元组信息:

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

2.2.2 端口号范围划分

端口号的长度是16位,因此端口号的范围是 0~65535:

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

2.2.3 认识知名端口号

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

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

查看知名端口号:

cpp 复制代码
/etc/services # 在该文件中查看网络服务名和它们对应使用的端口号及协议

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

  • 通常情况下,一个端口号只能被一个进程绑定。这是因为端口号用于标识网络上的特定服务,当客户端尝试连接到服务器的某个端口时,操作系统需要知道哪个进程负责处理该连接请求。如果多个进程绑定到同一个端口号,操作系统将无法确定应该将连接请求发送给哪个进程。因此,当一个进程试图绑定到已经被另一个进程占用的端口时,操作系统通常会返回错误。
  • 但是如果采取的通信协议不同,就可以绑定同一个端口号。例如:一个进程可以使用 TCP 协议绑定到端口号 80,而另一个进程可以使用 UDP 协议绑定到端口号 80。这是因为操作系统不仅根据端口号,还根据通信协议来区分不同的服务。因此,当客户端尝试连接到服务器的某个端口时,操作系统会根据客户端使用的通信协议来确定应该将连接请求发送给哪个进程。

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

  • 一个进程可以绑定多个端口号,只不过现在这多个端口号唯一标识的是同一个进程罢了。我们限制的是从端口号到进程的唯一性,而没有要求从进程到端口号也必须满足唯一性,因此一个进程是可以绑定多个端口号的。

2.2.4 netstat命令

语法:

cpp 复制代码
netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]

功能:

可用于查看当前机器的网络状态。

常用选项:

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

查看监听的TCP端口:

cpp 复制代码
netstat -ntlp

查看监听的UDP端口:

cpp 复制代码
netstat -nulp

2.2.5 pidof命令

功能:

  • pidof是一个用于查找指定名称的进程的进程ID的工具。
  • pidof命令可以通过查询运行中的进程信息来找到特定进程的进程ID。它可以返回一个或多个进程ID,这些ID可以用于进一步确认进程的运行状态、杀掉进程或者发送一个信号给它。

语法:

cpp 复制代码
pidof [进程名]。

选项和参数:

  • -s:仅返回一个进程号。
  • -c:仅显示具有相同根目录的进程。
  • -x:显示由脚本开启的进程。
  • -o:指定不显示的进程ID。

2.3 UDP协议


2.3.1 UDP协议格式

图解:

说明:

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

UDP是如何将报头和有效载荷进行分离的?

UDP报头当中包含4个字段,每个字段的长度都是16位,总共8字节。因此UDP采用的实际上是一种定长报头。UDP在读取报文时读取完前8个字节后剩下的就是有效载荷了。

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

应用层的每一个网络进程都会绑定一个端口号,服务端进程必须显示绑定一个端口号,UDP就是通过报头当中的目的端口号来找到对应的应用层进程的。

这里我们需要注意的是:操作系统会维护一个端口号到进程的映射表,当网络协议栈确定了数据报应该交给哪个端口号时,它会查询这张映射表,找到对应的进程,然后将有效载荷传递给该进程进行处理。

如何理解报头?

Linux内核是C语言写的,UDP协议又属于内核协议栈,因此UDP协议也是用C语言写的,UDP报头本质上也是一个结构体或者位段类型的。

UDP数据封装:

  • 当应用层将数据交给传输层后,在传输层就会创建一个UDP报头类型的变量,然后填充报头当中的各个字段,此时就得到了一个UDP报头。
  • 此时操作系统再在内核中开辟一块空间将UDP报头和有效载荷拷贝到一起,此时就形成了UDP报文。

UDP数据分用:

  • 当传输层从下层获取到一个报文后,就会读取该报文的前8个字节,提取出对应的目的端口号。
  • 通过目的端口号找到对应的上层应用进程,然后将剩下的有效载荷向上囧付给该应用进程。

2.3.2 UDP协议的特点

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

2.3.3 面向数据报

什么是面向数据报的?

面向数据报可以理解成面向快递,你的朋友给你寄了一个、两个、三个快递,未来你在收的一定是一个、两个、三个快递。你朋友发了三个快递你一定是收三个快递,不会收半个、一个半、两个等,他发几个你就收几个。

为什么 UDP 是面向报文的协议?

当用户消息通过 UDP 协议传输时,操作系统不会对消息进行拆分,在组装好 UDP 头部后就交给网络层来处理,所以发出去的 UDP 报文中的数据部分就是完整的用户消息,也就是每个 UDP 报文就是一个用户消息的边界,这样接收方在接收到 UDP 报文后,读一个 UDP 报文就能读取到完整的用户消息。

2.3.4 TCP的缓冲区和UDP的缓冲区

TCP的缓冲区:

在TCP协议中,操作系统会为通信双方各自维护一个发送缓冲区,一个接收缓冲区。用户层在调用send/sendto函数之后,操作系统会自动对需要发送的内容拼接TCP报头(TCP报头的具体内容后面会讲)形成数据段,然后拷贝到到发送缓冲区中。

同样,本主机从对端主机收到数据段后,也会先将其放入接收缓冲区中。当用户层读使用recv/recvfrom这样的系统调用时,系统调用就会将接收缓冲区内的数据拷贝到应用层中,具体点说就是拷贝到接收数据的字符串中。

UDP的缓冲区:

UDP协议与TCP相似,只是少了一个发送缓冲区。当客户端使用UDP协议将用户层的数据使用sendto发送的时候,数据会被直接拷贝到内核中,经过一定处理后立即发出。

在使用UDP协议接收数据时,操作系统将发送来的数据存放在接收缓冲区中,在适当的时候,操作系统会将数据交给用户层。

UDP的信息传输方式也实现了发送和接收数据同时进行和互不干扰,也叫做全双工。

2.3.5 基于UDP的应用层协议

我们不会单独说UDP协议有啥用,因为他是操作系统内部的东西,类似于底层的东西,存在的意义就是为了给上层提供服务。UDP的存在,可以让上层的应用层有各式各样的协议。

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

三、结束语

今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

​​

相关推荐
baivfhpwxf20233 分钟前
C# 5000 转16进制 字节(激光器串口通讯生成指定格式命令)
开发语言·c#
许嵩665 分钟前
IC脚本之perl
开发语言·perl
摘星星ʕ•̫͡•ʔ15 分钟前
计算机网络 第三章:数据链路层(关于争用期的超详细内容)
网络·计算机网络
长亭外的少年16 分钟前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
直裾16 分钟前
Scala全文单词统计
开发语言·c#·scala
心仪悦悦17 分钟前
Scala中的集合复习(1)
开发语言·后端·scala
JIAY_WX19 分钟前
kotlin
开发语言·kotlin
Kkooe29 分钟前
GitLab|数据迁移
运维·服务器·git
阳光帅气男孩44 分钟前
PhpSpreadsheet导出图片
php