网络原理之TCP协议(万字详解!!!)

[复制链接]
发表于 2026-1-26 07:38:04 | 显示全部楼层 |阅读模式


目次

前言
TCP协议段格式
TCP协议干系特性
1.确认应答
2.超时重传
3.连继承理(三次握手、四次挥手)
三次握手(创建TCP毗连)
四次挥手(断开毗连) 
4.滑动窗口
5.流量控制
6.拥塞控制
7.延伸应答
8.捎带应答
 9.基于字节流
10.非常环境的处理惩罚
小结 

前言

在前面,我们已经讲授了有关UDP协议的干系知识,但是在传输层,另有另一个告急的传输协议--TCP协议。UDP协议固然包管了数据传输的速率,但是每次传输数据最多只能64kb,而且其传输不具备可靠性,在数据丢失后并不会重新传输。
这是就得提到TCP协议了,TCP协议是一个有毗连的、可靠的、面向字节流、全双工的传输通讯协议。固然在传输速率上,TCP大概比不外UDP,但是TCP可以或许传输更大的数据以及在传输数据时具有可靠性,从而在寻常我们更多的是使用TCP。
TCP协议段格式




  • 源/目标端标语:表现数据从哪个历程来,到哪个历程去;
  • 32位序号/32位确认序号:反面为各人细讲
  • 4位首部长度:表现TCP头部信息的长度,单位是4字节(32比特位),以是TCP头部信息最长为15*4=60字节
  • 生存位(6位):在必要新增属性/某个属性的长度不敷用时,就可以把生存位拿出来用。而UDP报文长度最大只有两个字节的长度,TCP这里就增长了可扩展性
  • 6个标志位:反面和各人讲
  • 16位窗口巨细:反面细讲
  • 16位校验和:发送端添补,CRC校验,吸收端校验不通过,则以为数据有题目,此处校验和不光包罗TCP首部,也包罗TCP数据部分。
  • 16位告急指针:标识哪部分数据是告急数据。
  • 40字节头部选项:表现可选项,属于报头部分,选项范围是0~40字节。
TCP报头长度最长为60字节,最短为20字节(选项为0字节),当4位首部长度为0时,分析报头长度为20字节,也就是选项长度为0字节;当4位首部长度表现15时,分析报头长度为60字节,也就是选项的长度为40字节。
接下来我们来相识TCP的四个特性。
TCP协议干系特性



  • 有毗连:TCP是面向毗连的,在传输数据之前,必要先创建毗连;当传输完数据后,还必要开释毗连。
  • 可靠传输:TCP协议通过确认应答、超时重传、滑动窗口等机制来包管了TCP中数据的可靠传输。确认应答机制包管了发送的数据段可以或许被吸收方准确吸收,而超时重传则可以或许在未吸收到ack太长时间重新发送未被确认的数据段。滑动窗口机制则是通过一次发送多条数据,来提供数据的传输服从。
  • 面向字节流:TCP协议是以字节为单位来举行传输数据的,这意味在传输过程中,数据不会被分割成固定长度的数据段,而是根据应用步伐的需求来构造和传输。
  • 全双工:TCP协议支持全双工通讯,即发送方和吸收方可以同时举行数据传输。这使得数据传输更加高效,但是也必要注意处理惩罚好流量控制和拥塞控制等题目。
那么TCP协议中,重要使用哪些机制来包管数据的可靠传输呢?
1.确认应答

确认应答(Acknowledgment,简称ack)是TCP协议中包管数据的可靠传输的告急机制之一。在TCP通讯中,当吸收方吸收到发送方发送的数据段后,会向发送方发送一个确认应答序号(ack),来关照发送方已经吸收到数据段。而吸收方发送简直认应答序号,表现渴望吸收到下一个字节的序号。


确认应答的工作过程:

  • 发送数据:当TCP毗连的发送方发送数据时,会为每个字节的数据都举行分配序号,即序列号。(注意:序列的分配只是针对TCP载荷部分来举行编号的,而TCP报头部分并不到场分配)
  • 吸收数据:当吸收方吸收到发送方发送的数据后,会向发送方发送一个确认序号(ack),一样寻常这个确认序号是下一次渴望继承的数据段的序号。
