传输层协议——UDP协议

目录

netstat指令、pidof指令、五元组标识一个通信

再谈端口号

UDP协议所处的位置

UDP协议的格式

UDP协议的特点

UDP协议的使用注意事项

基于UDP的应用层协议


netstat指令、pidof指令、五元组标识一个通信

netstat指令

netstat是一个用来查看网络连接状态的重要工具,该指令有很多选项,如下:

  • n 表示拒绝显示别名,能显示数字的全部转化成数字,即以网络IP地址代替名称。
  • l (是小写的L,不是大写的i)表示仅列出处于Listen(监听)状态的进程。
  • p 表示显示出建立了某些链接的进程的名字。
  • t 表示仅显示通信方式是tcp的进程。
  • u 表示仅显示通信方式是udp的进程。
  • a 表示不管某进程的连接状态是怎么样的,都把该进程全部显示出来(如果不带-a选项,是默认不显示处于LISTEN状态下的进程的)。

pidof指令

在查看服务器的进程id时非常方便,语法为: pidof [进程名]。

功能为:通过进程名查看进程id。

五元组标识一个通信

在TCP/IP协议中,用“源IP地址”,“源端口号”,“目的IP地址”,“目的端口号”,“协议号”这样一个五元组来标识一个通信。

如果有多台客户端主机同时访问服务器,这些客户端主机上可能有一个客户端进程,也可能有多个客户端进程,它们都在访问同一台服务器,每个客户端进程和服务器都是一个通信,所以一台客户端主机上可能有一个通信,也可能有多个通信,服务器就是通过“源IP地址”,“源端口号”,“目的IP地址”,“目的端口号”,“协议号”来识别每一个通信的。

通过netstat命令就可以查看到这样的五元组信息,如下图所示。

其中的Local Address表示的就是源IP地址和源端口号,Foreign Address表示的就是目的IP地址和目的端口号,而Proto表示的就是协议类型(或者说协议号)。 

再谈端口号

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

  • 0 ~ 1023:为公认端口号,这些端口号都会被一些使用知名协议(比如HTTP,FTP,SSH等这些广为使用的应用层协议)的系统级进程给占用,所以咱们自己编写的进程不要bind绑定0到1023端口号。
  • 1024 ~ 65535:操作系统动态分配的端口号。客户端程序的端口号就是由操作系统从这个范围分配的,咱们自己编写的进程也可以bind绑定这个范围的端口号。

常见的知名端口号如下。

有些服务器是非常常用的,这些服务器的端口号一般都是固定的:

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

查看知名端口号

我们可以用vim查看/etc/services文件,该文件记录了网络服务名和它们对应使用的端口号及协议,如下图所示。

说明一下: 文件中的每一行对应一种服务,它由4个字段组成,每个字段之间用TAB或空格分隔,分别表示“服务名称”、“使用端口”、“协议名称”以及“别名”。

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

一个端口号绝对不能被多个进程绑定,因为端口号的作用就是唯一标识一个进程。如果某个进程尝试绑定一个已经被绑定的端口号,就会绑定失败。

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

一个进程是可以绑定多个端口号的,这与【端口号必须唯一标识一个进程】是不冲突的,只不过现在这多个端口唯一标识的是同一个进程罢了。

我们限制的是从端口号到进程的唯一性,而没有要求从进程到端口号也必须满足唯一性,因此一个进程是可以绑定多个端口号的。

UDP协议所处的位置

如上图就很好地说明了UDP协议所处的位置。额外说下两个知识点:

1、在socket套接字编程时用到的各种socket套接字接口都是位于应用层和传输层之间的一层系统调用接口,这些接口是系统提供的,我们可以通过这些接口搭建上层应用。我们经常说HTTP是基于TCP的,实际就是因为HTTP报文是通过调用【和TCP协议强相关的socket套接字接口】实现在网络中传输的。

2、socket套接字层往下的传输层实际就是由操作系统管理的,因此UDP是属于内核当中的,是操作系统本身协议栈自带的,其代码不是由上层用户编写的,UDP的所有功能都是由操作系统完成,因此网络也是操作系统的一部分。

UDP协议的格式

