TCP

2022.08.17

TCP协议特点

TCP报文段

简介

TCP传送的数据单元称为报文段。TCP报文段既可以用来运载数据,又可以用来建立连接、释放连接和应答。一个TCP报文段分为首部和数据两部分,整个TCP报文段作为IP数据报的数据部分封装在IP数据报中,如下图所示。其首部的前20B是固定的。TCP首部最短为20B,后面有4N字节是根据需要而增加的选项,长度为4B的整数倍

img

例题

总结

  1. 对不同协议的首部长度总结

    • TCP:首部20B固定,4B为单位可变,最长4×(241)=60B
    • UDP:首部8B固定
    • IP:首部20B固定,有变长部分
    • MAC帧:前导码 8B + (目的 6B + 源 6B + 类型 2B) 14B + 数据 + FCS 4B
    • 无线MAC帧:首部30B
    • PPP:(F(7E)+A(FF)+C(03)+协议) 5B + 数据 + FCS 2B + F,F是帧定界符
  2. 课程推荐:

    计算机网络微课堂第074讲 TCP报文段的首部格式 (Up 湖科大教书匠)

TCP连接管理

简介

TCP 是面向连接的协议,因此每个TCP 连接都有三个阶段:连接建立、数据传送和连接释放。TCP 连接的管理就是使运输连接的建立和释放都能正常进行。在TCP 连接建立的过程中,要解决以下三个问题: 1)要使每一方能够确知对方的存在 2)要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项、时间戳选项及服务质量等)。 3)能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。 TCP 把连接作为最基本的抽象,每条TCP 连接有两个端点,TCP 连接的端点不是主机,不是主机的 IP 地址,不是应用进程,也不是传输层的协议端口。TCP 连接的端口即为套接宇(Socket)或插口,每条 TCP 连接唯一地被通信的两个端点(即两个套接字)确定TCP 连接的建立采用客户/服务器模式。主动发起连接建立的应用进程称为客户 (Client),而被动等待连接建立的应用进程称为服务器(Server)。

连接建立(三次握手)

ClientServerCLOSED被动打开LISTENCLOSED主动打开SYN=1, ACK=0, seq=x连接请求报文段, 无应用层数据消耗一个序号SYN-SENTSYN=1, ACK=1, seq=y, ack=x+1确认报文段, 无应用层数据消耗一个序号SYN-RCVDSYN=0, ACK=1, seq=x+1, ack=y+1普通确认报文段, 如果无应用层数据可以不消耗一个序号ESTAB-LISHEDESTAB-LISHEDDataClientServer

SVN洪泛攻击

SVN洪泛攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了

课程推荐:

计算机网络微课堂第072讲 TCP的连接建立 (Up 湖科大教书匠)

连接释放(四次握手)

ClientServerDataESTAB-LISHEDESTAB-LISHED主动关闭FIN=1, seq=u请求释放,及时无应用层数据也要消耗一个序号FIN-WAIT-1ACK=1, seq=v, ack=u+1FIN-WAIT-2CLOSE-WAITDataFIN=1, ACK=1, seq=w, ack=u+1ACK=1, seq=u+1, ack=w+1CLOSEDTIME-WAIT(2MSL)CLOSEDClientServer

(MSL:最长报文段寿命)

课程推荐:

计算机网络微课堂第073讲 TCP的连接释放 (Up 湖科大教书匠)

注意:

  1. 服务器对客户端主动关闭(seq=u)的两次响应FIN=1,ack都是u+1
  2. 客户端最后需要等待2MSL才能关闭

小结

(/3是三次握手,/4是四次握手)

阶段SYN(同步)ACK(连接)FIN(结束)seqack
请求建立(1/3)100x 
服务器确认(2/3)110yx+1
确认的确认(3/3)010x+1y+1
请求取消(1/4)011u 
服务器确认(2/4)010vu+1
服务器批准(3/4)011v+ku+1
客户端确认批准(4/4)010u+1v+k+1

可以发现

  1. ACK除了请求建立连接,都是1;
  2. SYN=1: 一来一回,而确认的确认SYN=0;
  3. FIN=1:一来一回,两个确认FIN=0;
  4. seq是自己发的第一个
  5. ack是对方下一次发的第一个

参考链接:

https://yujianxin.blog.csdn.net/article/details/45204399

https://www.cnblogs.com/RichardTAO/p/12097469.html

例题

TCP可靠传输

序号

TCP首部的序号字段用来保证数据能有序提交给应用层,TCP把数据视为一个无结构但有序的字节流,序号建立在传送的字节流之上,而不建立在报文段之上。【一个字节一个序号】

TCP连接传送的数据流中的每个字节都编上一个序号。序号字段的值是指本报文段所发送的数据的第一个字节的序号。如图所示,假设A和B之间建立了一条TCP连接,A的发送缓存区中共有10B,序号从0开始标号,第一个报文包含第0~2个字节,则该TCP报文段的序号是0,第二个报文段的序号是3。【报文段一般根据MTU划分】

