TCP协议和拥塞控制

TCP协议

概述

  • 点对点

  • 可靠、按序的字节流

  • 流水线机制:介于GBN和SR之间

  • 发送方/接收方缓存

  • 全双工

  • 面向连接:只在两端维护连接的状态

  • 流量、拥塞控制机制

TCP段结构

TCP段

序列号指segment中第一个字节的编号,不是segment的编号,建立TCP连接时,双方随机选择序列号

ACKs为希望接收到的下一个字节的序列号,采用累计确认机制(类似GBN),代表之前的字节都已经被正确接收

乱序到达的Segment没有在规范中规定,由TCP实现者决定

TCP可靠数据传输

  • TCP在IP层提供的不可靠服务基础上实现可靠数据传输
  • 流水线
  • 累计确认
  • 单一重传计时器
  • 触发重传的事件:超时、接收到重复ACK

定时器超时时间的确定

原则:需要大于RTT,过短会造成不必要的重传,过长会对段丢失反应慢,RTT是一个变化的值,需要动态确定。

sampleRTT:测量从段发出去到收到ACK的时间,多次测量求估计值EstimatedRTT(指数加权移动平均)
$$
EstimatedRTT = (1-\alpha) * EstimatedRTT + \alpha * SampleRTT
$$
α典型值为0.125

EstimatedETT需要加一个安全边界

测量RTT的变化值

$$
DevRTT = (1-\beta) * DevRTT + \beta * |SampleRTT - EstimatedRTT|
$$
β典型值为0.25

最终的定时器的超时时间:
$$
TimeoutInterval = EstimatedRTT + 4*DevRTT
$$

TCP发送方事件

从应用层收到数据
  • 创建Segment
  • 序列号为Segment第一个字节的编号
  • 开启计时器(如果没有开启,只有一个计时器)
  • 设置超时时间
超时
  • 重传引起超时的Segment(最小的未确认的序列号)
  • 重启定时器
收到ACK
  • 如果确认此前未确认的Segment:更新SendBase,如果还有未确认的分组,重新启动定时器

由于TCP为累计确认,接收方在收到第三个多余的段时,返回的是ACK=120

同样由于累计确认,不管第一个ACK发送方有没有收到,接收方第二次发送的ACK都是120

TCP接收方

收到有序的且满足需要的序列号的段且之前的段都已经ACK:接收方会延迟发送ACK,等待是否有新的段收到;

收到有序的且满足需要的序列号的段但之前存在等待的段:立即发送ACK;

有乱序的段到达:立刻发送重复ACK

快速重传机制

TCP实现中,如果发送超时,超时时间间隔将重新设置,导致时间间隔加倍。

通过重复ACK检测分组丢失,如果某个分组丢失,会引发多个重复的ACK,因此可以在计时器超时之前就进行重传(收到同一数据的3个ACK)。

TCP流量控制

接收方为TCP连接分配buffer,上层数据可能处理buffer的数据的速度较慢,发送方如果传输太多、太快,会淹没接收方(buffer溢出)。

接收方在头部字段加入自身可用buffer的空间的信息。

但即使空间为0,发送方也会发送一个较小的段避免死锁。(如果不发送,就永远不会收到接收方的信息来确认接收方是否有空间)

TCP连接管理

发送方和接收方在传输数据之前需要建立连接,初始化段序号、buffer和流量控制信息等

连接建立:三次握手

  • 客户端向服务器发送TCP SYN段,没有信息,指明初始的序列号
  • 服务器答复SYNACK段,服务器分配缓存,指明自身的初始序列号
  • 客户端回复ACK段,可以包含信息

连接关闭

  • 客户端向服务器发送TCP FIN段
  • 服务器回复ACK,关闭连接,发送FIN
  • 客户机回复ACK,进入等待,如果收到FIN,重新发送ACK
  • 服务器收到ACK,关闭连接

拥塞控制原理

太多发送主机发送了太多数据或者发送速度太快,以至于网络无法处理

表现:

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

代价:

  • 网络吞吐量和速率降低
  • 当分组丢失时,上游路由器的传输能力全部被浪费

端到端的拥塞控制

  • 网络层不提供显式的支持
  • 端系统通过观察loss、delay等网络行为判断是否发生拥塞
  • 如TCP的拥塞控制

网络辅助的拥塞控制

  • 路由器向发送方显式反馈网络的拥塞信息

TCP拥塞控制

CongWin:拥塞窗口,动态调整以改变发送速率

rate = CongWin/RTT

发生loss事件时,发送方降低速率

加性增,乘性减:AIMD

逐渐增加发送速率,每个RTT将CongWin增大一个MSS(最大的段的长度)——拥塞避免;

发生loss后将CongWin减半。

TCP慢启动

TCP连接建立时,CongWin=1,可用带宽远远高于初始速率,产生浪费。因此,当连接开始时,指数性增长,直到发生loss事件或者达到阈值。阈值设置为loss事件时CongWin的一半。