• 第十章 用户数据报协议和IP分片


    用户数据报协议和IP分片

    UDP是一种保留消息边界的简单的面向数据报的传输层协议。它仅提供差错检测。只是检测,而不是纠正,它只是把应用程序传给IP层的数据发送出去,但是并不会保证数据能够完好无损的到达目的地。

    下图是UDP数据报的封装。


    UDP头部

    端口号就如同邮箱一样,用来辨别发送和接受进程。端口号长16比特。

    UDP头部如图所示:

    • 源端口号(可选),如果发送方并不要求回复,则置0
    • 目的端口号,帮助分离IP层进入的数据
    • 长度,UDP数据报的长度(包过头部和数据)
    • 校验和

    IP层根据协议头部可以将IP数据报分离到特定的传输协议。正因为如此,不同传输协议是独立的,即可以使用相同的端口号而不会引起冲突。

    校验和字段是端到端的,是对包含了IP头部中的源和目的IP地址字段的UDP伪头部计算得到的,伪头部的目的是用于校验和的计算,他不会被发送出去。

    UDP伪头部和头部的格式如图:

    伪头部包含了IP头部的源和目的地址,以及协议或下一个头部字段。目的是让UDP层验证数据是不是到达真正的目的地,由于有了这样的结构,当该数据报经过一个NAT时候,不仅仅IP层头部的校验和要被修改,并且UDP伪头部的校验和也要被修改。


    UDP-Lite

    背景:有些应用程序可以容忍在发送和接收的数据里引入的比的差错。

    为了避免建议连接的开销,或者为了使用广播或组播地址,这类程序会选择使用UDP。而UDP-Lit提供了部分校验和来解决这个问题。

    其头部如下表示:

    校验和覆盖范围字段表示被校验和覆盖的字节数。值为0表示整个数据包都被覆盖。由于整个头部总是要被覆盖的,所以值位1~7是无效的!


    IP分片

    为了保持IP数据报抽象与链路层细节的一致和分离,IP引入了分片和重组。

    • IPv4的分片可以在发送主机和端到端路径上的路由器进行
    • IPv6只允许源主机进行分片

    重组只能发生在IP数据报到达最终目的地的时候。原因很显然,不同分片可能会经过不同的路径到达目的地,在路径上的路由器只能看到分片的一个子集,显然无法重组。


    分片由IPV4头部中的标识,分片偏移,和更多分片字段控制。

    • 标识,由原始发送方设置,在目的地依据标识区分组
    • 分片偏移,表示分片中数据的第一个字节在原数据报的偏移量(8个字节为单位
    • 更多分片(MF),0表示最后一个分片,否则为1。

    偏移的具体内容如下图所示:

    第二个数据报偏移为185*8=1480=第一个分片负载,即在第一个分片零偏移的基础上偏移了185个单位。

    当TCP报文段的一个分片丢失了,TCP会重传整个报文段,而重传一个分片是不可能的,因为在路径路由器可以分片数据报,源主机是不清楚数据报如何被分片的。

    • 具有更大偏移量的分片要比第一个分片更优先投递,这样有利于接收主机确定所需的缓存空间最大值
    • 收到任何一个分片,IP层就启动计时器,超时即丢弃数据报。
    • UDP数据报长度有限,满额数据报并不能很好的被投递
      • 本地协议实现的限制
      • 接受应用程序并没有做好准备接收处理这么大的数据报
  • 相关阅读:
    supervisor 3.0a81 安装失败
    nginx使用HttpImageFilterModule
    docky模式下背景不透明
    一堆DLL中找一个类
    Python中序列化处理之——marshal和cPickle篇
    Mercurial host fingerprint warning
    Python中时间的处理之——tzinfo篇
    ServiceStack.Redis的问题与修正
    Python中时间的处理之——datetime篇
    Rdesktop 1.6.0 and Windows Server 2008 SP2
  • 原文地址:https://www.cnblogs.com/Huzr/p/8824728.html
Copyright © 2020-2023  润新知