【Linux】UDP协议简介

UDP协议的特点

  • 无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接
  • 不可靠:没有确认机制,没有重传机制,如果因为网络故障导致数据丢失,UDP协议也不会给应用层返回任何错误信息
  • 面向数据报:不能够灵活的控制读写数据的次数和数量

UDP数据报的格式

  • UDP数据报 = UDP首部 + UDP数据
  • UDP首部 = 16位源端口号 + 16位目的端口号 + 16位UDP长度 + 16位UDP检验和

在这里插入图片描述

Linux的netinet中udp.h中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 */
};
  • uh_sport源端口
  • uh_dport目的端口
  • uh_ulenUDP数据长度
  • uh_sum校验和

UDP长度

UDP首部有一个变量用来保存UDP数据的最大长度,这个变量占16位,即一个UDP数据报最多能携带64K的数据,如果我们要传送的数据远远大于64K,那么应该怎么传送剩下的数据呢?

解决方法:数据分块 + 标上id + 偏移量

  1. 在源端口处,将同一个数据分成不同的数据块,都标上同一个id,这个id用于标志哪些数据块属于同一个数据
  2. 在源端口处,标记上每一个数据块的起始位置在原数据中的地址偏移量,这个地址偏移量用于在对端将各个数据块按顺序进行链接
  3. 在目标端口处,按照id将数据块分组,按照地址偏移量将同一组的数据块按顺序进行连接

在这里插入图片描述

UDP校验和

校验和的作用

UDP协议是不可靠的,传输中可能会丢包,但是一定不会传输错误数据,之所以不会出现传输错误数据,就是通过校验和来保证的,一旦对端通过校验和检测出数据错误,就会将该UDP数据报丢弃

校验和的计算方法

  • 求校验和
  1. 将整个UDP数据报除了校验和之外按照16位进行分割,将UDP数据报分割成n个16位的数据段
  2. 将这n个16位的数据段进行求和,如果最高位出现进位现象,此时需要回卷,回卷就是将进位的1加到最低位中,求得和sum
  3. 将求得的和sum,进行取反运算,得到校验和
  • 验证校验和
  1. 在接收端,将接收到的UDP数据报除了校验和之外按照16位进行分割,将UDP数据报分割成n个16位的数据段
  2. 将这n个16位的数据段进行求和,如果最高位出现进位现象,此时需要回卷,回卷就是将进位的1加到最低位中,求得和sum
  3. 将和sum与接收到的UDP数据报中的校验和求和,如果得到的和是1111111111111111,那么代表数据传输没有出现任何差错,如果中间任何位置出现0,代表传输出现差错,数据报就会被丢失

UDP收发缓冲区

  1. 对于UDP的发送而言,是有UDP发送缓冲区的
  2. 对于UDP的接受而言,是有UDP接收缓冲区的

查询发送缓冲区和接收缓冲区大小

[gongruiyang@localhost ~]$ cat /proc/sys/net/core/rmem_default
212992 #udp接收缓冲区的默认值
[gongruiyang@localhost ~]$ cat /proc/sys/net/core/wmem_default
212992 #udp发送缓冲区的默认值

UDP丢包问题严重时,可以修改缓冲区大小来改善丢包问题
解释:使用UDP协议接收数据时,这些数据是一直放在缓冲区中的,缓冲区不允许溢出,这样超出缓冲区的部分就被丢弃了,导致了丢包问题

修改UDP缓冲区

[root@localhost gongruiyang]# sysctl -w net.core.rmem_default=5000000
net.core.rmem_default = 5000000 #修改udp接收缓冲区的大小
[root@localhost gongruiyang]# cat /proc/sys/net/core/rmem_default
5000000
[root@localhost gongruiyang]# sysctl -w net.core.wmem_default=5000000
net.core.wmem_default = 5000000 #修改udp发送缓冲区的大小
[root@localhost gongruiyang]# cat /proc/sys/net/core/wmem_default
5000000
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值