那么发送在发送数据的时间,有没有大概会出现“后发先至”的环境呢?
着实也是有的,有大概是由于网络延伸、网络拥塞和数据包重传等题目,从而导致后发先至。但是TCP会针对吸收方收到数据举行重新排序,确保应用步伐读取到的数据肯定是和发送方发的数据序次划一的


我们可以来举个例子:
假设我和几个同事和领导约了一个饭局,那么当我们先到达饭店之后,我们就必要等领导的到来,才华举行开始我们的饭局。这里的我和几个同事就相当于先到的数据,而领导则是必要先到的数据;而饭局就相当于历程B。
那么我们前面说的序列号和确认应答号到底有什么用呢?
序列号的作用


  • 包管了数据的序次:TCP将传输的数据分割为TCP段,并为每个段分配一份序号,这些序号就能在吸收方重新组合成原始的数据流,包管数据的序次。
  • 包管了数据的完备性:假如数据在传输的过程中出现了丢失大概粉碎的环境,吸收端就可以根据序列号来判断哪些数据必要重传,从而包管数据的完备性。
确认应答号的作用


  • 告知发送端下一次渴望吸收的数据段的序号:当吸收端收到一个TCP数据段后,会向发送端发送一个确认应答序号,此中简直认应答序号表现下一次渴望吸收到的数据段的开头序号,这有助于数据的重复传输。
  • 实现可靠的数据传输:只有当发送端吸收到确认应答序号,才会继承发送后序的数据段。假如发送端在规定的时间内没有吸收到确认应答序号,就会重传未吸收到确认应答序号的数据段,从而包管数据的可靠传输。

当主机A给主机B发送TCP数据报(TCP报头+TCP载荷),TCP报头中记载的是这次传输的载荷数据中第一个字节的序号,而其他的字节号则必要根据字啊和中数据长度依次推出。这里主机A给主机B发送1~1000的数据,那么B在读取完A发送的数据后,就会返回一个确认应答序号(1001)【一样寻常读取的数据中末了字节的序号+1】。那么下次主机A就必要发送从1001开始的数据报。
   对于应答报文来说(就是吸收端返回的数据报)确认序号就会按照收到的数据的末了一个字节序号+1的方式来填写,同时,在六个标志位中,第二位标志位ACK会设置为1,表明该报文是一个应答报文。若ACK标志位为0,分析该报文为普转达文。
  注意:应答报文默认环境下不带数据,除非某些特殊环境。
  

2.超时重传

在网络通讯的过程中,着实并不能包管数据可以或许一帆风顺的传输到,有大概会出现“丢包”的环境,什么是丢包呢?
   丢包是指在网络传输过程中,数据包由于某些缘故起因没可以或许准确地到达目标地,从而丢失的征象。丢包大概是网络题目、硬件故障、软件错误大概设置不妥等缘故起因造成的。在网络通讯中,丢包是一个常见的题目,明白和办理丢包题目对于包管网络的稳固性和可靠性至关告急。丢包是网络性能中最核心的指标之一。
  发生丢包,完满是随机的,不可推测的~
  这里我们罗列两种缘故起因:
1.当数据传输过程中,发生了bit翻转,收到这个数据的吸收方/中心的路由器,盘算校验和,发生校验和对不上了,那么就必要将这个数据包给扬弃掉。
2.当数据在传输某个节点(路由器/交换机)时,由于该节点正处于高峰期,在单位时间内必要转发的包高出了N,此时该节点就继承不外来了,那么大概数据到这个节点时,该节点就会直接将数据给扬弃掉。
以下是大概出现丢包的两种环境:


  • 发送方发送的过程中丢包



  • 吸收方发送确认序号给发送方时丢包 

那么在发生丢包题目之后,TCP是怎样处理惩罚的呢
TCP能做的是就是:在感知到数据是否丢包后,假如丢包了,就重新再发一次数据包
   注意:超时重传的时间设定是动态厘革的!!!
  假如在重发一次在规定的时间t1内没有吸收到确认应答序号,那么就会再次重发,第三次重传,超时时间为t2,t2>t1,且每重传一次,超时时间的隔断就会变大,从而重传的次数就会低沉~
