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,然后慢启动,指数增长。

posted @ 2023-04-14 11:16  LEE_Minhyung  阅读(93)  评论(0)    收藏  举报