传输层---TCP协议

时间:2024-03-25 21:15:40

1.TCP协议段格式

传输层---TCP协议

源端口号/目的端口号:知道数据从哪进程中来,要到哪个进程中去

32位序号/32位确认序号:传输数据时按字节进行编号,序号保证数据按序到达,而双方都需要确认,所以有序号和确认序号

4位首部长度:将报头与有效载荷进行分离。4位表示的最大数据是15,则头部最大长度=15*4=60。

6位标志位:

    URG:紧急指针标志位

    ACK:确认标志位。ACK=1,确认报文。

    PSH:提示接收端立即将数据从缓冲区中读走

    RST:对方要求重新建立连接,将携带RST标识的称为“复位报文段”

    SYN:建立连接请求,用于三次握手,将携带FIN标识的称为“同步报文段”

    FIN:断开连接请求,用于四次挥手,将携带FIN标识的称为“结束报文段”

16位窗口大小:发送数据方的接收缓冲区大小

16位校验和:校验数据是否正确

16位紧急指针:标识紧急数据,表名有些数据需要优先被上层处理

2.TCP特点

(1)连接

(2)可靠

(3)面向字节流

3.TCP如何保证可靠性

3.1 序号、确认应答

(1)TCP将每个字节的数据进行了编号,这个编号就是***

(2)当一端给另一端发送带有序号的数据,另一端接收后,会返回一个携带一个确认序号的应答报文,表示这个序号之前的数据我已经接受,下一个你要发送的数据序号从确认序号开始。

传输层---TCP协议

 

3.2 连接管理

​TCP的在正常情况下,三次握手建立连接,四次挥手断开连接(在上一篇博客中有详解)

3.3 超时重传

(1)丢包问题:在数据传输过程中,可能因为网络拥堵等原因导致接收端没有收到发送端发送的数据,或者发送端没有收到接收端的确认应答,此种现象即丢包问题

(2)超时重传

超时重传有两种情况:

第一种情况是发送端发送的数据在传输过程中丢包了,接收端没有收到发送端发的数据,在一个特定时间内发送端没有收到接收端的确认应答ACK,发送端就重新发送数据。

传输层---TCP协议

第二种情况是发送端发送的数据接收端已经接受并发送了确认应答ACK段,但在传输过程中ACK段丢了,从而在特定时间内发送端也没有接收到接收端的确认应答ACK,发送端就重新发送数据。

但是第二种情况发生的发生会导致接收端收到很多重复的数据。为了去重,TCP协议通过***识别出重复的包并对相同的数据包进行去重。从而保证数据能正确被对方接受,并保证了可靠性。

 

传输层---TCP协议

(3)超时时间

  • 超时时间的设定不能太长,太长使得等待时间变长,影响整体传输效率;超时时间也不能太短,太短使得接收端收到了很多重复数据。
  • TCP为了提供高性能的通信,一般操作系统会动态计算这个最大超时时间。
  • 在Lunix中超时以500ms为一个单位进行控制,每次超时重发的时间是500ms的整数倍。如第一次发送得不到回应,过500ms后重发数据;重发后仍得不到回应,过500ms*2后重发;重发再得不到回应,500ms*4后重发...依次类推,以指数倍的形式增长。
  • 当重发次数超过一定的限制的时候,则TCP认为网络或对端主机出现异常,强制关闭连接。

3.4流量控制

(1)发送端根据接收端的处理能力,来决定发送端的发送速度,这个叫做流量控制

(2)接收端将自己的滑动窗口大小告诉发送端,发送端就知道对方的接收能力,从而控制自己的发送速度。滑动窗口越大,网络吞吐量越大。

(3)当接收缓冲区满了之后,就将窗口设置为0,发送端也不再发送数据。但发送端需定期发送一个窗口探测数据,来获得接收端的窗口大小,从而确定下一次再什么时候可以再发送数据。

传输层---TCP协议

(4)有流量控制的原因

接收端的接收缓冲区接收数据的能力有限,一旦接收缓冲区快满或已经满了的时候,发送端再发送的数据就会导致对方接收缓冲区的数据接受不下,从而导致丢包。但是这种情况并不会再重传数据,从而导致一些数据丢失,无法保证TCP的可靠性,所以需要流量控制。

3.5 拥塞避免