假如重传的次数越多,等待的时间就会越长,但也不代表这可以或许无穷等待重传。当重传频频后,等待时间就会拉到肯定的长度,就会以为数据再怎么传也是没有效,此时就会放弃该TCP毗连,正确的来说是触发了TCP的重传毗连操纵。TCP起首会实验举行“复位/重置 毗连”,发送一个特殊的数据包“复位报文”,假如网络规复了,复位报文就会重置毗连,使得通讯可以继承举行,但假如网络出现了严肃的题目,复位报文也没有获取到回应,那么TCP就会单方面放弃毗连。
假设网络丢包率为10%(这是一个很大的数字了),重传两次都失败的概率为1%,这个概率好坏常小的,假如两次重传都不能吸收到ACK的话,分析大概是网络大概硬件装备出现了题目。
那么这里大概就会有个题目,假如是在吸收方吸收到数据报后发送ACK的时间出现了丢包征象,那么这里TCP发送方在等待一段时间后,没有吸收到ACK重新发送一份数据报文,那么岂不是会出现辩论?着实是会的,不外TCP在这里给出了相应的步伐来办理这种环境:
TCP吸收放在操纵体系内核中存在一段内存空间,叫做“吸收缓冲区”,对于上一次吸收到的数据,会先放入吸收缓冲区中,当再一次吸收到数据时,TCP会将这个后至的数据和吸收缓冲区中的数据举行比力,假如发现后到的数据已经在继承缓冲区中存在,TCP就会将这个厥后的数据给扬弃掉。
小结: 
   吸收缓存区不光可以对数据举行重排序,也可以办理吸收到重复数据的题目,从而确保应用步伐吸收和读取到的数据序次是和发送方划一的。
  确认应答和超时重传相互增补,共同构建了TCP的“可靠传输机制”!!!
  “三次握手 四次挥手”只是决定了TCP具有创建毗连和断开毗连的特性,核心作用是确认应答+超时重传!!!
  3.连继承理(三次握手、四次挥手)

三次握手(创建TCP毗连)

对于三次握手、四次挥手,我们在寻常大概会常常听到,那么这到底是什么意思呢?接下来我们就来认识认识~
三次握手就相当于通讯双方打招呼,告诉对方我要和你创建毗连。发送方起首会给吸收方发送一个SYN(Synchronize Sequence Numbers,同步报文段),告诉对方我要和你创建毗连,当吸收方吸收到SYN同步报文段后,吸收方会给发送方发生一个ACK应答数据包,同时也发送一个SYN给发送方,告诉对方我要和你创建毗连,当发生方吸收到吸收方发送的ACK应答数据包和SYN后,就会给返回一个ACK数据包给吸收方。

那么大概就会有人问:这里不是三次握手吗?怎么发送了四次数据包呢?着实这里吸收方在给发送方发送ACK数据包和SYN时,会打包成一次发送已往。
 

 

那么在吸收到数据包之后,怎样区分该数据包时SYN照旧ACK数据包呢?着实在前面我已经讲过了,假如是ACK数据包的话,会在ACK标志位中记载该包为ACK包,假如SYN包的,就在SYN标志位中记载该包是SYN数据包。

 三次握手除了办理毗连题目,那么还可以办理哪些题目呢?
   

  • 确认当前网络是否流畅(举行可靠传输的条件)
  • 让发送方和吸收方确认自己的发送和继承本领是正常的
  • 针对一些告急的参数举行协商
当通讯双方举行三次握手创建毗连的时间,相互会发送数据包,以此来判断双方是否能举行通讯,假如数据包到达不了对方,并在重传频频之后仍然不能到达对方,分析双方不能举行正常的通讯。
当通讯双方要创建毗连的时间,发送方会向吸收方发送一个SYN同步数据段,假如继承方可以或许吸收到SYN数据段,分析发生方的发送本领和吸收方的继承本领没有题目。接下来吸收方就会给发送方发送ACK数据包和SYN数据段,假如发送方吸收到ACK数据包和SYN数据包,分析发送方就会以为自己的继承本领和吸收方的发送本领没有题目。但由于此时吸收方不清楚自己的发送本领是否正常,以是发送方在吸收到ACK数据包和SYN数据包后还必要给吸收方发送一个ACK数据包当吸收方吸收到这个ACK数据包后,就会以为自己的发送本领没有题目
 
 在TCP举行通讯的时间,起始数据的序号是通过三次握手来协商确定的(换而言之,TCP序号并不是从1开始的),在每次创建毗连的时间,TCP的起始序号都差异,而且故意差异很大。
   那么TCP可不可以是两次握手?
  着实是不可以的,假如是两次握手,那么通讯双方就无法完成针对各自发送本领和吸收本领的验证~看上面我举的例子就可以看出来,假如是两次握手的话,朋侪就不能确定自己的麦克风是否正常。
  那么可以不可以是四次握手呢?
  着实是可以的,但是没有须要,四次握手的话,就是将吸收方返回的ACK和SYN拆分为两次,但是没有须要做~
  针对TCP协议来说,必须是三次握手,必要验证通讯双方的发送吸收本领是否正常!!!
  但其他协议不肯定是三次
   


