UDP

1、UDP是简单的面向数据报的运输层协议。(TCP是面向字节流的运输层协议)

UDP提供不可靠的传输,可靠性需上层来决定。

UDP个格式如下:


所以一个UDP最小长度是8(就是没有数据)。16位的UDP长度是UDP首部加上数据部分的长度,其实这个是有冗余的。因为IP数据包长度减去IP首部长度,就是这个UDP长度。但是这个不能随意乱改,因为计算校验和可是需要这个长度的。


2、UDP检验和

UDP检验和覆盖UDP首部和数据部分,IP数据包的检验和只是覆盖IP的首部。所以一些上层协议,比如TCP,比如这里的UDP,都有自己的检验和。但是有一点,UDP的检验和不是必须的,TCP的检验和是必须的。

想要计算检验和,UDP给出了一个12自己的伪首部。TCP也有。伪首部不发送,只是为了计算检验和而设计的。


注意,UDP长度在计算校验和的时候出现了2次。

如果检验和计算结果为0,就存入全1,这个在二进制反码中是等效的。如果传输的检验和是0,表示发送端没有计算检验和。

如果发送端没有计算检验和,接收端检测到检验和有错误,那么UDP数据包就会被悄悄丢弃,不产生任何差错报文(IP层检测到首部检验和有错误的时候也是直接丢弃)。

为什么,连ICMP差错报文也不产生吗?对的。什么都不产生。原因我想是这样的:

如果检测到差错,那么数据包中有数据被修改了或者出错了。如果出错的地方正好是源IP地址呢,那么产生ICMP差错报文给另外一个IP地址。这不是更加无效吗?所以,就不产生差错报文。

UDP检验和是一个端到端的检验和,目的就是为了发现UDP首部和数据在发送端到接收端之间发送的任何改动。注意,UDP检验和(事实上是TCP/IP协议簇的所有检验和)是简单的16bit和,检测不出交换两个16bit的差错。所以,如果你发送一个数据包给服务端,让服务端回显你发送的内容,你会发现,发送出去和接受到的数据包与检验和是一样的。这是因为除了源IP和目的IP地址交换了一下位置,其他没有变,检验和没有检测出来这个交换。


3、UDP的分片

UDP报文,最长可以传输多少,撇开MTU,我们可以知道的是UDP长度是16位,那么是否是2的16次方呢。但是想想IP数据包的限制。IP也是16bit,IP理论上最大是65535,减去20字节IP首部和8字节UDP首部,udp数据最大长度是65507字节。但是,事实上这个是基本不可能的。

第一个限制是应用程序接口限制。比如缓存之类的。也有比如我这个程序自己定义了一个最大长度等等。

其次是TCP/IP内核实现的限制。

其实在很多UDP应用中,应用程序数据被限制在512或者更小。比如DNS,比如RIP等。因为太大了,UDP容易丢失,这个丢失一个UDP分片就需要全部重传,对网络来说真是不小的负担。

UDP分片,这个应该是IP层。对于每一个IP数据包,标志字段是包含一个唯一值的,就是这个值我们知道哪些分片是一个报文的。IP分片过程是透明的,但是只要丢失一个分片,所有的都必须重传。这就是为什么我们需要MTU,我们想尽可能不要分片。

分片,IP首部会出现在每一个分片当中。如图:


UDP分片,只有第一个片有UDP首部,其实任何运输层的首部都只会出现在第一个分片数据中。这也产生一个问题,只要目的地没有接受到第一个分片,那么时间到了或者其他什么原因出错,目的端不会产生ICMP差错报文,因为没有传输层首部,ICMP无法区分是那个进程发送的数据包被丢弃。这个在那些会产生ICMP差错报文有讲述,这个算其中一个。

这里需要来说明一下,IP首部,是不是所有的IP首部都要复制一份到每一个分片呢??

答案是否定的,有一些IP首部的内容也只是在第一个分片里面有。比如时间戳选项和记录路由选项。这都是IP数据包的可选首部里面的。


4、MTU

上面说了,我们要尽可能皮面分片,那么MTU,我们必须找到每一个线路的MTU,最大限度的利用起来。MTU路径发现协议,我想很多了,关键的点就是,发送一个报文,设置不能分片,如果这个报文长度大于了某一个线路的MTU,检测到又不能分片,那么就会返回一个ICMP不可达差错。这个时候我们可以适当剪短数据包长度继续发送。这样就可以探测到MTU了。

UDP也是可以干这种事情的。


5、使用UDP报文的协议

DNS

RIP

TFTP

BOOTP

SNMP

等等。


参考:

《TCP/IP卷1》

图片来自网络。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值