UDP协议的格式如上所示。

  • 16位源端口号:表示数据从哪里来。
  • 16位目的端口号:表示数据要到哪里去。
  • 16位UDP长度:表示整个数据报(UDP首部+UDP数据)的长度。
  • 16位UDP检验和:如果UDP报文的检验和出错,就会直接将报文丢弃。

我们以前在写那么多个版本的网络服务器时,定义端口号对象时,使用的数据类型都是uint16_t(即无符号的16位整数),其根本原因就是因为传输层协议当中的端口号就是16位的。

如何理解报头?

(结合下图思考)操作系统是C语言写的,而UDP协议又是属于内核协议栈的,因此UDP协议也一定是用C语言编写的,UDP报头实际就是一个位段类型。

UDP协议如何进行数据封装?

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

从代码层面上如何体现上一段的内容呢?答案:在<<数据链路层——以太网协议、ARP协议>>一文中讲解过代码层面上的以太网帧的封装过程,那个过程和这里的过程基本是完全一致的,请移步去看。

UDP协议如何进行数据分用?

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

说一下,从上图中也就告诉了我们UDP协议如何将报头与有效载荷进行分离

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

说一下,从上图中也就告诉了我们UDP协议如何决定将有效载荷交付给上层的哪一个进程

UDP上层有很多进程,因此UDP必须想办法将有效载荷交给应用层中对应的进程。应用层的每一个网络进程都会绑定一个端口号,服务端进程必须显示绑定一个端口号,客户端进程则是由系统动态绑定的一个端口号,UDP就是通过报头当中的目的端口号来找到对应的应用层进程的。

说明一下: 内核中用哈希的方式维护了端口号与进程ID之间的映射关系,因此传输层可以通过端口号得到对应的进程ID,进而找到对应的应用层进程。

UDP协议的特点

1、无连接:知道对端的IP和端口号就直接进行数据传输,不需要建立连接。

2、不可靠:没有确认机制,没有重传机制,比如如果因为网络故障等原因导致UDP协议的报文在网络中丢了,导致无法到达对方主机,那么UDP协议层也不会给应用层返回任何错误信息。注意,这里的不可靠并不是一个贬义词,而应该是一个中性词,因为TCP协议能够保证可靠,那必然对比UDP协议而言要做更多的事情,协议更复杂,而像UDP协议因为不需要保证通信时的可靠性,所以一定是比TCP协议更简单的。

3、UDP协议采用的通信模式是面向数据报:不能够灵活的控制读写数据的次数和数量。在<<套接字socket编程的基础知识点>>一文中标题为面向字节流和面向数据报的部分中已经详细说明过这部分了,请见该篇文章中的相关内容。

注意: 报文在网络中进行路由转发时,并不是每一个报文选择的路由路径都是一样的,因此报文发送的顺序和接收的顺序可能是不同的。

UDP协议的使用注意事项

根据上图的UDP协议的格式可以发现,UDP协议的报头当中的UDP最大长度是16位的,即一个UDP数据包中的有效载荷的最大长度是2^16字节,换算下来就约等于64KB,因此一个UDP报文的最大长度就约等于是64KB(包含UDP报头的大小)。

64KB在当今的互联网环境下,是一个非常小的数字,如果需要传输的数据超过64KB,就需要在应用层进行手动分包,多次发送,并在接收端进行手动拼装。

基于UDP的应用层协议

1、NFS:网络文件系统。

2、TFTP:简单文件传输协议。

3、DHCP:动态主机配置协议,主要用于自动为设备分配IP地址以及其他网络配置信息。在家庭网络中,通常有一个路由器或者网络交换机,这个设备充当了网络的管理者。路由器上运行着DHCP服务器,它可以自动为连接到网络的设备分配IP地址、子网掩码、默认网关、DNS服务器等网络配置信息。当您的设备(比如电脑、手机、平板电脑等)尝试连接到网络时,它们会发送一个DHCP请求,请求路由器为它们分配一个可用的IP地址。所以,您的设备之所以能够成功连接到网络,就是因为DHCP协议在背后起到了关键作用。DHCP协议的自动IP地址分配功能大大简化了网络管理,使得用户不需要手动配置每个设备的IP地址,从而使网络设置更加方便和易于管理。

4、BOOTP:启动协议(用于无盘设备启动)。

5、DNS:域名解析协议。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值