1.概念:​网络中一些链路的缓存或处理能力有限,当网络的需求大于他们的处理能力的时候,就会出现一些问题,从而需要对传入到网络上的数据加以控制,这就是拥塞避免。拥塞控制由网络状态的拥堵情况和接受端的窗口大小决定。

2.拥塞控制过程

①慢启动:刚开始时定义拥塞窗口的大小为1,每收到一个ACK,拥塞窗口的值加1直到拥塞窗口的值等于慢启动的阈值就不再按照这种方式。但是这种形状像指数的形式,我们会想指数增长不是很快么,为什么叫做慢启动,因为慢启动只是表示初始很慢。 

②当拥塞窗口的数量达到慢启动的阈值之后,此时用到拥塞避免算法,采用线性增长的方式,也就是加法增大,一直增长到使得网络出现拥塞的便不再增长; 

③当网络出现拥塞之后,又采用拥塞避免算法的“乘法减小”将拥塞窗口的值变为1,将新的慢启动的阈值变为上一次的一半,然后重复上面的过程。 

 

例:假设TCP拥塞控制的AIMD算法中,慢开始SST1的阈值设置为16,当拥塞窗口上升到24时,发送端检测超时,TCP使用慢开始与拥塞避免。试给出第1次到第15次传输的拥塞窗口

传输层---TCP协议

传输层---TCP协议

4.TCP如何提高性能

4.1 滑动窗口

  • 确认应答一收一发性能较差,为提高效率,可以一次发送多条数据,提高性能。
  • 窗口大小指的是无需等待确认应答而可以发送的数据的最大值。
  • 发送前四个段时,无需等待ACK,直接发送
  • 收到第一个ACK后,滑动窗口向后移动,继续发送第五个段的数据;依次类推
  • 窗口越大,网络吞吐量越大

传输层---TCP协议

若出现丢包问题,则重传。

(1)数据包抵达,ACK丢失:这种情况可通过后续的ACK进行确认

传输层---TCP协议

(2)数据包丢失

传输层---TCP协议

 

  • 若重述过程中某一数据包丢失,则发送端会一直受到要发送这段报文的ACK。如上述图中发送端会一直周到1001这样的ACK
  • 当发送端接收到3次这样的重复ACK时,发送端就将对应的数据段重新发送。即发送端重新发送1001-2000的数据段
  • 接收端接收到1001-2000的数据段时,给发送方回一个7001的ACK。因为2001-7000的数据接收端已经收到,被放在了接收缓冲区

以上这种机制被称为:快重传

(3)快重传与超时重传的比较

快重传效率比较高,但是快重传需要收到多次对以前报文的重复确认才会重传。如果数据包较少,有可能都不会收到多次重复确认,就不会重传,但是超时重传超过一定时间还没有收到ACK一定会重传。

4.2 延时应答

(1)如果发送端发送一个数据包之后接收端立即返回一个ACK应答,这时返回的窗口可能比较小。因为接收端缓冲区的数据还没有被上层处理。但是如果接收端等待一段时间,有可能上层就把数据从接收缓冲区里面读走了,那么此时接收端再返回一个ACK报文里面窗口就比直接返回的窗口要大。 

(2)窗口越大,吞吐量就越高,传输效率也就越高。 

(3)不是所有的报文都能够延迟应答,要超过最大延迟时间就必须立即应答一次或者隔一些包就得应答一次

4.3 捎带应答

(1)在延迟应答的基础上的,客户端服务器一收一发意味发送方给接收端发数据时,接收端也会给服务器回数据。因为没有延迟应答那么ACK就要立即被返回

(2)当发送方给接收方发送数据时,接收方会给发送方发送一个ACK报文,有时候接收方也会给发送方发送一些数据包,此时我们的ACK就可以乘着接收方发送的数据包回来,这样就将两次发送数据包只用一次发送就可以,这样就可以提升效率。 

5. TCP的面向字节流

  • TCP创建一个套接字,同时在内核创建一个接收缓冲区与发送缓冲区。由于缓冲区的存在,TCP的读写不需要一一匹配。如在写100个字节的数据时,可以一次性写100个字节,也可以每次写一个字节写100次,只要最终将数据写完就可以
  • 因为TCP面向字节流,读写数据较灵活,一次可读一个也可以读多个,有可能导致无法读取完整的应用成数据包,这种现象为粘包问题。
  • 粘包问题的解决办法:明确边界(使用分隔符、指定数据包长度等)