img

确认

TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。在上图中,如果接收方B已收到第一个报文段,此时B希望收到的下一个报文段的数据是从第3个字节开始的,那么B发送给A的报文中的确认号字段应为3。发送方缓存区会继续存储那些已发送但未收到确认的报文段,以便在需要时重传。

TCP默认使用累积确认,即T℃P只确认数据流中至第一个丢失字节为止的字节。例如,在上图中,接收方B收到了A发送的包含字节0~2及字节6~7的报文段。由于某种原因,B还未收到字节3~5的报文段,此时B仍在等待字节3(和其后面的字节),因此B到A的下一个报文段将确认号字段置为3。

重传

有两种事件会导致TCP对报文段进行重传:超时和冗余ACK。

超时

TCP每发送一个报文段,就对这个报文段设置一次计时器。计时器设置的重传时间到期但还未收到确认时,就要重传这一报文段。由于TCP的下层是一个互联网环境,IP数据报所选择的路由变化很大,因而传输层的往返时延的方差也很大。为了计算超时计时器的重传时间,TCP采用一种自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两个时间之差称为报文段的往返时间(Round-Tip Time,RTT)。TCP保留了RTT的一个加权平均往返时间RTTs,它会随新测量RTT样本值的变化而变化。显然,超时计时器设置的超时重传时间(Retransmission Time-Out,RTO)应略大于RTTs,但也不能大太多,否则当报文段丢失时,TCP不能很快重传,导致数据传输时延大。

RTT=(1a)×(RTT)+a×(RTT)
冗余ACK(冗余确认)

超时触发重传存在的一个问题是超时周期往往太长。所幸的是,发送方通常可在超时事件发生之前通过注意所谓的冗余ACK来较好地检测丢包情况。冗余ACK就是再次确认某个报文段的ACK,而发送方先前已经收到过该报文段的确认。例如,发送方A发送了序号为1、2、3、4、5的TCP报文段,其中2号报文段在链路中丢失,它无法到达接收方B。因此3、4、5号报文段对于B来说就成了失序报文段。TCP规定每当比期望序号大的失序报文段到达时,就发送一个冗余ACK,指明下一个期待字节的序号。在本例中,3、4、5号报文到达B,但它们不是B所期望收到的下一个报文,于是B就发送3个对1号报文段的冗余ACK,表示自己期望接收2号报文段。TCP规定当发送方收到对同一个报文段的3个冗余ACK时,就可以认为跟在这个被确认报文段之后的报文段已经丢失。就前面的例子而言,当A收到对于1号报文段的3个冗余ACK时,它可以认为2号报文段已经丢失,这时发送方A可以立即对2号报文执行重传,这种技术通常称为快速重传。当然,冗余ACK还被用在拥塞控制中,这将在后面的内容中讨论。

例题

TCP流量控制

介绍

TCP提供流量控制服务来消除发送方(发送速率太快)使接收方缓存区溢出的可能性,因此可以说流量控制是一个速度匹配服务(匹配发送方的发送速率与接收方的读取速率)。

TCP提供一种基于滑动窗口协议的流量控制机制,滑动窗口的基本原理已在第3章的数据链路层介绍过,这里要介绍的是TCP如何使用窗口机制来实现流量控制。

在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口rwnd,即调整TCP报文段首部中的“窗口”字段值,来限制发送方向网络注入报文的速率。同时,发送方根据其对当前网络拥塞程度的估计而确定的窗口值,这称为拥塞窗口cwnd(后面会讲到),其大小与网络的带宽和时延密切相关。

例如,在通信中,有效数据只从A发往B,而B仅向A发送确认报文,这时B可以通过设置确认报文段首部的窗口字段(如果是)来将rwmd通知给A。rwnd即接收方允许连续接收的最大能力,单位是字节。发送方A总是根据最新收到的rwnd值来限制自己发送窗口的大小,从而将未确认的数据量控制在rwmd大小之内,保证A不会使B的接收缓存溢出。当然,A的发送窗口的实际大小取rwndcwnd中的最小值。

设A向B发送数据,在连接建立时,B告诉A:“我的接收窗口rwnd=40”。接收方主机B进行了三次流量控制,这三个报文段都设置了ACK=1,只有在ACK=1时确认号字段才有意义。第一次把窗口减小到rwnd=300,第二次又减到rwnd=100,最后减到rwnd=0,即不允许发送方再发送数据。这使得发送方暂停发送的状态将持续到B重新发出一个新的窗口值为止。

img

传输层和数据链路层的流量控制的区别是:传输层定义端到端用户之间的流量控制,数据链路层定义两个中间的相邻结点的流量控制。另外,数据链路层的滑动窗口协议的窗口大小不能动态变化,传输层的则可以动态变化

