Post

传输层

传输层

3.1 传输层服务和协议

  • 传输层协议:提供应用进程之间的逻辑通信机制(不同host)
    • 位于网络层之上
    • 依赖于网络服务
    • 对网络层服务进行增强(可能)
  • 网络层协议:提供主机之间的逻辑通信机制

Internet传输层协议

  • TCP(传输控制协议)
    • 可靠数据传输
    • 拥塞控制
    • 流量控制
  • UDP(用户数据包协议)
    • 不可靠服务(“尽力而为”)
    • 进程到进程的数据交付和差错检查(最低限度)
  • 两个服务均不保证延迟和带宽

3.2 多路复用与多路分解

多路复用

  • 从多个Socket接收数据,为每个数据封装上头部信息,生成Segment,交给网络层

多路分解

  • 传输层依据头部信息将收到的Segment交给正确的Socket

工作流程

  • 报文段格式
    • 源端口号、目的端口号、其他头部信息、应用数据(报文)
      • 端口号:16比特的数,大小在0~65535之间(0~1023为周知端口号)
  • 无连接
    • 一个UDP套接字由二元组标识:(目的IP地址,目的端口号)
    • 主机根据这两个值将报文段导向相应的Socket
    • 来自不同源IP地址和/或源端口号的IP数据包,但具有相同的目的IP地址和目的端口号,将被导向同一个Socket
  • 面向连接
    • 一个TCP套接字由四元组标识:(源IP地址,源端口号,目的IP地址,目的端口号)
    • 主机根据这四个值将报文段导向相应的Socket
  • Web服务器与TCP(多线程)
    • 通常只使用一个进程,为每个客户连接创建一个具有新连接套接字的新线程(线程可看作一个轻量级的进程)

3.3 UDP

User Datagram Protocol

特点与应用

  1. 无需建立连接
  2. 无需维护连接状态
  3. 分组首部开销小
  4. 没有拥塞控制:应用可更好地控制发送时间和速率
    • 问题:UDP中缺乏拥塞控制,能够导致UDP发送方和接收方的高丢包率(路由器有大量分组溢出),并挤跨TCP会话 - 常用于流媒体应用,还有DNS和SNMP - 使用UDP的应用是可能实现可靠数据传输的

UDP报文段格式

  • 首部 (8B)
    • 源端口号、目的端口号
    • 长度:UDP报文段的字节数(首部+数据)
    • 检验和:差错检测
  • 应用数据(报文)

UDP检验和

  • 端到端原则
  • 发送方
    • 将报文段的所有16bits进行和运算,然后对和进行反码运算(求和式遇到溢出都要被回卷)
    • 进行运算的数据:伪首部+首部+报文(checksum字段不参与计算)
  • 接收方
    • 计算所收到的报文段的所有16bits的和
    • 然后与检验和相加,观察是否全位1
      • 若不是:出现错误
      • 若是:未检测出错误(但可能仍有错误)

3.4 可靠数据传输原理

  • 不错、不丢、不乱
  • 发送端和接收端双向的信息流动
  • rdt:可靠数据传输协议
  • FSM:有限状态机

1)经完全可靠信道:rdt1.0

  • 可靠信道:不发生比特差错,不会丢弃分组 rdt1.0

2)经具有比特差错信道:rdt2.0

  • 不可靠信道:比特差错
  • ARQ协议(Automatic Repeat reQuest)
    • 差错检测:与UDP的检验和字段类似
    • 确认机制:ACK(肯定确认)和NAK(否定确认)
    • 重传:接收到NAK后,重传分组
  • 停等协议:发送方处于等待ACK或NAK的状态时,它不能从上层获得更多的数据 rdt2.0

3)ACK/NAK消息发生错误:rdt2.1和rdt2.2

  • 序列号:发送方给每个分组增加序列号
    (解决当ACK/NAK损坏时,发送方重传分组,导致的接收方重复分组的问题)
  • 当接收到失序的分组时,接收方对所接收的分组发送一个ACK
  • rdt2.1 rdt2.1sender rdt2.1receiver
  • rdt2.2
    • NAK被ACK替代:在ACK消息显示地加入被确认分组的序列号 rdt2.2

4)经具有比特差错的丢包信道:rdt3.0

  • 不可靠信道:比特差错、分组丢失
  • 发送方负责检测和恢复丢包工作:倒计时定时器、重发
    • 分组或ACK丢失;分组或ACK延迟 rdt3.0

流水线可靠数据传输协议

  • 原因:停等协议的利用率过低,限制了网络底层协议所能提供的能力
  • 流水线协议:允许发送方在收到ACK之前连续发送多个分组
    • 需要更大的序列号范围
    • 发送方和接受方需要更大的存储空间来缓存分组

GBN协议(回退N步)

