UDP协议简介

UDP是什么?

UDP是一个简单的面向数据报的传输层协议,产生的数据包封装成IP报之后经过网络层,数据链路层层层传递

UDP的特点

  1. UDP是数据报不是流,所以不会像TCP那样有分包的概念,不管数据包是怎么样的就直接发送出去。所以才会产生IP分片,而TCP会进行流量控制,会分包组合,所以一般不会导致很多的IP分片产生
  2. UDP不提供可靠性,直接发出去也不会再去保留,只能算是尽力交付

UDP主要的三大应用

  1. 查询类:DNS等 要求就是快快快 并行查询要快
  2. 数据和传输 TFTP(巨慢,因为要应用层这边做确认数据)
  3. 嵌入式无盘工作站 因为没有那么大地方存数据缓存,所以UDP发送出去就删掉数据
  4. 视频数据流 支持广播和多播 丢包没影响的,而且数据量大还要快的

UDP校验和

  1. 覆盖UDP的头部以及UDP的数据。与此不同的是,IP首部的校验和,只覆盖IP头部
  2. UDP数据可以出现奇数,但是由于校验和都是16bit字节相加的所以需要补上一些0在后面,只为了校验,不会传输过去
  • UDP数据报与TCP数据报都包含一个12字节的伪首部,要对前面的IP头部等等进行校验,为首不包含IP地址,只要IP地址呗NAT修改,每次MD5的校验出来的哈希值就不会一致
  • 送出的数据报与接收数据报具有相同的校验和,说明只是原地址和目标地址交换了位置,最后校验出来的结果都是一样的
  • 但是如果采用哈希校验的话就必须所有位都是一致的不能有改变

IP分片

IP分片的步骤

  1. IP首先会与MTU数据长度进行比较
  2. 如果需要分片,分片可能会出现在主机或者是路由器,对于协议本身来说网络层的分片是透明的。
  3. UDP的数据包结构里面是由表示分片与否的标志位的
  • 最前面是16位的标识们对于发送端发送过来的每一份IP数据来说,其中的标识符包含唯一的值,这个值被复制到每一个分片内部。
  • 接着3位就是标志位 第一个CU基本不用
  • DF代表不分片位,置为1代表着进制分片直接丢弃并且返回一个ICMP的报文,报文内部包含路由器的mtu大小,用来调整包的大小。
  • MF代表着更多分片位,如果为0代表是最后一个分片。后面13位是记录片偏移位的地方,为了组合的时候找到自己的位置。

分片的规则

分片应该是数据量(不包含头部)小于MTU并且为8的整数倍

回显echo

回显数据前后的数据包大小必须是一致的,而且恶臭设置DF为。echo-replay其实也会复制相应的设置。一个连接的畅通要保证来回都是通的,有的时候网络不通其实不是去的时候不通而是,回来的时候没用通。

路径MTU

如果想要实现不分片,就需要将数据包限制为路径上最小的MTU(路径MTU)

可以使用Tracetoute来查看路径MTU,就是逐渐减少直到通过所有的路由设备,不断去测试得到最小的路径MTU

VPN这种虚拟的连接方式的MTU其实会小于路由器实际的MTU,因为一个VPN的数据包是要在前面加上一个VPN的头部,所以还会占用一部分的空间。

UDP与ARP之间交互作用

假设我们需要发送一个很大很大的包,这个包会分成六片发送过来。但是发现底层的MAC地址还没有找到,所以还会发送ARP请求,每一个片发送一个ARP请求,就是六个ARP的请求。但是当ARP解析之后只会将最后一个分片发过来。

除非接收到第一个数据包分片,不然是不会出发ICMP的报文的。

最大UDP数据报长度

IP数据包的最大长度为65535但是实际上却没有这么大,主要有三个原因

  1. 程序接口的限制,socket API设置了接受与发送缓存的大小。
  2. 来自于内核对TCP IP协议族的实现过程
  3. 与源端和目的端的实现有关

数据报截断

ip可以发送特定长度的数据包,但是不意味着接收应用程序都可以接收这些数据,若是接收的数据大小大于应用程序的限制大小,后果取决于不同的API接口的实现

源站抑制ICMP(中间路由发送)

由于路由器缓存快满了,希望发送端那边减小发送速度,但是一般来说UDP会忽略源站抑制信息,而TCP则更倾向于希望收到这个包

广播与多播

3种IP地址:单播地址、广播地址、多播地址

广播和多播只有UDP可以实现,将报文发送给多个接收者们。

一个主机要向网上所有其他的主机发送广播帧

在操作系统角度分析广播为啥不好?

网卡有两个模式

普通模式:接收属于自己的包,单播,多播、广播都可以

混合模式:为了抓包而设计的模式:抓宝时,不管是否为自己的包都统统抓过来

数据包的传递过程

物理层

网卡校验数据对不上校验和直接丢弃

设备驱动程序

  1. 帧类型中必须要指定使用的协议,IP,ARP等等
  2. 进行多播过滤来检查是否数据多播组 (不在组内,多播包就此停止,但是广播包此时还是不知道)

网络层走IP协议

根据IP地址中的源地址和目的地址进行更多的过滤检测,但是也不能判断是否属于广播对象

UDP协议层

收到IP发送过来的数据还需要检查端口号并且检查什么程序正在监听这个端口,之后如果没有的话就会丢弃,入股有的华就会交付。

广播的包不仅发的范围广,而且每一次判断都要走到传输层才可以知道是否是广播的对象,所以解包的层数就多了很多。

 

 

你可能感兴趣的:(TCP,IP协议族)