文章目录
- UDP协议端格式
- UDP的特点
- 面向数据报
- UDP的缓冲区
- 基于UDP的应用层协议
- UDP使用注意事项
- 16位的UDP校验和的校验原理
UDP协议端格式
- 16位源端口号:数据从哪一个端口发出来的,也就是数据从哪一个进程发送出来的。在编写应用层代码的时候,用uint16_t是因为协议的端口号是16位。
- 16位目的端口号:数据想要到哪一个端口去,也就是数据想要去往哪一个进程。
- 16位UDP长度:表示整个数据报(UDP头部+UDP数据)的最大长度。通过16位的UDP固定长度的报头,UDP可以正确的提取完整的报文信息。
- 16位的UDP校验和:校验数据在传输过程中是否失真,数据在传输的过程中需要经过很多链路设备,如果在转发过程中有某个字节损坏,就相当于整个这个数据失真了,如果UDP接收方校验和出错,就会直接将数据丢弃掉,且不会通知发送方。
- 16位能够表示的数据最大位长度位2^16=65536—>指的是UDP数据的最大长度。
UDP的特点
- UDP传输的过程类似于寄信
- 无连接: 知道对端的IP和端口号就直接进行传输,不需要建立连接。
- 不可靠: 没有确认机制,没有重传机制;如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。
- 面向数据报: 不能够灵活的控制读写数据的次数和数量。
面向数据报
应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并。例如:用UDP协议传输100个字节的数据,如果发送端调用一次sendto,发送100个字节;那么接收端也必须调用对应的一次recvfrom,接收100个字节,而不能循环调用10次recvfrom,每次接收10个字节。
UDP的缓冲区
UDP没有真正意义上的发送缓冲区,调用sendto函数会直接将数据交给内核,由内核将数据传给网络层协议进行后续的传输动作,在网络中进行数据的收发,本质上就是拷贝函数,将数据拷贝给OS内核。即UDP协议会将应用层的数据打上UDP报头后直接递交给网络层。
UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃。即UDP协议会将去掉UDP报头后的数据递交给应用层,但是UDP协议不能保证数据的有效到达。
UDP的socket接口既能读也能写,属于全双工通信。
基于UDP的应用层协议
- NSF:网络文件系统
- TFTP:简单文件传输协议
- DHCP:动态主机配置协议
- BOOTP:启动协议(用于无盘设备启动)
- DNS:域名解析协议
UDP使用注意事项
UDP数据长度是用16位表示,即16位能够表示的数据最大位长度位2^16=65536约等于64K(包含UDP首部),然而64K在当今的互联网环境下, 是一个非常小的数字。如果我们需要传输的数据超过64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。
当数据在应用层会被打上应用层的报头,在报头中会有数据的长度和两个标识,一个标识用来标识是否属于同一条数据,另一个标识用来标识当前数据在整个完整的数据的什么位置,相当于偏移量。
16位的UDP校验和的校验原理
16位的UDP校验和用来检验数据在传输的过程中是否失真,发送方进行填充,接收方进行校验。
发送填充是将除了校验和的16位比特位,其余的按照16个比特位相加,在相加的过程中如果出现比特位超过16位的情况需要进行回卷,回卷的策略:最高位+低16位计算出来的新值。加完的结果进行反码运算,将反码运算的结果放到16位的校验和当中。接收方是如果校验成功,会将数据交给应用层;如果校验失败,即使数据已经到达了接收方传输层的UDP协议,也会被丢弃,有可能在传输的过程中失真。