计算机网络学习笔记(7) - 运输层 - TCP协议
文章目录
一、概述
TCP(Transmission Control Protocol,传输控制协议)和IP(Internet Protocol)是当今因特网的支柱性协议。TCP是一种可靠数据传输协议,依赖 计算机网络学习笔记(6) - 可靠数据传输原理 中的许多基本原理。
二、TCP连接管理
1. TCP连接的特点
- TCP连接时面向连接(connection-oriented)的,两个进程之间在传输数据之前必须先“握手”,即互相发送预备报文段,以建立确保数据传输的参数。
- 与电路交换网络中的端到端TDM或FDM不同,TCP连接是一条逻辑连接,其状态进保留在两个通信端的TCP程序中。TCP协议只在端系统中运行,而不在“中间元素”(路由器和链路层交换机)中运行,即“中间元素”不会维持TCP连接状态,中间路由器对TCP完全视而不见,它们看到数据报而非连接。
- TCP连接提供全双工(full-duplex service)服务,即两个进程间存在一条TCP连接,那么数据就可以在这两个进程间流动。
- TCP连接是点对点(point-to-point)的,即在单个接收方和单个发送方之间的连接。
- TCP可从缓存中取出并放入报文段中的数据量受限于最大报文段长度(Maximum Segment Size, MSS)。MSS通常根据最初确定的由本地发送主机发送的最大链路层帧长度(即所谓的最大传输单元,Maximum Transmission Unit, MTU)来设置。该设置要保证单个TCP报文段(当封装在IP数据报中)加上TCP/IP首部长度将适合单个链路层帧。
- TCP连接的组成包括:一台主机上的缓存、变量和与进程连接的套接字,以及另一台主机上的缓存、变量和与进程连接的套接字。如前文所述,主机间的中间元素(路由器、交换机、中继器),没有为该链接分配任何缓存和变量。
2. TCP连接建立 - 三次握手
2.1 三次握手过程**
- 第一步:客户端首先向服务器端发起请求连接的TCP报文段,即所谓的TCP SYN(Synchronize Sequence Numbers, 同步序列编号)报文段。该报文段中:首部的 SYN标志位 置为 1;序号字段 填充 随机选择的自己的初始序号(client_isn)。TCP SYN报文段被封装在IP数据报中,发送给服务器端。
- 第二步:服务器端收到TCP SYN报文段后,为该TCP连接分配TCP缓存和变量,并向客户端发送允许连接的报文段,即所谓的SYN ACK报文段。该报文段中:首部的 SYN标志位 置为 1,ACK标志位置为1;序号字段 填充 随机选择的自己的初始序号(sever_isn);首部的确认号字段 填充 (client_isn + 1)。
- 第三步:客户端收到SYN ACK报文段后,客户端也要为此次连接分配缓存和变量。客户端向服务器端发送另外一个报文段,对服务器的允许连接进行确认。该报文段中:首部的 SYN标志位 置为 0,ACK标志位置为1;序号位置 填充 (client_isn + 1);首部的 确认号字段 填充 (sever_isn + 1)。此外,当连接建立后,之后的每个报文段中的SYN比特都被置为0。
2.2 为什么需要三次握手
- 阻止重复历史连接的初始化。三次握手使得客户端有足够的报文来判断当前连接是否为历史连接。
- 同步双方的初始序列号。两次握手只保证了一方的初始序列号能被对方成功接收,无法保证双方的初始序列号都能被确认接收。
- 避免浪费资源。两次握手可能会造成服务器重复接受无用的连接请求,而造成重复分配资源。
3. TCP连接拆除 - 四次挥手**
- 第一步:客户端发送关闭连接的报文段,FIN标志位 置为 1。
- 第二步:服务器收到后,向发送方回复一个确认报文段。
- 第三步:服务器发送自己的终止报文段,FIN标志位 置为1。
- 第四步:客户端收到后,向对方发送一个确认报文段。
- 服务器收到了 确认报文段后,进入 CLOSE 状态,服务端完成连接关闭。
- 客户端等待2 MSL(Maximum Segment Lifetime,报文最大生存时间) 后,进入CLOSE状态,客户端完成连接关闭。经过2 MSL时间,?以让两个?向上的数据包都被丢弃,使得原来连接的数据包在网络中都?然消失,再出现的数据包?定都是新建?连接所产?的。
三、TCP报文段 - 序号和确认号
TCP报文段首部中两个最重要的字段时序号字段和确认号字段,这两个字段是TCP可靠传输服务的关键部分。TCP把数据看称一个无结构的、有序的字节流。
- 序号建立在传送的字节流之上,而不是建立在传送的报文段的序列之上。一个报文段的序号因此是该报文段首字节的字节流编号。
- 主机填充进报文段的确认号是主机期望从对方主机收到的下一个字节的序号。例如主机A和B之间通信,假设主机A收到了主机B的编号为0~500的所有字节,同时主机A打算发送一个报文段给主机B,那么主机A就会在它发往主机B的报文段的确认好字段中填上536。
- TCP只确认传输流中第一个丢失字节为止的字节,即TCP提供给累计确认。
- TCP对于收到失序报文段的处理方式没有明确规定,通常的处理方式是保留失序的字节,等待缺少的字节以进行填充。
- TCP连接的双方通常会随机的选择初始序号,可以减少将 先前已终止的连接的报文段 被误认为是 新建连接所产生的新报文段 的可能性。
四、TCP可靠数据传输
TCP的可靠数据传输确保一个进程从其接收缓存中读出的数据是无损坏、无间隙、非冗余和按序的数据流。
1. 往返时间的估计与超时
在任意时刻,仅为一个已发送但目前尚未确认的报文段估计样本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
2. 超时间隔加倍
当超时事件发生时,TCP重传具有最小序号的还未被确认的报文段。每次TCP重传时都会将下一次的超时间隔设置为先前值的两倍,而不是用从EstimatedRTT和SampleRTT推算出的值。
3. 快速重传
超时触发重传存在的问题之一是超时周期可能相对较长。如果一个报文段丢失,就可能引起收到多个冗余ACK。冗余ACK是再次确认某个报文的ACK,发送方已经收到过对该报文段的确认。一旦收到3个冗余ACK,TCP就执行快速重传,即在超时定时器过期之前重传丢失的报文段。
五、TCP流量控制
流量控制是一个速度匹配服务,即发送方的发送速率和接收方的接收速率相匹配。简单来说,TCP通过让发送方维护一个接收窗口的变量来提供流量控制。接收窗口用于给发送发一个指示——该接收方还有多少可用的缓存空间。更直白地来说,一方将自己的空闲缓冲区大小告诉对方。
六、TCP拥塞控制
拥塞控制是指TCP发送方收到IP网络的拥塞而被遏制,需要对发送方进行控制。分组重传通常被作为网络拥塞的征兆来对待。
1. 拥塞控制原理
1.1 网络拥塞的代价
- 当分组的到达速率接近链路容量时,分组经历巨大的排队延时。
- 发送发必须执行重传以补偿因为缓存溢出而丢失的分组。
- 发送发在遇到大延时所进行的 不必要重传 会引起路由器利用其链路带宽来转发不必要的分组副本。
- 当一个分组沿一条路径被丢弃时,每个上游路由器用于 转发该分组 到 丢弃该分组 而 使用的传输容量 最终被浪费掉了。
1.2 拥塞控制方法
- 端到端拥塞控制。即端系统通过对网络行为的观察来推断是否存在拥塞。
- 网络辅助的拥塞控制。录用其向发送发提供网络中拥塞状态的显示反馈信息。
2. TCP拥塞控制
TCP拥塞控制的方法是让每一个发送发根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率。如果感知到拥塞就降低发送速率,反之增加其发送速率。
拥塞窗口值:运行在发送方的TCP拥塞控制机制根据的一个额外变量,即拥塞窗口值。拥塞窗口对一个TCP发送方能向网络中发送流量的速率进行了限制。
TCP拥塞控制中的一些指导性原则:
- 一个丢失的报文段意味着拥塞,因此当报文段丢失时应当降低TCP发送发的速率。
- 一个确认报文段指示该网络正在向接收方交付所发送的报文段,因此当对先前未确认的报文段的确认到达时,增加发送发的速率。
- 带宽探测。TCP发送方探测出拥塞开始出现的策略,从该速率进行后退,然后再次探测,迂回前进。
2.1 慢启动
首先明确,慢启动不慢,慢启动阶段,每过一个RTT(往返时间),发送速率就翻番。即在慢启动状态,拥塞窗口值以一个MSS(Maximum Segment Size,最大报文长度)开始并且每当传输的报文段首次被确认就增加一个MSS。因此TCP发送速率起始慢,但在慢启动阶段以指数增长。
慢启动结束的方式:
- 当出现一个丢包事件时(即拥塞),TCP开始重新慢启动,并将慢启动阈值设置为拥塞窗口值的一半。即当检测到拥塞时,将慢启动阈值设置为拥塞窗口值的一半。
- 当拥塞窗口值等于慢启动阈值时,慢启动结束并且TCP转移到拥塞避免模式。
- 当检测到3个冗余ACK,TCP执行快速重传并进入快速恢复状态。
2.2 拥塞避免
在拥塞避免阶段,每个RTT只将拥塞窗口的值增加一个MSS。
总的来看,慢启动阶段:每个RTT 加倍增加;拥塞避免阶段:每个RTT 线性增加。
2.3 快速恢复
在快速恢复中对于引起TCP进入快速恢复状态的确实报文段,每当收到冗余的ACK,拥塞窗口值增加一个MSS。
2.4 总结**
TCP拥塞控制为加性增、乘性减。
- 当 拥塞窗口值 < 慢启动阈值,发送端处于慢启动阶段,窗口指数性增长。
- 当 拥塞窗口值 > 慢启动阈值,发送端处于拥塞避免阶段,窗口值线性增长。
- 当收到3个冗余ACK时,慢启动阈值设置为拥塞窗口值的一半,拥塞窗口值为慢启动阈值加3。
- 当超时事件发生时,慢启动阈值减半,拥塞窗口值设为 1 个MSS,进入慢启动阶段。
本文为个人学习笔记,如有错漏之处,敬请指正!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!