zoukankan      html  css  js  c++  java
  • [TCP IP详解:学习笔记]UDP:用户数据协议

           UDP:用户数据协议

           UDP是面向数据报的运输协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。同时UDP提供不可靠性:它把应用应用程序传给IP层的数据发送出去,但是并不保证他们能到达目的地。

           应用程序必须关系IP数据报的长度。如果它超过网络的MTU,那么就要对IP数据报进行分片。

           UDP首部的各字段如图1所示。其中,端口号表示发送和接收进程。UDP长度字段指的是UDP首部和UDP数据的字节长度,该字段要求最小长度为8字节。UDP校验和覆盖UDP首部和UDP数据。

     

    图1 UDP首部

     

           如果发送端没有计算校验和而接收端检测到校验和有差错,那么UDP数据报就要被悄悄地丢弃,不产生任何差错报文。

           IP分片:

           如果IP数据报的长度大于MTU,则需要对IP数据报进行分片。把一份IP数据报分片以后,只有达到目的地才进行重新组装。重新组装由目的端的IP层来完成,其目的是使分片和重新组装过程对运输层(TCP和UDP)是透明的。

           IP分片过程:

      对于发送端发送的每份IP数据报来说,其标识字段都包含一个唯一值。该值在数据报分片时,被复制到每个片中。标志字段用其中一个比特表示“更多的片”(MF)。除了最后一片以外,其他每个组成数据报的片都要把该比特位置1。片偏移字段指的是该片偏移原始数据报开始处的位置。当数据报分片后,每个片的总长度要改为该片的长度值。

           为什么只丢失一片数据也需要重传整个数据报?

           是因为IP层本身没有超时重传的机制----由更高层来负责超时和重传。如果对数据报分片的是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何分片的。

           在分片时,除了最后一片以外,其他每一片中的数据部分(除IP首部外的其余部分)必须是8字节的整数倍。IP数据报是指IP层端到端的传输单元(在分片之前和重组装之后),分组是指在IP层和链路层之间传输的数据单元。

           发送ICMP不可达差错报文给发送端的情况:

    1. 当路由器收到一份需要分片但是又设置了不可分标志比特位的IP数据报;
    2. 路径MTU发现机制。

      最大UDP数据报长度受到两个因素的影响:

    1. 应用程序可能受到其程序接口的限制;
    2. 限制来自于TCP/IP内核的实现。

      如果接收到的数据报长度大约应用程序所能处理的长度,那么会发生什么情况呢?

      该问题的答案取决于编程接口和实现。例如,典型的Berkeley版socket API对数据报进行截断,并丢弃任何多余的数据。SVR4下的socket API并不截断数据报,超出部分数据在后面的读取中返回,但它也不通知应用程序。TLI API不丢弃数据。相反,它返回一个标志表明可以获得更多的数据。

           当一个系统(路由器或主机)接收数据报的速度大于其处理速度时,可能产生ICMP“源站抑制(source quench)”差错。

  • 相关阅读:
    iOS 面试题搜集
    iOS 常用第三方类库、完整APP示例
    iOS 键盘遮挡输入 解决办法
    iOS UIColor RGB HEX
    iOS APP性能优化
    iOS Swift 数组 交换元素的两种方法
    iOS CoreData primitive accessor
    iOS Start developing ios apps (OC) pdf
    iOS 传值方式
    iOS IB_DESIGNABLE IBInspectable @IBDesignable @IBInspectable 加速UI开发
  • 原文地址:https://www.cnblogs.com/life91/p/3001087.html
Copyright © 2011-2022 走看看