UDP报文格式
查看Linux系统下的/usr/include/netinet/udp.h 文件,可以看到UDP的报文格式
可以看到UDP的报文是一个拥有四个u_int16_t 类型的变量的结构体,u_int16_t其实就是unsigned short 类型的数据,数据范围为(0~65535)
这四个变量分别是源端端口,对端端口,报文长度,校验和
- 源端端口:描述远端处理进程
- 对端端口:描述对端处理进程
- 数据报长度:这个长度是整个
数据报的总长度 ,包括报头长度和报文长度 ,因为报文长度只有2个字节,所以UDP报文最大不超过64k ,所以报文中的报文数据也就是有效载荷(上层sendto交付的大小)必须小于64k-8 个字节,否则就会丢弃数据报错 - 校验和:采用
二进制反码求和算法 ,校验收到的数据与对方发送的数据是否完全一致,不一致则丢弃
二进制反码求和算法:
发送方组织好报文后,将校验和字段置为0,然后从第0个字节开始(包含报头)对每个字节取反求和 ,超出16位的,将高位阶段继续求和 ,完成之后,将校验和填充到校验和字段中
UDP协议特性
UDP协议的特性可以用三个词来概括 无连接,不可靠,面向数据报
无连接
udp通信时,不需要建立连接,只要知道对方的IP地址和端口号就能直接给对方发送数据
不可靠
- udp协议没有任何丢包检测机制
- 丢包后没有重传机制
- 没有包序管理机制
所以**udp传输既不保证数据安全安全到达对端,也不保证数据有序到达对端 **
面向数据报
应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并
- 上层sendto交付一个数据则直接封装报头进行发送,数据到达对端会包括报头保存在对端的接收缓冲区中
- 上层recvfrom取数据每次只能刚好取出一条完整数据,不能取出半条或者多条数据
udp传输就好比生活中的取快递,快递是被封装好在包裹内,取快递时,只能连带包裹整个取出,不能把包裹切成好多份取出
UDP缓冲区
- UDP
没有 真正意义上的发送缓冲区 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作
recvfrom的时候如果应用层给的buf空间没有一条数据长度大就会接收失败
- UDP
具有接收缓冲区 . 但是这个接收缓冲区不能保证收到的UDP包的顺序和发送UDP包的顺序一致
如果接收缓冲区满了,则再收到的数据将会被丢弃
UDP特性对于编程的影响
- 由于udp不保证数据安全有序到达,需要
程序员 自己在应用层进行丢包检测 以及包序管理机制,重传机制 ,才能保证安全准确的收到数据 - udp是
面向数据报 的,必须保证上层在sendto时发送的数据长度必须小于64k-8个字节,否则就会丢弃数据报错 - udp是整条交付的,必须保证上层在recvfrom时,给的空间大小足够大,否则有可能接收失败
基于UDP的应用层协议
- NFS: 网络文件系统
- TFTP: 简单文件传输协议
- DHCP: 动态主机配置协议
- BOOTP: 启动协议(用于无盘设备启动)
- DNS: 域名解析协议
netstat工具
netstat是一个用来查看网络状态的重要工具
常用选项:
-n 拒绝显示别名,能显示数字的全部转化成数字-l 仅列出有在 Listen (监听) 的服務状态-p 显示建立相关链接的程序名-t (tcp)仅显示tcp相关选项-u (udp)仅显示udp相关选项-a (all)显示所有选项,默认不显示LISTEN相关
pidof命令
pidof命令可以通过进程名查看进程ID
功能类似pgrep和ps
|