别称:滑动窗口协议

|名词|解释| |:–:|:–:| |基序号(base)|最早未确认分组的序号| |下一个序号(nextseqnum)|最小的未使用序号| |窗口长度(N)|最多允许有N个等待确认的消息| |扩展FSM|增加了变量的FSM| GBN序号

  • 发送方 GBN-sender
    • 分组头部包含k-bits序列号(模$2^k$运算)
      1. 对窗口是否已满进行判断
      2. 接受ACK(n):采用累积确认,即序列号n及以前的分组均已被正确接收
      3. 超时事件:发送方重传所有已发送但还未确认过的分组
  • 接收方 GBN-receiver
    • ACK机制:发送拥有最高序列号、已被正确接收的分组的ACK(即该分组按序)
      • 可能产生重复ACK
      • 接收方只需维护的信息:下一个按序接收的分组的序号(expectedseqnum)
    • 对于乱序到达的分组,直接丢弃
  • 举例 GBN-eg

SR协议(选择重传)

  • 发送方只重传那些没有收到ACK的分组
    • 为每个分组设置定时器
  • 接收方对每个分组单独进行处理
    • 设置缓存机制,缓存乱序到达的分组 SR序号
  • 发送方
    • 超时
    • 收到ACK:若分组在窗口内,则标记为已接收;若分组序号为send_base。则窗口向前移动到最小序号的未确认分组处
  • 接收方
    • 序号在[rcv_base, rcv_base+N-1]内的分组被正确接收,则发送ACK给发送方(若是之前未收到过,则缓存)。同样,若分组为基序号,则移动窗口
    • 序号在[rcv_base-N, rcv_base-1]内的分组被正确收到,必须产生一个ACK,即使是之前已确认过的
    • 其他情况,忽略该分组
  • 滑动窗口协议的窗口大小
    • $W_s+W_r\leq 2^k$
    • 对于GBN协议$W_r = 1$,则$W_s\leq 2^k-1$
    • 对于典型的SR协议$W_r = W_r = W$,则$W_s\leq 2^{k-1}$
    • 对于停等协议$W_s=W_r=1$
  • 信道利用率
    • \[U=\frac{W_s\times t_{Seg}}{t_{Seg}+RTT+t_{ACK}}\]
    • \(U=\frac{W_s\times L}{L+2dpR+L^{'}}\)($dpR$为时延带宽积,$L$为报文段长度,$L^{‘}$为$ACK$长度)

3.5 TCP

Transmission Control Protocol

概述

  • 点对点
  • 可靠的、按序的字节流
  • 流水线机制
  • 发送方/接收方缓存
  • 全双工
  • 面向连接
  • 流量控制、拥塞控制 TCP发送缓存和接收缓存

TCP报文段结构

TCP报文段格式

  • 首部
    • 源端口号、目的端口号(共4B)
    • 序号(4B)
      • 该报文段首字节的字节流编号
      • 建立TCP连接时,双方随机选择序列号
    • 确认号(4B)
      • 希望收到的下一个字节的序列号
      • 累积确认
    • 首部长度
    • 标志字段:ACK、SYN、FIN……
    • 接收窗口
    • 因特网检验和
    • 紧急数据指针
    • 选项:协商MSS或其他
  • 数据
    • 最大报文长度MSS:报文段里应用层数据的最大长度

RTT和超时

  • 采用超时/重传机制
  • 使用单一的重传定时器
  • SampleRTT:测量从段发出去到收到ACK的时间
  • 均值:$EstimatedRTT = (1-\alpha)·EstimatedRTT + \alpha·SampleRTT$
  • 差值:$DevRTT = (1-\beta)·DevRTT + \beta·SampleRTT-EstimatedRTT$
  • 超时时间:$TimeoutInterval = EstimatedRTT+4·DevRTT$

双方发送流程

  • TCP发送方事件
    • 从应用层收到数据
      • 创建Segment
      • 序列号时Segment第一个字节的编号
      • 开启计时器
      • 设置超时时间:TimeoutInterval
    • 超时
      • 重传引起超时的Segment(最小序号还未被确认的报文段)
      • 重启定时器
    • 收到ACK
      • 如果ACK的字段值>SendBase
        • 更新SendBase
        • 如果窗口中还有未被确认的分组,重新启动定时器
  • TCP接收方事件
    • 所期望序号的Segment到达:延迟ACK,等待下一个按序Segment的到达;等不到则发送ACK(一般最多等待500ms)
    • 所期望序号的Segment到达且另一个按序报文段等待ACK传输:立即发送单个累积ACK,以确认两个序号报文段
    • 比期望序号大的Segment到达:立即发送冗余ACK
    • ……
  • 超时间间隔
    • 每次TCP重传时都会将下一次的超时间间隔设为先前值的两倍
    • 定时器在另外两个事件中的任一个启动时,TimeoutInterval再由最近的Estimated和DevRTT推算得到
  • 快速重传
    • 当发送方收到对同一数据的3个冗余ACK,立即快速重传(TCP不使用否定确认)

流量控制(Flow Control)

  • 实质是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配
  • 发送方维护接收窗口的变量
    • LastByteRcvd - LastByteRead $\leq$ RcvBuffer
    • 接收窗口:rwnd = RcvBuffer - [LastByteRcvd - LastByteRead]
    • LastByteSent - LastByteAcked $\leq$ rwnd(确保接收方的接收缓存不会溢出)
    • 当主机B的接收窗口为0时:主机A继续发送只有一个字节数据的报文段(防止主机A被堵塞而不能再发送数据)

TCP连接管理

  • 建立连接:三次握手
    • 次序事件说明
      第1次客户端发送SYN报文段SYN字段置1,随机选择一个初始序号client_isn
      第2次服务器发送SYNACK报文段SYN字段置1,确认号字段置client_isn+1,选择自己的初始序号server_isn;并且为该TCP连接分配缓存和变量
      第3次客户端发送报文段进行确认SYN字段置0,确认号字段置server_isn+1,序号为client_isn+1;负载可携带数据;并且为该连接分配缓存和变量
  • 关闭连接
    • 次序事件说明
      第1次客户端发送报文段FIN置1
      第2次服务器返回ACK 
      第3次服务器发送报文段FIN置1
      第4次客户端返回ACK客户端等待一段时间,然后关闭连接,释放资源
    • Time_wait
      1. 保持连接正常终止
      2. 让重复字节包在网络中消失
  • TCP状态序列 客户TCP状态序列 服务器TCP状态序列
  • SYN洪泛攻击
    • cookie

3.6 拥塞控制原理

  • 表现
    • 分组丢失(路由器缓存溢出)
    • 分组延迟过大(在路由器缓存中排队)

成因和代价

  1. 两个发送方和一台具有无限大缓存的路由器
    • 拥塞时分组延迟太大 拥塞控制场景1
  2. 两个发送方和一台具有有限缓存的路由器
    • 重传以补偿因为缓存溢出而丢失的分组,资源浪费 拥塞控制场景2
  3. 4个发送方和具有有限缓存的多台路由器及多跳路径
    • 链路竞争,分组被丢弃时,任何用于该分组的“上游”传输能力全都被浪费掉 拥塞控制场景3

拥塞控制方法

端到端拥塞控制

  • 网络层不需要显示的提供支持
  • 网络通过观察loss、delay等网络行为判断是否发生拥塞
  • TCP采取这种方法

网络辅助的拥塞控制

  • 路由器向发送方显示地反馈网络拥塞信息
  • 简单的拥塞指示(1bit):SNA,DECbit,ATM……
  • 指示发送方应该采取何种速率
  • ATM ABR拥塞控制(available bit rate)
    • “弹性服务”:若发送方路径“underloaded”,则使用可用带宽;若发送方路径拥塞,则将发送速率降到最低保障速率
    • RM(resource management) cells
      • 由发送方发送
      • 交换机设置RM cell位
        • NI bit:rate不许增长
        • CI bit:拥塞指示
      • RM cell由接收方返回给发送方

3.7 TCP拥塞控制(Congestion Control)

  • 拥塞窗口:cwnd
  • LastByteSent - LastByteAcked $\leq$ min{cwnd, rwnd}
  • 方法:AIMD(加性增、乘性减)
    • Additive Increase:每个RTT将cwnd增大一个MSS(拥塞避免)
    • Multiplicative Decrease:发生loss(3个冗余ACK),cwnd减半

1. 慢启动SS

  • 初始:cwnd = 1MSS
  • 每收到一个ACK,cwnd+=1MSS(指数型增长)
  • 结束:

    事件说明
    超时cwnd置为1,ssthresh置为cwnd/2,重新开始慢启动
    cwnd$\geq$ssthresh进入拥塞避免模式
    检测3个冗余ACK执行快速重传,并进入快速恢复模式

2. 拥塞避免

  • 每个RTT只将cwnd的值增加一个MSS(线性增长)
  • 结束:

    事件说明
    超时cwnd置为1,ssthresh置为cwnd/2,进入慢启动
    检测3个冗余ACK执行快速重传,并进入快速恢复模式

3. 快速恢复

  • ssthresh = cwnd/2
  • cwnd = ssthresh+3·MSS
  • 结束:

    事件说明
    超时cwnd置为1,ssthresh置为cwnd/2,进入慢启动
    得到新的ACKcwnd = ssthresh,进入拥塞避免模式
  • 案例:TCP Reno
This post is licensed under CC BY 4.0 by the author.