在客户端启动之前,服务端是包管优先于客户端开启的,服务端和客户端一开始都是处理惩罚CLOSED状态,当服务端启动之后就处于LISTEN状态(监听),等待吸收客户端的哀求,当客户端启动之后,客户端向服务端发送哀求,客户端的状态就由LISTEN -> SYN_SENT,当服务端吸收到客户端发来的哀求之后,就会从LISTEN ->SYN-RCVD,给客户端发送一个ACK+SYN的数据包;当客户端吸收端这个ACK数据包之后,就会从SYS_SENT ->ESTABLISTEND状态,同时给服务端发送一个ACK;当服务端吸收到ACK之后,就会从SYN_RCVD ->ESTABLISTEND状态,当客户端和服务器都处于ESTABLISTEND状态,分析双方已经创建乐成毗连。
四次挥手(断开毗连) 

当已经创建毗连的双方必要断开的时间,也是必要类似三次握手的过程,在这个过程中,通讯双方会给对方发送“FIN”和“ACK”如许具有特殊标志位的数据包。与创建毗连时发送的SYN差异,断开毗连必要用FIN数据包。

当主机A想要和主机B断开毗连的时间,就会给主机B发送一个FIN数据包. 当主机B吸收到这个FIN数据包的时间,就会给发送方返回一个ACK确认应答数据包,而且还会返回一个FIN数据包;当主机A吸收到ACK和FIN数据包后,就会给主机B返回一个ACK数据包,当主机B吸收到这个ACK数据包的时间,主机A和B就会断开毗连~
那么,这里主机B返回ACK和FIN数据包的时间,能不能和三次挥手那样呢?将ACK数据包和FIN数据包合一起一次性发送呢?
着实是不可以的,ACK数据包和SYN数据包都是由操纵体系内核来操纵发送的,而FIN的触发则是由应用步伐通过调用close/历程退出来触发的~由于FIN数据包是由用户态操纵发送的,中心必要颠末怎么样的逻辑,我们是不知道的,以是什么时间调用到close方法我们也是不知道的。

 这里四次挥手断开毗连和三次握手创建毗连另有地方差异,这里当主机A收到主机B发来的ACK数据包的时间不跟创建毗连的时间主机A发完ACK后就立刻创建毗连,四次挥手当主机A收到主机B传来的ACK和FIN数据包的时间不会立刻和主机B断开毗连,而是会等待一段时间后再和主机B断开毗连。
为什么主机A在吸收到ACK和FIN包后,还必要等待一段时间之后再断开毗连呢?
假如主机A在吸收到主机B传来的ACK和FIN数据包后,在给主机B发送ACK数据包的时间就断开毗连,那么当主机A发送的ACK丢了咋办?此时假如主机B在等待一段时间后没有继承到主机A发送的ACK数据包,那么就会触发超时重传机制,给主机A发送ACK和FIN数据包,但是此时由于主机A已经和主机B断开了毗连,主机A再也吸收不到主机B发送的数据包,也就不会返回ACK数据包。当主机B重传频频后发现主机A仍然没有回应,此时主机B就会自动放弃这个TCP毗连。正确的来说是触发了TCP的重传毗连操纵。TCP起首会实验举行“复位/重置 毗连”,发送一个特殊的数据包“复位报文”,这个复位报文的RST标志位为1,假如这个复位报文也没有获取到回应,那么TCP就会单方面放弃毗连。

   想一下,为什么这里的TIME_WAIT为什么是2MSL?
  

  • MSL是TCP报文的最大生存时间,因此TIME_WAIT一连2MSL的话,就可以或许包管两个传输方向上的尚未被吸收或迟到的报文段都已经消散(否则服务器立刻重启,大概会收到来自上一个历程的迟到的数据,但是这种数据很大概是错误的);
  • 痛死也是在理论上包管末了一个报文可靠到达(假设末了一个ACK丢失,那么服务器时机重发一个FIN,这时固然客户端的历程不在了,但是TCP毗连还在,仍然大概重发LAST_ACK);
