「前言」文章内容大致是传输层协议,UDP协议讲解。
「归属专栏」网络编程
「主页链接」个人主页
「笔者」枫叶先生(fy)
HTTP协议普通用户认为是将请求和响应直接发送到了网络当中。但实际应用层需要先将数据交给传输层,由传输层对数据做进一步处理后再将数据继续向下进行交付,该过程贯穿整个网络协议栈,最终才能将数据发送到网络当中
传输层负责在网络中提供可靠的数据传输服务。它主要解决了主机之间的通信问题。
常见的传输层协议有TCP(传输控制协议)和UDP(用户数据报协议),传输层已经是操作系统内核部分了
下面学习的是UDP协议,TCP在下一篇。
重谈概念
端口号是在传输层中使用的一个标识符,用于识别不同的应用程序或服务。它是一个16位的整数(2字节),范围从0到65535
端口号的作用
五元组
在TCP/IP协议中,用“源IP地址”,“源端口号”,“目的IP地址”,“目的端口号”,“协议号”这样一个五元组来标识一个通信。
比如有多台客户端主机同时访问服务器,这些客户端主机上可能有一个客户端进程,也可能有多个客户端进程,它们都在访问同一台服务器。
而这台服务器就是通过“源IP地址”,“源端口号”,“目的IP地址”,“目的端口号”,“协议号”来识别一个通信的。
端口号的长度是16位,因此端口号的范围是0 ~ 65535
:
Well-known Ports
)是指被分配给特定服务或协议的端口号,范围从0到1023Dynamic Ports
)是指在使用过程中临时分配给应用程序的端口号,范围从1024到65535。0 ~ 1023
:知名(已知)端口号。比如HTTP,FTP,SSH等这些广为使用的应用层协议,它们的端口号都是固定的。1024 ~ 65535
:操作系统动态分配的端口号。客户端程序的端口号就是由操作系统从这个范围分配的。有些服务器是非常常用的, 为了使用方便, 人们约定一些常用的服务器, 都是用以下这些固定的端口号:
22
端口。21
端口。23
端口。80
端口。443
端口。查看知名端口号:
vim /etc/services
一个进程是否可以绑定多个端口号?
一个端口号是否可以被多个进程绑定?
netstat命令
netstat
是一个用于显示网络连接、路由表和网络接口信息的命令
netstat
英文全称:network statistics
网络统计
常用选项:
-a
:all (显示所有连接和监听端口)-t
:tcp (仅显示TCP连接)-u
:udp (仅显示UDP连接)-n
:numeric (以数字形式显示IP地址和端口号)-p
:program (显示与连接关联的进程信息)-l
:listen(仅列出有在 Listen (监听) 的服务状态)-r
:route (显示路由表信息)-s
:statistics (显示网络统计信息)命令演示
查看TCP相关的网络信息时,一般选择使用-nltp
组合选项。
netstat -nltp
查看UDP相关的网络信息时,一般选择使用-lnup
组合选项。
netstat -lunp
pidof命令
pidof
命令是一个用于查找正在运行的进程的命令。它可以通过进程名来查找与之匹配的进程的进程ID(PID),比较方便
语法: pidof [进程名]
功能:通过进程名,查看进程id
命令演示
pidof test | xargs kill -9
注:xargs
是一个用于构建和执行命令行的实用程序。它从标准输入中读取数据,并将其作为参数传递给指定的命令
64KB
。数据部分(用户数据)可有可无,数据部分就是有效载荷
UDP如何将报头与有效载荷进行分离?
UDP的报头已经规定大小,即UDP采用定长报头,UDP在读取报文时读取完前8个字节后剩下的就都是有效载荷
UDP如何决定将有效载荷交付给上层的哪一个协议?
理解协议的报头
Linux内核是用C语言写的,UDP/TCP协议处于内核中,所以所谓的报头就是一种结构化的数据对象
数据封装:
以UDP为例,应用层将数据交给传输层时,传输层会创建一个UDP报头,并填充报头中的各个字段,包括源端口号和目的端口号等信息。然后,操作系统会在内核中开辟一块空间,将UDP报头和有效载荷(即应用层数据)拷贝到一起,形成UDP报文
分用
以UDP为例,当传输层从下层获取到一个报文后,就会读取该报文的前8个字节,提取出对应的目的端口号。通过目的端口号找到对应的上层应用层进程,然后将剩下的有效载荷向上交付给该应用层进程
UDP传输的过程就类似于寄信,其特点如下:
无连接,在套接字代码已经体现到了(与TCP相比),不解释;不可靠学了TCP就懂了
下面解释一下数据报
面向数据报
缓冲区以TCP为例
发送接收数据:
read、write、send、recv、sendto
等函数本质上是拷贝函数为什么UDP没有发送缓冲区
为什么UDP要有接收缓冲区?
如果UDP没有接收缓冲区,那么就要求上层及时将UDP获取到的报文读取上去,如果一个报文在UDP没有被读取,那么此时UDP从底层获取上来的报文数据就会被迫丢弃。
注意:UDP接收缓冲区满了,再来报文直接丢弃
UDP需要有接收缓冲区是为了应对网络传输中的不可靠性和不确定性。
因为UDP本身是不可靠的,所以接收方可能会面临以下情况:
虽然UDP没有发送缓冲区,但是UDP的socket既能读,也能写,所以也是全双工
上面已经谈过了
--------------------- END ----------------------
「 作者 」 枫叶先生
「 更新 」 2023.7.18
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
或有谬误或不准确之处,敬请读者批评指正。