3.5 面向连接的传输:TCP
一、概述
1、点到点:一个发送者,一个接收者
2、可靠按序的字节流:报文间的界限靠应用进程自身维护
3、流水线
4、收发缓冲区:便于重传;匹配应用进程读取速率和发送方发送速率
5、全双工:(MSS:最大报文段 即报文段里数据的最大长度,每个网络最大传输单元MTU MSS+TCP头部+IP头部能被封装在一个MTU里)
6、面向连接
7、流量控制,拥塞控制
二、TCP报文结构

1、源端口和目的端口字段——各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。
2、序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
3、确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
eg.接收方返回ACK55,意味着已收到54及之前,希望发送55。
4、数据偏移(即首部长度)——占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。“数据偏移”的单位是 32 位字(以 4 字节为计算单位)。
5、紧急 URG (URGent)—— 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
确认 ACK(ACKnowledgment) —— 只有当 ACK = 1 时确认号字段才有效。当 ACK =0 时,确认号无效。
推出PSH(PuSH)——指示接收方应立即将数据交给上层。
复位 RST (ReSeT) —— 当 RST =1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
同步 SYN(SYNchronize) —— 同步 SYN = 1 表示这是一个连接请求或连接接受报文。
终止 FIN (FINis) —— 用来释放一个连接。FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
6、窗口字段 —— 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。 指示接收方愿意接受的字节数量。
7、检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
8、紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
说明:
A. TCP的序号和确认号


B.TCP往返时延的估计和超时
①样本RTT(SampleRTT): 测量从报文段发送到收到确认的时间 。样本RTT会变化,因此需要一个样本RTT均值(Estimated RTT) 。弱依赖于采样值(真实值)。
(这一次,上一次,上一次)
②EstimtedRTT 加上 “安全余量”:

(这一次,上一次,上一次,上一次)
③超时时间间隔:
![]()
注意,计算时先计算DevRTT,再计算EstimatedRTT。
三、可靠传输机制
1、TCP在IP不可靠服务之上创建rdt服务 。
2、流水线技术处理报文段 。
3、累计确认,ACK序号是对对方的期待。
4、使用单个重发计时器,重发时只发单个报文。(GBN和选择重传的结合体)
5、触发重发的事件:超时,三个冗余确认。
TCP发送方:

说明:
①上层来数据->生成具有NextSeqNum序号的TCP报文,向IP传递报文,如果没有启动定时器,则启动定时器。
②收到ACKy->如果ACK落在窗口之内,则确认对应的报文,并且滑动窗口(滑动后沿) 。若还有未确认的报文,重新开始定时器。
③超时->重发导致超时的报文,重新开始定时器。

④快速重传:发送方可以在超时之前通过重复的ACK检测丢失报文段

超时触发重传存在问题:超时周期往往太长—— 重传丢失报文之前要等待很长时间,因此增加了网络的时延。
如果发送方收到3次重复确认(4个对同样报文段的确认),则发送方认为该报文段之后的数据已经丢失,启动快速重传: 在定时器超时之前重发丢失的报文段
TCP接收方:

四、连接管理
1、建立连接

①第一次——SYN报文段:不含应用层数据;报文段首部SYN置1;随机选择初始序号x;ACK=0
②第二次——SYNACK报文段:返回允许连接的报文,不含应用层数据;报文段首部SYN置1;ACK=1;ACK序号为x+1;选择自己的初始序号y
③第三次:SYN=0;ACK=1;ACK序号为y+1
2、关闭连接

①第一步:客户发送 TCP FIN 控制报文段到服务器;FIN=1;(客户端进入FIN_WAIT_1)
②第二步:服务器接收 FIN, 回复 ACK;进入半关闭连接状态(客户向服务武器发送通道关闭,不能发送用户数据,但可以发报文);ACK=1;ACK序号为1。(客户端进入FIN_WAIT_2)
③第三步:服务器发送FIN到客户,客户接收FIN, 回复 ACK, 客户端进入TIME_WAIT。等待30s,连接关闭。
④第四步:服务器接收ACK。
五、流量控制
1、出现的问题:TCP连接的接收方有一个接收缓冲区,应用程序可能从这个缓冲区读出数据很慢。发送方不能发送得太多太快,让接收缓冲区溢出。
2、RevWindow:接收窗口
RevBuffer:接收缓存

用接收窗口指示接收缓冲区的剩余空间,接收方在报文段中宣告接收窗口,发送方限制没有确认的数据不超过接收窗口,保证接收缓冲区不溢出。
六、TCP拥塞控制
1、拥塞:太多源主机发送太多的数据,速度太快以 至网络来不及处理。
表现: 丢失分组 (路由器的缓冲区溢出) ,长延迟 (在路由器的缓冲区排队)
2、拥塞控制的方法:
①端到端拥塞控制: 没有从网络中得到明确的反馈,从端系统观察到的丢失和延迟推断出拥塞,TCP采用的方法。
②网络辅助的拥塞控制: 路由器给端系统提供反馈,单bit指示拥塞 (SNA, DECnet, TCP/IP ECN, ATM) ,指明发送者应该发送的速率 。
3、TCP拥塞控制
①发送方感知拥塞:丢失事件 = 超时或者 3 个重复的ACKs
②增加设置一个CongWin(拥塞窗口),发送方限制发送:LastByteSent-LastByteAcked<min(CongWin , RcvWindow )
(*TCP对流量控制和拥塞控制联动进行)
③三个机制:慢启动,拥塞避免,快速恢复
A.慢启动

1.连接开始的时候, CongWin = 1 MSS
2.以指数方式增加速率: 在每个 RTT内倍增 CongWin——每收到一个ACK,CongWin 加1;每一个RTT,CongWin翻倍
3.CongWin超过阈值,进入拥塞避免
3.当由超时指示的丢包发生:
阈值变为CongWin的一半;CongWin 立即设置为 1个 MSS;窗口开始指数增长(进入慢启动)
4.当收到三个重复确认:
阈值变为CongWin的一半;CongWin 减半+3 ,然后窗口线性增长 (进入快速恢复)
B.拥塞避免
1.每个RTT将CongWin增加1个MSS
2.当由超时指示的丢包发生:
阈值变为CongWin的一半;CongWin 立即设置为 1个 MSS; 窗口开始指数增长(进入慢启动)
3.当收到三个重复确认:
阈值变为CongWin的一半;CongWin 减半+3 ,然后窗口线性增长 (进入快速恢复)
C.快速恢复
1.收到三个冗余确认进入快速恢复状态。
2.每收到一个重复的ACK拥塞窗口增加1MSS
3.如果收到新的ACK,拥塞窗口置成阀值,进入拥塞避免
4.如果超时,阀值置为CongWin/2 ,CongWin 置为1 MSS,进入慢启动
总结:



例:对下图解释
阈值初始值为8MSS。
前四轮传输回合,处于慢启动阶段,指数级别增长。
到达阈值后,从第五轮开始进入拥塞避免,线性速度增长。
若在第八个回合出现了三个冗余确认,阈值被设置为6MSS,拥塞窗口设置为9MSS,然后每收到一个冗余确认,线性增长(若终于接收到了新ACK,拥塞窗口设置为阈值6MSS,进入拥塞避免)。
若在第八回合出现了超时,阈值被设置为6MSS,拥塞窗口设置为1MSS,然后慢启动,指数增长。


浙公网安备 33010602011771号