TCP状态转移图 

 TCP干系状态:


  • CLOSED:TCP毗连的初始状态,没有举行任何毗连运动,当一个毗连关闭后就会举行此状态。
  • LISTEN:服务器处于监听状态,等待吸收客户端的毗连哀求。
  • SYN_SENT:客户端向服务端发送了一个SYN同步报文,哀求创建毗连,客户端发送完SYN就进入此状态。
  • SYN_RCVD:服务端吸收到客户端的SYN报文后,给客户端发送SYN+ACK报文后进入此状态。
  • ESTABLISHED:双方乐成创建毗连,可以传输数据;当客户端吸收到服务器的ACK+SYN报文后,给服务端发送一个ACK后就进入此状态。
  • FIN_WAIT_1:客户端给服务端发送了FIN(制止)报文,哀求关闭毗连,客户端发送FIN后进入此状态。
  • FIN_WAIT_2:客户端吸收到了服务端发送的ACK报文,等待服务端发送的FIN报文,此时客户端就会进入此状态。
  • CLOSE_WAIT:服务器吸收到客户端的FIN报文,并给客户端发送ACK报文后进入此状态。
  • LAST_ACK:服务端给客户端发送了FIN报文,并等待客户端的ACK报文,此时服务端进入此状态。
  • CLOSING:客户端和服务器险些同时发送FIN报文,进入此状态,比力少见。
  • TIME_WAIT:客户端收到了服务端发送的FIN报文,而且给服务端发送ACK报文,等待2MSL后关闭毗连。当客户端发送ACK报文后进入此状态。(2MSL是为了确保末了一个报文可以或许被服务端吸收到~)。
4.滑动窗口

提到滑动窗口,大概各人都比力认识,有类算法题就是使用了滑动窗口的头脑来办理的,算法中的滑动窗口就是鉴戒了TCP的滑动窗口。
由于TCP是一个可靠传输的通讯协议,以是在传输的时间服从就比力低,为了办理TCP传输服从慢的题目,TCP中采取了几个机制来优化TCP传输慢的题目。

对于这种一发一送的方式,显着服从许多,但是假如我们一次发送多条数据,就可以大大进步传输服从了(着实就是将多个段的等待时间重叠在一起)。
 
   滑动窗口就是指发送方在发送数据的时间会指定一个窗口巨细的数据,在这个窗口内的数据不消非要等上一个发送的数据吸收到ACK数据包后才继承发送数据,而是当这个数据发送完之后,继承发送下一个数据包,直到这个窗口中全部的数据包都发送了之后才会进入等待TIME_WAIT,等待吸收方发送的ACK数据包,如许比一发一收的服从要高上不少。
  

在滑动窗口的时间,着实也是会出现丢包的题目标,分为两种环境:
   

  • 吸收方返回ACK数据包时丢包
  • 发送方发送的数据包丢失 
 对于这种环境,那么吸收方有须要重传ACK数据包吗?
   着实是没有须要的,不必要做任那边理,由于我们这里是采取了滑动窗口,那么肯定是批量发送数据,批量发送ACK,对于多个ACK,不大概全部丢包。确认序号表现的是渴望下次继承到的数据的第一个序号,可以明白为就是在确认序号之前的数据都已经被吸收到 。我们看上图,这里固然1001序号丢了,但是2001到达了发送方,发送方吸收到2001,分析2001之前的数据吸收方都已经吸收到了,分析后一个ACK可以或许涵盖前一个ACK的意义。
  
