7.3 KiB
Raw Permalink Blame History

1. 运输层服务

2. 多路复用与多路分解

一个端口号可以支持多个TCP连接分配不同的套接字或接收多个UDP包

3. 无连接运输UDP

  • 检验和
    1. 求和101 + 110 = 1011
    2. 如果溢出回卷即把溢出位加到最低位1 + 011 = 100
    3. 取反011

4. 可靠数据传输原理

  • 可靠数据传输协议

    • rdt 1.0:没有误差和丢失

      rdt1.0FSM
    • rdt 2.0:有误差,无丢失

      • 使用ACK/NAK此ACK/NAK不会有差错
      rdt2.0FSM
    • rdt 2.1数据包和ACK都会出现误差但不会丢失

      • ACK/NAK和数据包都加上序号用两个序号0和1轮流即可
      rdt2.1FSM Sender rdt2.1FSM Receiver
    • rdt 2.2

      • 只使用ACKACK序号告知最后一个正确的包重复收到ACK则说明上一个包损坏要重传
      rdt2.2FSM Sender rdt2.2FSM Receiver
    • rdt 3.0数据包和ACK都会出现误差或丢失

      • 加定时器
      • 利用率:$U_{sender} = \frac{L/R}{RTT+L/R}$$RTT$​​占比过高
      rdt3.0FSM Sender
  • 流水线可靠数据传输协议

    • N个流水线并行利用率U_{sender} = \frac{N\times L/R}{RTT+N\times L/R}
    • GBN回退N步和SR选择重传
  • 回退N步

    • 序号为i的ACK表示i及之前的分组都收到了。窗口N要小于序列长度LN<=L-1
    • sender
      • 定时器记录窗口中最早的已发送但未确认的包一旦确认收到序号为i的ACK窗口就要向后滑动到i+1处并重置定时器
      • 定时器超时,就要重发窗口内所有的包,并重置定时器
    • receiver
      • 只需要维护期望收到的包序号i无论收到什么序号的包都只发序号为i-1的ACK。收到正确序号就i+=1
    GBN Sender GBN Receiver GBN例子
  • 选择重传

    • 窗口N要小于等于序列长度L的一半N<=L/2
    • sender
      • 发送窗口内的所有包并对所有包记录定时器。接收到第i个包及其前面的所有包的ACK时将窗口移动到i+1位置
      • 如果窗口内某一包没收到ACK定时器超时则只重发该包
    • receiver
      • 对每一接收到的包发送ACK并缓存当第i个包及其前面的包都收到时有序地交付第i个包及其前面还未交付的包
    SR例子

5. 面向连接的运输TCP

  • TCP报文结构

    以太网的标准MTU最大传输单元1500B = TCP包头20B+ IP包头20B + 最大报文段长度MSS 1460B

    • 序号:报文段首字节的字节流编号(注意是字节编号,一个报文中含有多个字节)(初始字节流编号随机初始化)
    • ACK期望从对方收到的下一个字节的序号累积确认回复ACK表示前面的包都收到了
    • TCP没有规定如何处理无序报文段实现者可以选择缓存或丢弃一般选择缓存
    TCP报文结构 TCP传输过程
  • TCP连接三次握手

    1. 第1次握手建立连接时客户端发送SYN包其中定义了随机起始序列号seg=j到服务器并进入SYN SENT状态等待服务确认
    2. 第二次握手服务器收到syn包必须确认客户端的SYNack=j+1同时自己也发送一个SYN包定义服务端的随机起始序列号seg=k即 SYN+ACK包此时服务器进入SYN RECV状态
    3. 第三次握手客户端收到服务器的SYN+ACK包向服务器发送确认包ACK(ack=k+1)此包发送完毕客户端和服务器进入ESTABLISHED (TCP连接成功)状态,完成三次握手
  • TCP断开连接四次挥手

    1. 第1次挥手客户端发送一个FIN包FIN标志位设为1序列号为当前序列号j给服务器并将状态变为FIN_WAIT_1表明它已发送连接终止请求。
    2. 第2次挥手服务端收到FIN包回复ACK确认号为j+1服务器此时进入CLOSE_WAIT状态。客户端收到该ACK后进入FIN_WAIT_2状态等待服务器端的FIN包。
    3. 第3次挥手服务器发送FIN包FIN标志位设为1序列号为当前序列号k给客户端状态变为LAST_ACK。
    4. 第4次挥手客户端收到FIN包回复ACK确认号为k+1并进入TIME_WAIT状态持续2个TTL考虑到服务器可能没收到ACK再次发FIN。服务器收到ACK后正式关闭连接。
  • 往返时延和超时重传

    • 估算RTT指数加权移动平均过去样本的影响以指数级速度递减$EstimatedRTT = (1-\alpha)\times EstimatedRTT + \alpha \times SampleRTT$,其中$\alpha=0.125$​​为典型值
    • 估算SampleRTT与EstimatedRTT之间的差值有多大$DevRTT = (1-\beta)\times DevRTT + \beta \times |SampleRTT-EstimatedRTT|$,通常\beta=0.25
    • 超时阈值计算:TimeoutInterval = EstimatedRTT + 4\times DevRTT
  • TCP可靠数据传输

    • 流水线发送报文段;累积确认;单个重传计时器(在最早的未确认报文段处计时)
    • 重传触发条件超时快速重传对于相同数据发送方收到3个ACK则立即重传未确认的最小序号的报文段
  • TCP流量控制防止接收方的缓存溢出

    • 接收方把rwnd放在报文首部发送方限制未确认的报文段数量不超过该rwnd

6. 拥塞控制原理

  • 原因:路由器缓冲区是有限的。导致:发送方超时重传,拥塞加重(且重传的包实际上有可能还在缓存里,是不必要的重传)
  • 解决方法TCP拥塞控制控制TTL网络辅助拥塞控制直接向目的主机发送拥塞情况

7. TCP拥塞控制

  • 加性增 乘性减 AIMD如果没丢包每个RTT拥塞窗口+=MSS最大报文段长度如果丢包了拥塞窗口*=0.5

  • 慢启动设置sstresh

    1. 初始cwnd =1 MSS每经过一个传输回合cwnd*=2指数增加cwnd到达sstresh后每经过一个传输回合cwnd+=1初始MSS线性增加
    2. 超时或3个冗余ACK
      • Tahoe$ssthresh=0.5 \times cwnd$$cwnd=1\times MSS$,并重新开始慢启动过程
      • Reno快速恢复算法收到3个冗余ACK后$ssthresh=0.5\times cwnd$cwnd=ssthresh+3\times MSS=0.5\times cwnd+3\times MSS
    Tahoe和Reno
  • 吞吐量:$=cwnd/RTT$假设丢包时窗长为W则平均窗长为3/4W则吞吐量为\frac{3}{4}\frac{W}{RTT}

  • 网络层协助的拥塞控制在IP数据报设置CE位通知目的主机目的主机回复ACK时会在TCP数据报设置ECE位告知发送方