TCP(Transmission Control Protocol,传输控制协议)和IP(Internet Protocol)是当今因特网的支柱性协议。TCP是一种可靠数据传输协议,依赖 计算机网络学习笔记(6) - 可靠数据传输原理 中的许多基本原理。
TCP报文段首部中两个最重要的字段时序号字段和确认号字段,这两个字段是TCP可靠传输服务的关键部分。TCP把数据看称一个无结构的、有序的字节流。
TCP的可靠数据传输确保一个进程从其接收缓存中读出的数据是无损坏、无间隙、非冗余和按序的数据流。
在任意时刻,仅为一个已发送但目前尚未确认的报文段估计样本RTT(Sample RTT),TCP不为已被重传的报文段计算SampleRTT。RTT 为 Round-Trip Time。Sample RTT为 某报文段被发出 到 对该报文段的确认 被收到之间的时间量。TCP维持一个SampleRTT均值(即 EstimatedRTT),党获得新的SmapleRTT时,TCP会根据以下公式更新EstimatedRTT:
E
s
t
i
m
a
t
e
d
R
T
T
=
(
1
?
α
)
?
E
s
t
i
m
a
t
e
d
R
T
T
+
α
?
S
a
m
p
l
e
R
T
T
?
EstimatedRTT=(1-α)*EstimatedRTT+α*SampleRTT\,
EstimatedRTT=(1?α)?EstimatedRTT+α?SampleRTT
EstimatedRTT是SampleRTT的一个加权平均值,这个加权对最近样本赋予的权值要大于对旧样本的赋值。显然这是合理的,因为越近的样本越能更好的反映网络当前的拥塞情况。
此外,RTT偏差DevRTT用于估算SampleRTT偏离EstimatedRTT的程度:
D
e
v
R
T
T
=
(
1
?
β
)
?
D
e
v
R
T
T
+
β
?
∣
S
a
m
p
l
e
R
T
T
?
E
s
t
i
m
a
t
e
d
R
T
T
∣
?
DevRTT=(1-β)*DevRTT+β*|SampleRTT-EstimatedRTT|\,
DevRTT=(1?β)?DevRTT+β?∣SampleRTT?EstimatedRTT∣
则TCP超时重传间隔TimeoutInterval设置为:
T
i
m
e
o
u
t
I
n
t
e
r
v
a
l
=
E
s
t
i
m
a
t
e
d
R
T
T
+
4
?
D
e
v
R
T
T
TimeoutInterval=EstimatedRTT+4*DevRTT
TimeoutInterval=EstimatedRTT+4?DevRTT
当超时事件发生时,TCP重传具有最小序号的还未被确认的报文段。每次TCP重传时都会将下一次的超时间隔设置为先前值的两倍,而不是用从EstimatedRTT和SampleRTT推算出的值。
超时触发重传存在的问题之一是超时周期可能相对较长。如果一个报文段丢失,就可能引起收到多个冗余ACK。冗余ACK是再次确认某个报文的ACK,发送方已经收到过对该报文段的确认。一旦收到3个冗余ACK,TCP就执行快速重传,即在超时定时器过期之前重传丢失的报文段。
流量控制是一个速度匹配服务,即发送方的发送速率和接收方的接收速率相匹配。简单来说,TCP通过让发送方维护一个接收窗口的变量来提供流量控制。接收窗口用于给发送发一个指示——该接收方还有多少可用的缓存空间。更直白地来说,一方将自己的空闲缓冲区大小告诉对方。
拥塞控制是指TCP发送方收到IP网络的拥塞而被遏制,需要对发送方进行控制。分组重传通常被作为网络拥塞的征兆来对待。
TCP拥塞控制的方法是让每一个发送发根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率。如果感知到拥塞就降低发送速率,反之增加其发送速率。
拥塞窗口值:运行在发送方的TCP拥塞控制机制根据的一个额外变量,即拥塞窗口值。拥塞窗口对一个TCP发送方能向网络中发送流量的速率进行了限制。
TCP拥塞控制中的一些指导性原则:
首先明确,慢启动不慢,慢启动阶段,每过一个RTT(往返时间),发送速率就翻番。即在慢启动状态,拥塞窗口值以一个MSS(Maximum Segment Size,最大报文长度)开始并且每当传输的报文段首次被确认就增加一个MSS。因此TCP发送速率起始慢,但在慢启动阶段以指数增长。
慢启动结束的方式:
在拥塞避免阶段,每个RTT只将拥塞窗口的值增加一个MSS。
总的来看,慢启动阶段:每个RTT 加倍增加;拥塞避免阶段:每个RTT 线性增加。
在快速恢复中对于引起TCP进入快速恢复状态的确实报文段,每当收到冗余的ACK,拥塞窗口值增加一个MSS。
TCP拥塞控制为加性增、乘性减。
本文为个人学习笔记,如有错漏之处,敬请指正!