41.传输层协议UDP
在TCP/IP协议中, 用 "源IP", "源端⼝号", "目的IP", "目的端口号", "协议号(传输层协议的类型:UDP/TCP)" 这样一个五元组来标识一个通信(可以通过netstat -n查看);
UDP内核结构
16位源端口,16位目标端口,16位UDP报文长度,16位UDP检验和。
UDP的报头是固定的8字节,且UDP有16位的长度,因此UDP报文和报文之间都是有明显边界的(OS内部,直接传递结构体对象,因为OS都是C语言写的)
结论:端口号为什么要是16位?因为内核协议是16
结论:udp凭什么叫做用户数据报?应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;(发送次数:读取次数 = 1:1)
UDP特点(寄信)
- 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接;
- 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息;
- 面向数据报: 不能够灵活的控制读写数据的次数和数量;
UDP缓冲区
UDP没有真正意义上的发送缓冲区(没有必要,发送缓冲区是为了保证可靠性才留的,UDP不需要保证可靠性)
UDP具有接收缓冲区:但这个接收缓冲区不能保证收到的UDP报的顺序和发送的UDP报顺序一致(虽然发送有先后,但是发送给目标主机在网络中的路径不一定是一样的,到达不一定按发送先后顺序到,TCP可以根据序号保证,UDP保证不了)。
UDP的sokcket既能读,也能写(全双工)
UDP使用注意事项
我们注意到, UDP协议首部中有一个16位的最大长度. 也就是说⼀个UDP能传输的数据最大长度是 64KB(包含UDP首部).然而64KB在当今的互联网环境下, 是一个非常小的数字.如果我们需要传输的数据超过64K, 就需要在应用层手动地分包, 多次发送, 并在接收端手动拼装;
基于UDP的应用层协议
NFS: 网络文件系统TFTP: 简单文件传输协议DHCP: 动态主机配置协议BOOTP: 启动协议(用于无盘设备启动)DNS: 域名解析协议