0
点赞
收藏
分享

微信扫一扫

计算机网络笔记(4) 传输层 协议(Internet、UDP、rdt)

汤姆torn 2022-03-17 阅读 68

文章目录

传输层

基本理论和基本机制

  • 多路复用/分用
  • 可靠数据传输机制
  • 流量控制机制
  • 拥塞控制机制

传输层协议为运行在不同Host上的进程提供了一种逻辑通信机制(端到端)
逻辑通信
端系统运行传输层协议

  • 发送方:将应用递交的消息分成一个或多个的segment,并向下传给网络层
  • 接收方:将接收到的segment组装成消息,并向上交给应用层

Internet传输层协议

  • 可靠(不易丢失)、按序的交付服务(TCP)
    • 拥塞控制
    • 流量控制
    • 连接建立
  • 不可靠的交付服务(UDP)
    • 只实现了传输层的必要的服务
  • 两种服务均不保障
    • 延迟
    • 带宽

多路复用和多路分用

如果某层的一个协议对应直接上层的多个协议/实体,则需要复用/分用。
多路复用

分用原理:

  • 主机接收到IP数据报(datagram)
    • 每个数据报携带源IP地址、目的IP地址。
    • 每个数据报携带一个传输层的段(Segment)。
    • 每个段携带源端口号和目的端口号
  • 主机收到Segment之后,传输层协议提取IP地址和端口号信息,将Segment导向相应的Socket
    • TCP做更多处理

分用工作:

  1. 无连接分用

    • 利用端口号创建Socket
      • DatagramSocket mySocket1 = new DatagramSocket(99111);
      • DatagramSocket mySocket2 = new DatagramSocket(99222);
    • UDP的Socket用二元组标识 (目的IP地址,目的端口号)
    • 主机收到UDP段后
      • 检查段中的目的端口号
      • 将UDP段导向绑定在该端口号的Socket
    • 来自不同源IP地址和/或源端口号的IP数据包被导向同一个Socket
  2. 面向连接的分用

    • TCP的Socket用四元组标识
      • 源IP地址
      • 源端口号
      • 目的IP地址
      • 目的端口号
    • 接收端利用所有的四个值将Segment导向合适的Socket
    • 服务器可能同时支持多个TCPSocket
      • 每个Socket用自己的四元组标识
    • Web服务器为每个客户端开不同的Socket

UDP协议(User Datagram Protocol)

UDP

基于Internet IP 协议

  • 复用/分用
  • 简单的错误校验

"Best effort"服务,UDP端可能问题:

  • 丢失
  • 非按序到达

无连接协议

  • UDP发送方和接收方之间不需要握手
  • 每个UDP段的处理独立于其他段
  • 因为不需要建立连接因此减少了延迟
  • 实现简单——无需维护连接状态
  • 头部开销少
  • 没有拥塞控制——应用可更好的控制方法送时间和速率

用途

  • 常用于流媒体应用
    • 容忍丢失
    • 速率敏感
  • UDP还用于
    • DNS
    • SNMP
  • 可靠数据传输
    • 在应用层增加可靠性机制
    • 应用特定的错误恢复机制
UDP校验和(checksum)

目的:检测UDP段在传输中是否发发生错误(如位翻转)

校验和的计算(发送方)

  • 以IP首部中的校验和为例。
    • 首先把校验和字段清零;
    • 然后对每 16 位(2 字节)进行二进制反码求和;
    • 反码求和时,最高位的进位要进到最低位,也就是循环进位。先取反后相加与先相加后取反,得到的结果是一样的

校验和的校验(接收方)

  • 以IP首部中的校验和为例。
    • 接收方进行校验时,也是对每16位(2字节)进行二进制反码求和。
    • 接收方计算校验和时的首部与发送方计算校验和时的首部相比,多了一个发送方计算出来的校验和的反码。
    • 如果首部在传输过程中没有发生差错,那么接收方计算的结果应该为全0。

可靠数据传输协议(rdt)

可靠——不错、不丢、不乱
可靠数据传输

  • rdt_send():应用层将数据交付给可靠传输协议(rdt)以发送 给对方

  • udt_send():被rdt调用,在不可靠的信道上向接收方传输数据

  • rdt_rcv():当数据包到达接收方信道时被调用

  • deliver_data():向上层应用交付数据

  • rdt_send()和deliver_data()是单向的,应用层发送和接收到的都是正确的

  • udt_send()和rdt_rcv()是双向的,说明在不可靠的信道通道进行数据传输,需要双向的控制消息流动


  • rdt1.0:可靠信道上的可靠数据传输
    rdt1.0

    • 条件:底层信道完全可靠
      • 不会发送错误
      • 信道不会弄丢分组
  • rdt2.0:产生位错误信道

    • 底层信道可能翻转分组中的位(bit)
      • 利用校验和检测位错误
    • 错误恢复
      • 确认机制(Acknowlegements,ACK):接收方显示的告诉发送方分组已经正确接收。
      • NAK:接收方显示的告诉发送方分组错误
      • 发送方收到NAK后,重传分组
    • 基于这种重传机制的rdt协议称为**ARQ(Automatic Repeat reQuest)**协议,Rdt2.0比Rdt1.0中新引入的新机制
      • 差错检测
      • 接收方反馈控制信息:ACK/NAK
      • 重传
        重传
  • rdt2.1:产生位错误的信道

    • 如果ACK/NAK 消息发生错误/被破坏(corrupted)会怎么样

      • 为ACK/NAK增加校验和,检错并纠错
      • 如果ACK/NAK 坏掉,发送方重传
      • 不能会简单的重传:产生重复分组
        rdt2.1
    • 如何解决重复分组问题

      • 增加序列号(sequence number):发送方给每个分组增加序列号
      • 接收方丢弃重复分组
      • 发送方为每个纷纷组增加了序列号(0,1),01两个即可
      • 注意:第一条数序列号seq=0,当收到接收方返回该数据已经收到且无损害时,seq=1,表示第二条数据,两个序列号够用,因为使用了停等协议。
  • rdt2.2:无NAK消息协议(与rdt2.1功能相同,但是只是用ACK)

    • 接收方通过ACK告知最后一个被正确接收的分组
    • 在ACK消息中显式地加入被确认分组的序列号
    • 发送发放收到重复ACK之后,采取与收到NAK消息相同的动作
      • 重传当前分组
        rdt2.2
  • rdt3.0

    • 能够正确工作,但性能很差
      • 网络协议限制了物理资源的利用
        rdt3.0

因为信道既可能发生错误,也可能丢失分组,即“校验和+ 序列号+ACK+重传” 不够用了,如果第一次发送丢失,发送方和接收方都不知道怎么处理。

  • 方法:发送方等待“合理”时间
    • 如果没有收 到ACK,重传
    • 如果分组或ACK只是延迟而不是丢了
    • 需要定时器
举报

相关推荐

0 条评论