我们可以看到1001-2000的数据包在传送的过程中丢包了,那么吸收方就不会返回带有2001确认序号的ACK数据包,当吸收2001~3000的数据包的时间,正常来说主机B必要返回一个带有3001确认序号的ACK数据包,但是这里由于前面主机B没有吸收到1001~2000之间序列号的数据包,而我们知道在读取数据时是必要与主机A发送的数据序次划一,以是在反面没有吸收到1001~2000间序列号的数据包时,会不绝向主机A返回带有1001确认序号的ACK数据包。当发送方发现收到了三次1001确认序号的时间就会心识到是不是以1001序号为起始序号的数据包丢失了,此时发送方就会重发这个丢失的数据包。这种可以或许快速辨认出哪个数据丢包,而且针对性的重传,其他序次到达的数据都无需重传,这种重传叫做“快速重传”,可以以为是“滑动窗口”下搭配的超时重传~
当发送方重发这个10001~2000的数据包而且可以或许被吸收方乐成吸收到,那么吸收方下次返回的就不会一个1001确认序号的ACK数据包,而是会返回一个带有准确简直认序号的ACK数据包。看上图,由于在20001~7000的数据包已经在前面发过,而且被吸收方乐成吸收,以是下次索要的数据包就是7001序号开头的数据包。
那么窗口是不是越大越好呢?着实不是的,假如窗口太大,传输服从就会太快了,导致吸收方在短时间内继承不外来,那也会发生丢包的征象,那么我们假如来控制窗口的巨细呢?
这里我们就必要用到另一个机制---流量控制。 
5.流量控制

TCP协议中的流量控制机制是确保数据传输过程中不会导致吸收方缓冲区溢出的告急机制。流量控制是根据吸收方的吸收本领来制约发送方的发送速率,从而制止数据丢失大概拥塞
当吸收方吸收到发送方发来的数据包时,吸收方会将这个数据包放到吸收缓冲区中,而且将继承缓冲区的剩余空间巨细通过ACK数据包发送给发送方告诉发送方我还可以容纳多大的数据,而且发送方下次发送的数据不能高出可以容纳的数据巨细。

这里着实类似于生产者斲丧者模子,发送方就相当于生产者,吸收方就相当于斲丧者,而吸收缓冲区就相当于一个壅闭队列(Blocking Queue)。
在上图中,主机A第一次向B发送一个数据包,主机B在吸收到数据包后,会将B缓存区中剩余的空间3000通过ACK数据包发送给主机A。当主机A吸收到ACK数据包后,就能知道主机B的吸收缓冲区还可以容纳多大的数据,那么A就会将窗口巨细设置为3000。
当B吸收到主机A发送的数据包后,由于前面的数据还没有处理惩罚完,就会将这次主机A传过来的数据包存放到B的吸收缓存区中,此时吸收缓冲区的巨细就为0,B会将此时缓冲区的巨细通过ACK数据包发送给主机A;当主机A吸收到ACK数据包后,就能知道此时吸收缓冲区为0,主机A就进入TIME_WAIT状态,不再传输数据包,而是等待主机B处理惩罚完一些数据,等吸收缓冲区中还可以容纳数据后,等主机B发过来ACK数据包来关照窗口更新。
假如高出了等待时长,还没有吸收到主机B发送的窗口更新关照的ACK数据包,那么主机A就会发送一个窗口探测包,探测包重要是为了让主机B返回一个携带缓冲区巨细的ACK数据包,假如返回的ACK数据包表现吸收缓冲区另有空间,那么主机A就会以该剩余空间巨细作为窗口的巨细发送数据报给主机B,若返回的ACK数据包表现吸收缓冲区剩余空间为0,那么主机A就继承等待。
主机B剩余的吸收缓冲区的巨细会记载在TCP报头的 16位窗口巨细 中~(只有在ack为1时才华表现剩余的吸收缓冲区巨细)

16位比特位,那么这个窗口巨细能表现最大就是64kb吗?
着实不是的, 在选项中,我们可以设置一个特殊的选项“窗口扩展因子”,来表现窗口巨细*2的多少次方。
流量控制是通过反馈吸收方的吸收本领来制约发送方的发送本领,但是在网络传输的过程中,我们不光要思量发送方发送本领和吸收方的吸收本领,而且还必要思量在传输链路上全部大概颠末的节点的吸收本领。那么我们就必要使用拥塞机制来处理惩罚传输路径中心节点的吸收本领。
6.拥塞控制

