传输层协议——UDP

1. 认识知名端口号

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


0-1023: 知名端口号,HTTP、FTP、SSH应用层协议,端口号是固定的
1024-65535 :操作系统动态分配的端口号,客户端程序的端口号,就由操作系统从这个分为分配的

2. netstat

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

输入 netstat -nltp

n :拒绝显示别名,能显示数字的全都转化为数字


若输入 ltp,则发现不会显示数字,而显示对应的别名
l : 只查看 listen 状态


输入 netstat -ntp

t:只查TCP
p:显示更多的进程信息


若将p去掉,输入 netstat -nt

扫描二维码关注公众号,回复: 16663853 查看本文章

就不显示对应的PID这一列的信息了


若输入 netstat -np 即将系统中的协议基本上都查出来了


输入 netstat -nup ,只查udp


输入 netstat -naup ,显示所有udp服务

a:显示所有的条目

3. pidof

在服务器查看服务器的进程id时,非常方便

输入 pidof +进程 ,获取对应进程和子进程的PID

4. UDP协议

UDP协议端格式

有效载荷一定是上层——应用层 给的,上层通过系统调用 把数据拷过来的
UDP报头的宽度是0-31,表示报头所对应的字节数 (4字节)


1. 报头和有效载荷如何分离?
报头是固定长度 8字节,剩下的就是有效载荷

通过16位UDP长度,整体 减去 8字节 即 有效载荷的长度


2. 有效载荷如何做到向上交付的?
UDP报头中包含16位目的端口号,将一个报文发送到主机上,根据目的端口号向上交付给应用层,绑定该端口号的进程


报头(协议)的本质:结构化数据
基于 struct 有两种数据类型,一种为结构体,另一种为位段

struct udp_header 结构体 内部 包含 源端口号、目的端口号 、udp长度、校验和


借助位段的方式,取整形int的4字节中的16个比特位


将缓冲区数据从应用层拷贝给操作系统内部

提供一段缓冲区,定义一个指针p,去指向缓冲区
因为报头大小是固定长度8字节,让p向后移动8个单位
再将应用层的数据拷贝到对应的位置中


再将指针p,指向最开始位置,并将p强转成 struct udp_header类型 ,指向结构体中的源端口号、目的端口号 、udp长度、校验和


该报文经过网络,经过协议栈被对方收到了
再定义一个指针s,,让s+8,再次指向有效载荷


将s强转成 struct udp_header类型 ,指向结构体中的源端口号、目的端口号 、udp长度、校验和

UDP的特点

无连接:知道 对端的IP和端口号 就直接传输,不需要连接
不可靠:若网络故障段无法发送对方,UDP协议也不会给应用层返回任何错误信息

面向数据报:不能够灵活的控制读写数据的次数和数量

面向数据报的理解

因为UDP有自己固定的报头长度8字节,所以UDP能够知道自己的有效载荷多长
不靠上层,在底层就自动知道报文和有效载荷的长度
所以就能保证向上交付的 一定是独立的、完整的 有效载荷
不用自己处理,只要发的是完整的,收的就是完整的,对方发几次,收几次
由底层交上来,独立的报文,称为面向数据报

即应用层给UDP多长的报文,UDP原样发送,既不拆分,也不会合并

缓冲区理解

UDP对应数据一定是完整的,所以有数据直接交给下层
所以UDP不需要 发送缓冲区

收到一个保文,可上层来不及处理,就需要接收缓冲区
该缓冲区 并不是用来保证可靠性,而是尽可能保证不要丢包,如果缓冲区满了,再达到的数据就会被丢弃
如:在淘宝上买了五件商品,编号为1-5,先买的是1号商品,时间是不确定的,所以1-5号 谁先谁后到 是不确定的
这种情况称为 接收报文出现乱序的情况
乱序是不可靠的表现,所以UDP不考虑
UDP接收缓冲区,但不保证 接受报文是有序的

猜你喜欢

转载自blog.csdn.net/qq_62939852/article/details/132840073