计算机网络(5)-传输层(part2)
TCP协议和拥塞控制
TCP协议
概述
点对点
可靠、按序的字节流
流水线机制:介于GBN和SR之间
发送方/接收方缓存
全双工
面向连接:只在两端维护连接的状态
流量、拥塞控制机制
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的一半。


Original author: 马旭
Original link: https://bhmaxu.github.io/2020/02/08/计算机网络(5)-传输层(part2)/
Copyright Notice: Please indicate the source of the reprint (must retain the author's signature and link)