拥塞控制机制是确保网络资源公道分配的关键技能之一。目标是为了防止网络中的数据传输量远超于网络的处理惩罚本领,从而制止大概淘汰网络拥塞征象
TCP引入了慢启动 机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定多大的速率传输数据。

   

  •  慢启动 刚开始发送数据,拥塞窗口会很小,用一个很小的速率来发送数据
  • 不丢包,增大窗口巨细(指数增大)
  • 增长到肯定长度后,到达某个指定的阈值,此时纵然没有丢包,也会制止指数增长,变长线性增长
  • 线性增长,也会让发送速率越来越快,到达某个环境下,就会出现丢包
  • 假如出现丢包,那么就会回到一个新的sstresh值,继承举行线性增长,形成动态平衡
 拥塞控制是类似一个不绝试错的过程,假云云时窗口巨细不会发生丢包的征象,那么下次传输数据的窗口就会越来越大;假云云时窗口巨细在传输数据的时间发生丢,那么下次传输数据的时间窗口就会缩小。 
总的来说:
   流量控制是站在吸收方的视角来限定发送方的传输速率的;
  拥塞控制是站在传输链路的视角来限定发送方的传输速率的。
  7.延伸应答

延伸应答机制是进步网络传输服从的一种计谋,延伸应答机制答应吸收方不消立刻发送应答,而是等一段时间后再发送确认应答(ACK),从而淘汰在网络中传输的ACK数据包的数量,从而来节流带宽,进步网络传输速率。
简朴地来说,主机B在吸收到主机A发送的数据包后,一样寻常会立刻给发送方返回一个ACK数据包,在ACK数据包中来告诉发送方我的吸收缓冲区还可以或许容纳多大的数据。假如立刻返回的话,大概此时吸收端处理惩罚掉吸收缓存区的数据大概比力少,此时若发送ACK数据包给发送方,那么发送方的窗口大概也比力小。但是假如我们让ACK晚一点发送给发送方,那么主机B此时可以或许处理惩罚的数据就越多了,从而让吸收缓冲区可容纳空间变大,此时返回ACK数据包给主机A中,那么下次主机A可以或许发送数据的窗口也就可以更大一些,从而进步传输服从。

 通过延伸应答,应用步伐可以或许更多的数据,使得吸收缓冲区中的剩余空间更大,从而让发送数据的应用步伐可以或许获取到一个更大的窗口。
固然,也不是全部的数据包都可以或许延伸应答。
   

  • 数量限定:每隔N个包就应答一次;
  • 时间限定:高出最大延伸时间就应答一次。
详细的数量和超时时间,依操纵体系差异也由于差异;一样寻常N取2,超时时间取200ms;
  8.捎带应答

TCP的捎带应答是创建在延伸应答之上的,进步传输服从的机制。当发送端发送哀求给吸收端后,吸收端的内核不会立刻返回ACK(确认应答报文)给发送端,而是会等一段时间,等吸收端处理惩罚完数据并盘算出相应,将相应和ACK归并为一个数据包发送给发送端。
原来的数据的传输过程

使用捎带应答传输数据
 
   正常来说,ack和相应是差异的机遇的,无法归并,但是由于捎带应答是创建在延伸应答之上的,延伸应答就会让ACK返回的时间今后延伸,如许一来,发送相应的操纵就大概可以赶的上,就可以归并为一个数据包发送。
  

   9.基于字节流

在前面,我们已经知道了TCP是基于字节流传输的,既然是基于字节流传输的,那么每次可以传输数据的字节数都是可以厘革的。
当发送方给吸收方发送多个数据报后,由于另一方大概在处理惩罚在处理惩罚数据,此时吸收到的数据就来不及处理惩罚,就会存放到吸收缓存区中,但由于TCP是面向字节流传输的,吸收方(站着应用层角度)并不能区分出从那边开始到那边竣事,是一个完备的应用层数据包,这就是所谓的“粘包”题目。

 那么我们怎样办理“粘包题目”呢?
   

  • 对于变长的包,可以指定分隔符,我们可以在包和包之间使用明白的分隔符(应用层协议,不与正文辩论即可)

  • 对于变长的包,可以在包头位置,约定一个包总长度的字段,从而知道了包的竣事位置

  • 对于定长的包,包管每次都按固定巨细读取即可。
 思索:对于UDP协议,是否也存在着“粘包题目”呢?
   

  • 对于UDP来说,假如还没有上层交付数据,UDP的报文长度仍然在。同时,UDP是一个一个把数据交付给应用层,就有很明白的数据边界。
  • 站在应用层的角度,使用UDP的时间,要么收到完备的UDP报文,要么不受,不会出现“半个”的环境。
