特点:
无连接:UDP通信双方在发送数据之前,不需要建立连接,只需要知道对方的ip和port就可以传输数据
不可靠:UDP数据包在传输过程中,如果被丢弃了,不会进行重发。
面向数据报:应用层使用UDP协议的时候,不管是从UDP接收缓冲区当中拷贝数据,还是应用层将数据拷贝到UDP的发送缓冲区,都市一整条数据拷贝的,而不是存在两条数据一起存在缓冲区当中的情况
UDP缓冲区:
对于应用层的数据是整条数据接收和发送的
对于发送而言,应用层sendto接口将数据提交给传输层当中的UDP的发送缓冲区,在发送缓冲区当中,打上UDP包头之后,就直接提交给网络层进行下一步的传输
对于接收而言,应用层使用recvfrom接口将数据从接收缓冲区当中拷贝到应用层,UDP接收缓冲区是不保证数据的有序到达,也不保证可靠,当接收缓冲区当中满的时候,从网卡当中接收的UDP数据包就直接丢弃了
UDP头部结构
struct udphdr
{
u_int16_t uh_sport; /* source port */ 源端口号
u_int16_t uh_dport; /* destination port */ 目标端口号
u_int16_t uh_ulen; /* udp length */ 包长度
u_int16_t uh_sum; /* udp checksum */ 校验和
};
类型uint16_t最大表示的数值为65535(64kM),UDP数据报最大长度是65535个字节
UDP数据报长度(65535)=UDP数据包头(8字节)+数据
如果传输的数据大于UDP传输的最大长度,这时我们需要用自定制协议,在自定制协议中拆分原始数据
当应用层数据大于65535的时候,应该在应用层进行分片传输,分片传输就是将大于65535的数据在应用层进行拆解,分多次使用UDP协议进行传输。
校验和:
作用:检验UDP数据在传输过程当中是否有损坏
如果有损坏,则不会提交给应用层,直接丢弃(这也体现了UDP的不可靠性)
如果没有损坏,则应用层在调用recvfrom的时候,将数据提交给应用层
如何通过校验和来判断,数据是否损坏
计算:
将UDP数据(UDP包头和数据)分为多个16比特位的数据;除了16个校验和的比特位不进行相加之外,针对其余的16个比特位进行相加操作
对加起来的结果进行反码运算
将反码运算的结果,放到校验和的16个比特位当中去
验证:
接收到UDP数据报之后,将所有的16位比特位全部加起来,如果是1111111111111111,则认为数据是没有损坏的
如果两个16位的比特位进行相加的时候,产生了进位,从而加出来的结果为17个比特位的时候,此时需要进行回卷
回卷:
17个比特位拆分为 最高位和低16 位
最高位和低16位相加
UDP应用:
DHCP:动态主机协议(谁上网给谁分配IP)
DHCP协议是通过UDP广播来获取IP地址的
路由器接收到这样的请求之后,恢复一个应答,分配一个IP给请求的主机
DNS:域名解析协议
将域名转换为IP地址的时候,使用的是UDP协议
TFTP:简单文件传输协议
NFS:网络文件系统
等等
你们的 【三连】 是给Qyuan最大的肯定!
↓ ↓ ↓
注:如果本篇博客有任何错误和建议,欢迎伙伴们留言,你快说句话啊!