UDP协议端格式
- 16位源端口与16位目的端口:负责应用程序之间的数据传输,标识数据从哪来到哪去
- 16位校验和:校验数据一致性(发送的数据与接收的数据是否一致)——二进制反码求和
发送数据的时候,将校验和设置为0,然后从报头第0个字节开始,每个字节进行取反相加,超出16位的部分(求和进位部分)取出来再次与低16位进行相加,最终得到的数据填充到校验和中;
接收方同样对接收到的数据进行二进制反码求和;得出的数据若为0则标识一致。 - 数据报长度:包含有UDP报头的UDP数据报总长度;UDP报头是8个字节;然而因为数据报长度只使用了2个字节存储,因此能够表示的长度最多为65535;因此UDP在使用sendto发送数据的时候给与的数据有最大长度限制,限制长度不能大于64k-8;
UDP的特点
UDP传输的过程类似于寄信
- 无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接;
- 不可靠:没有确认机制,没有重传机制;如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;
- 面向数据报:不能够灵活的控制读写数据的次数和数量。
协议实现 / 特性 对于上层代码编写的影响
- 若在发送大文件时,文件数据大于64k-8,则不能一次性发送,需要用户在应用层进行分包操作;将一个大数据截断为多个小数据进行发送
- 但是UDP并不保证数据有序到达,因此需要用户在应用层进行包序管理
UDP的数据传输是整条收发
- 发送方:UDP使用sendto发送数据的时候,将数据放到socket发送缓冲区,socket会直接为这个数据封装UDP报头然后发送出去;
- 接收方:UDP使用recvfrom接收数据的时候,人家发送了100个字节,那么这个数据就不能分成两个50字节进行多次接收;
应用层接收数据的时候,UDP在传输层一次只会交付一条完整的数据;不会交付半条或者多条;
使用UDP接收数据的时候,接收缓冲区要定义的足够大,否则若发送的数据比较大,缓冲区不构,则会recvfrom失败。