10.非常环境的处理惩罚



  • 历程瓦解。当历程非常瓦解的时间/正常竣事时,此时操纵体系都可以或许采取开释对应的PCB(历程控制模块),TCP的文件形貌符就会自动开释,x相当于调用了close()方法。此时瓦解的历程上的通讯方就会触发发送FIN,当对方吸收到FIN的时间,就会返回ACK+FIN,然后瓦解的历程上的通讯方就会再发送一个ACK,也就是正常的四次挥手。(TCP毗连是独立于历程之外的
  • 主构造机(正常流程的关机)。对于这种正常流程的关机,操纵体系会先实验逼迫竣事全部的用户历程,然后再进入关机流程。在逼迫竣事全部历程的时间,也是会举行1的操纵。但是这里有一些地方与1环境差异,假如在体系关闭之前通讯端吸收到ACK+FIN,并返回了ACK,那么就实验了完备的四次挥手;但假如关机主机上的通讯端在继承到ACK+FIN之前就关机了,那么这个端就不会返回ACK,而另一端在等一段时间后就会触发超时重传频频都没有吸收到ACK的话,就会向该端发送一个“复位/报文段”,这个“复位/报文段”的RST标志位设为1,假如这个段也没有收到回应的话,就自动放弃这个毗连。
  • 主机掉电。对于这种环境,主机是来不及竣事历程,也来不及发送FIN数据包的,主机就直接停机。
  

  • 假如是发送方A掉电,那么吸收方B此时就不知道A什么时间给我发数据,但是由于TCP提供了心跳包这种机制,吸收方B会周期性的给发送方发送一个心跳包,假如心跳包收到了回应,分析对端存在世;假如对端没有回应而且发送了频频都没有回应,那么吸收方B就会放弃这个毗连。
  • 假如是吸收端B掉电,那么发送方A就会等待吸收方发送的ACK数据包,假如一段时间之后还没有吸收到ACK的话就会触发超时重传,当重传频频后照旧没有吸收到ACK的话,发送方A就会触发重置毗连,给吸收方发送一个“复位报文段”,假如照旧没有吸收到回应的话,发送方A就会放弃这个毗连。


  • 网线断开。与主机掉电类似,假如发送方在传输数据的时间网络断开,那么就会触发超时重传->重置毗连RST->单方面断开;假如是吸收方,就会给发送方发送心跳包->重置毗连->单方面开释毗连。
TCP心跳机制
TCP心跳机制是一种用于检测TCP毗连是否正常的机制。通过周期性地发送心跳包来表明发送方仍然存在包的内容一样寻常没有什么特殊的规定,都是很小的包,大概只包罗包头的一个空包。心跳包重要也就是用于长毗连的保活和断线处理惩罚。
TCP心跳机制有两种实现方案:


  • 客户端发送心跳包:客户端定时向服务器发送心跳包,以告知服务器自己仍然在线。服务器在收到心跳包后,会复兴一个确认包给客户端。假如客户端在肯定时间内没有收到服务器简直认包,则以为毗连已断,必要采取相应的步伐,如重新毗连或关闭毗连。
  • 服务器发送心跳包:服务器也可以定时向客户端发送心跳包,以检测客户端是否在线。客户端在收到心跳包后,会复兴一个确认包给服务器。假如服务器在肯定时间内没有收到客户端简直认包,则以为客户端已断线,必要采取相应的步伐,如关闭毗连或关照客户端重新毗连。
小结 

以上就是TCP10个机制的内容讲授咯,是不是很复杂呢?
重要是为了包管可靠性,同时又尽大概的进步性能! 
可靠性


  • 校验和
  • 序列号
  • 确认应答
  • 超时重发
  • 连继承理
  • 流量控制
  • 拥塞控制
进步性能


  • 滑动窗口
  • 快速重传
  • 延伸应答
  • 捎带应答
口试题:怎样使用UDP实现可靠传输?
   

  • 引入序列号,包管数据序次;
  • 引入确认应答,确保对端收到了数据
  • 引入超时重传,假如隔一段时间没有应答,就重发数据。
  • 还可以引入滑动窗口、流量控制、拥塞控制等...


以上就是本篇全部内容,如有不敷,接待指正~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表