UDP:用户数据报协议
协议格式:
- 16位源端端口-16位对端端口:描述通信两端
- 16位报文长度:16为最大数字位65535,描述报文长度。限制了报文长度。Udp报文(包含报头)长度必须小于64k-8。
- 16位校验和:用来校验接受的数据是否和发送的数据一致。如果校验和出错, 就会直接丢弃。使用二进制反码求和算法:将报文每个字节取反相加得到的和。
- 应用数据:如果有应用数据的话,且长度小于64k-8。如果我们需要传输的数据超过64K-8, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装
协议特性:
- 无连接:通信时不需要建立连接,只知道对方地址就可以发送数据。
- 不可靠:不保证数据有序,安全到达对端。没有丢包检测机制。
- 面向数据报:有最大长度限制的传输方式(小于64k-8),并且是整条交付。
关于UDP的收发缓冲区:
- UDP没有真正意义上的发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作
- UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃.
对应用层编程影响
- 如果应用层要发送的数据过大,则需要在应用层进行分包操作。
- 如果上层进行了分包操作,则需要在应用层进行包序管理。
- 接收方recvfrom给的接收缓冲区必须足够大,至少能够取出一条数据。