协议实现
- 16位源端端口+16位对端端口:用于标识进程,描述主机上的通信两端进程
- 16位数据报长度:用于描述一个完整包含头部的udp报文长度,所能存放的最大大小是65535(两个字节);因此就要求udp报文大小必须小于64K,因为udp报文长度是8个字节,因此sendto发送的数据大小必须小于64K-8
- 16位校验和:采用二进制反码求和算法,检验接收到的数据和对方发送的数据是否一致
二进制反码求和算法:
在发送数据时,为了计算数据包的检验和。应该按如下步骤:
1、把校验和字段设置为0;
2、把需要校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和;
3、把得到的结果存入校验和字段中
在接收数据时,计算数据包的检验和相对简单,按如下步骤:
1、把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;
2、检查计算出的校验和的结果是否为0;
3、如果等于0,说明被整除,校验和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。
协议特性
无连接,不可靠,面向数据报
- 无连接:通信时不需要建立连接,只需要知道对方地址就可以直接进行发送
- 不可靠:不保证数据有效到达,更不保证数据安全到达(没有丢包检测机制,数据排序机制)
- 面向数据报:描述的是一种有最大固定长度限制的传输方式
编程影响
- 如果传输的数据比较大,则需要程序员在应用层进行分包操作(将大数据分为多个小数据进行传输)
- 如果进行了分包操作,则需要程序员在应用层进行包序管理(应用层协议头中定义当前的包序)
- 数据报传输发送数据时,数据直接封装头部进行发送,接受方udp向上层交付数据是整条交付(不会交付半条数据或多条),因此recvfrom接收缓冲区空间必须给的足够大,能够放下一条完整的数据
- udp优点:因为无连接,所以udp支持局域网广播传输(将数据发送给局域网广播地址,则表示将数据发送给局域网中所以主机)