UDP协议

引言

  本文中只关于IPv4;UDP是一种保留消息边界的简单的面向数据报的传输层协议。它不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制。总之,能没有的都没了。但它提供了差错检测,是一种端到端的校验和。因此使用它的程序必须自己实现正确的排序等UDP没有的功能。
  UDP的正式规范在RFC0768中,在文档中提及了UDP采用的是“尽力而为”的模式,意思是把应用程序传给IP层的数据发送出去,但是并不保证是否可以到达目的地。这也是因为它的无连接特征,所以校验和是十分的重要。但是UDP并非一无是处,它就突出一个字——快;

UDP头部

UDP协议_第1张图片
如图所示,这就是UDP的头部,非常的简洁

  • 16位源端口号:可选,如果发送者不需要对方回复,置0;
  • 16位目的端口号:目的端口号;
  • 16位UDP长度:UDP头部+UDP数据报的总长度,最小为8(只有头部);
  • 16位UDP校验和:端到端的校验和,由发送方经过计算所得,最终由目的方校验。在传输过程中不会被修改(穿越NAT除外),如果接受方发现校验和不匹配,则丢弃该报文。通过ICMPv4协议发送错误报文给发送方;

UDP校验和

UDP协议_第2张图片
如图所示,在原先的UDP首部前添加了UDP伪头部,伪头部正是用来帮助计算校验和的。但它也仅仅是用来帮助计算校验和,从来不会被传送出去;

  • 源IP地址:来自IP头部的源地址
  • 目的IP地址:来自IP头部的目的地址
  • 0:置0
  • 8位协议号:UDP的协议号是17,如果使用UDP,则为17
  • 16位UDP长度:和头部的长度一样

注:UDP操作IP的首部会产生微小的影响,可以忽略不计。

计算方式
按照两个字节拆分,如果UDP数据报为基数,那么补0;将从153.19至数据和 0全部相加,取反即可获得校验和。
UDP协议_第3张图片

IPv4/UDP的分片

  前面提到了UDP的数据报最小为0,可以不发送数据。那么当UDP的一个包的数据量过大时,就会被分片,例如在链路层不可以超过MTU(1500字节);

UDP协议_第4张图片
如图所示,该UDP数据报原本为3000字节,在经过IP层后,增加了IP的头部(20字节)。那么整个包的长度为3020个字节。由于MTU的存在,那么每个包在数据链路层会进行分片。由于分片后的每一个片不一定是在同一个路由中进行传递。所以每个包的前面必须要有IPv4的头部。UDP的头部只存在于第一个分片中。

  • MF:代表该分片之后是否还有分片,如果是则为1,没有则为0;
  • 偏移:偏移以8个字节为单位,所以第二个的偏移为1480/8;第三个片则为1480/8*2;

你可能感兴趣的:(网络编程,udp,网络,网络协议)