网课推荐:

计算机网络微课堂第068讲 TCP的流量控制(Up 湖科大教书匠)

要点小结:

  1. 流量控制的主要任务:防止接收方速度跟不上
  2. 接受窗口叫:rwnd
  3. 传输层的流量控制的窗口大小可以变化

例题

在采用TCP连接的数据传输阶段,如果发送端的发送窗口值由1000变为2000,那么发送端在收到一个确认之前可以发送:

A. 2000个TCP报文段

B. 2000B

C. 1000B

D. 1000个TCP报文段

【答案】:B

TCP拥塞控制

拥塞控制是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载。出现拥塞时,端点并不了解拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加。

拥塞控制与流量控制的区别:拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是指点对点的通信量的控制,是个端到端的问题(接收端控制发送端),它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。

当然,拥塞控制和流量控制也有相似的地方,即它们都通过控制发送方发送数据的速率来达到控制效果。

例如,某个链路的传输速率为10Gb/s,某大型机向一台PC以1Gbs的速率传送文件,显然网络的带宽是足够大的,因而不存在拥塞问题,但如此高的发送速率将导致PC可能来不及接收,因此必须进行流量控制。但若有100万台PC在此链路上以1MG/s的速率传送文件,则现在的问题就变为网络的负载是否超过了现有网络所能承受的范围。

因特网建议标准定义了进行拥塞控制的4种算法:慢开始拥塞避免快重传快恢复。发送方在确定发送报文段的速率时,既要根据接收方的接收能力,又要从全局考虑不要使网络发生拥塞。因此,TCP协议要求发送方维护以下两个窗口:

1)接收窗口rwnd,接收方根据目前接收缓存大小所许诺的最新窗口值,反映接收方的容量。由接收方根据其放在TCP报文的首部的窗口字段通知发送方。

2)拥塞窗口cwnd,发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络的当前容量。只要网络未出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络的分组数。发送窗口的上限值应取接收窗口rwnd和拥塞窗口cwmd中较小的一个接收窗口的大小可根据TCP报文首部的窗口字段通知发送方,而发送方如何维护拥塞窗口呢?这就是下面讲解的慢开始和拥塞避免算法。

课程推荐:

计算机网络微课堂第069讲 TCP的拥塞控制 (Up: 湖科大教书匠)

慢开始和拥塞避免

慢开始

在TCP刚刚连接好并开始发送TCP报文段时,先令拥塞窗口cwnd=1,即一个最大报文段长度MSS。每收到一个对新报文段的确认后,将cwmd加1,即增大一个MSS。用这样的方法逐步增大发送方的cwnd,可使分组注入网络的速率更加合理。

例如,A向B发送数据,发送方先置拥塞窗口cwnd=1,A发送第一个报文段,A收到B对第一个报文段的确认后,把cwmd从1增大到2;于是A接着发送两个报文段,A收到B对这两个报文段的确认后,把cwnd从2增大到4,下次就可一次发送4个报文段。

慢开始的“慢”并不是指拥塞窗口cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞情况),然后再逐渐增大cwnd,这对防止网络出现拥塞是一个非常有力的措施。使用慢开始算法后,每经过一个传输轮次(即往返时延RTT),cwnd就会加倍,即cwmd的值随传输轮次线性增长。这样,慢开始一直把cwmd增大到一个规定的慢开始门限ssthresh(阈值),然后改用拥塞避免算法。

拥塞避免

拥塞避免算法的思路是让拥塞窗口cwmd缓慢增大,具体做法是:每经过一个往返时延RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,使拥塞窗口cwnd按线性规律缓慢增长(即加法增大),这比慢开始算法的拥塞窗口增长速率要缓慢得多。

根据cwnd的大小执行不同的算法,可归纳如下:

网络拥塞处理

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(未按时收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送方的cwmd值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完。

image-20220816220611738

快重传和快恢复

快重传

在上一节介绍的TCP可靠传输机制中,快重传技术使用了冗余ACK来检测丢包的发生。同样,冗余ACK也用于网络拥塞的检测(丢了包当然意味着网络可能出现了拥塞)。快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。

当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。

快恢复

快恢复算法的原理如下:当发送方连续收到三个冗余ACK(即重复确认)时,执行“乘法减小”算法把慢开始门限ssthresh设置为此时发送方cwnd的一半。这是为了预防网络发生拥塞。

但发送方现在认为网络很可能没有发生(严重)拥塞,否则就不会有几个报文段连续到达接收方,也不会连续收到重复确认。因此与慢开始不同之处是它把cwmd值设置为慢开始门限ssthresh改变后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。

由于跳过了拥塞窗口cwnd从1起始的慢开始过程,所以被称为快恢复。快恢复算法的实现过程如图所示,作为对比,虚线为慢开始的处理过程。

image-20220816221526085

注意

例题