TCP——可靠传输协议

本文深入剖析了TCP/IP协议中的TCP传输控制协议,重点讲解了其面向连接的可靠性、序列号、确认应答、重传策略(包括超时重传和快速重传)、流量控制(滑动窗口)以及排序机制。还介绍了选择确认机制SACK、窗口大小管理和校验和的使用,展示了TCP如何确保数据的可靠传输和高效传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


图片来源于网络

TCP协议

传输层主要有两个性质不同的协议:TCP传输控制协议和UDP用户数据报协议。

其中TCP协议是一个面向连接的、可靠的传输协议
TCP的特点:

  1. 面向连接:TCP是一种面向虚连接的协议,通信双方在数据传输前需要建立连接,传输完成后再释放连接。这种连接的建立和释放过程确保了数据的可靠传输。并且每条TCP连接有且仅有两个端口 ,即每一条TCP连接都是点对点的。

  2. 可靠性:TCP通过序列号、确认应答、重传机制等方式来确保数据的有序可靠传输。如果数据包在传输过程中丢失或损坏,TCP会重新发送这些数据包,以保证数据的完整性和可靠性。

  3. 流量控制:TCP使用滑动窗口机制来进行流量控制,确保发送方和接收方之间的数据传输速度匹配,避免数据丢失或拥塞。(重点关注双方的的窗口大小决定收发能力)

  4. 拥塞控制:TCP通过拥塞控制算法来避免网络拥塞,保证网络的稳定性和公平性。TCP会根据网络的拥塞程度调整数据传输速率,以避免造成网络拥塞。(重点关注网络整体拥塞情况)

  5. 面向字节流:TCP是一种面向字节流的协议,它将应用层传输的数据视为一连续的字节流,而不是分割成固定大小的数据包。这种特性使得TCP可以更灵活地处理数据传输。

TCP报文段

在这里插入图片描述

序号(Sequence Number)

TCP传输过程中,传输报文中的数据部分的每一个字节都有它的编号。发送方发送数据时,都需要标记序号。

序号的语义与SYN控制标志的值有关。

(1)在建立连接阶段时,SYN = 1,此时的序号为初始序号ISN((Initial Sequence Number),通过算法来随机生成序号。

(2)在数据传输正式开始时,SYN = 0,第一个报文的序号为 ISN + 1,后面的报文的序号,为前一个报文的SN值+TCP报文的净荷字节数。(不包含TCP报头)

确认序号(Acknowledgment Number)

确认序号,有两个含义
(1)表示该确认序列号之前的序列号的字节数据已全部接收
(2)表示接收端期望接收到的字节序列号

只有控制标志的ACK标志为1时,数据帧中的确认序号ACK Number才有效。
TCP协议规定,连接建立后,所有发送的报文的ACK必须置为1,也就是建立连接后,所有报文的确认序号有效。如果是SYN类型的报文,其ACK标志为0,故没有确认序号。

数据偏移

用来指示TCP报文头部的长度。这个字段占据TCP报文头部的第12-15个字节位置,它指示了TCP报文头部的长度,因为TCP报文头部中可能包含选项字段。选项字段的存在会导致TCP报文头部的长度变化,而数据偏移字段则用来指示TCP报文头部的实际长度。以便接收方能够正确解析整个TCP报文。(TCP报文最少20字节,最多60字节,若少于20字节,则认为该数据段错误,丢弃)

保留字段

暂时没有用处,仅为了保持TCP报文头部的结构一致性,以便未来协议的演进和扩展。

控制标志

TCP报文头部中的控制标志(Control Flags)用于控制和管理TCP连接的建立、维护和终止过程。共占据6个比特位,每个比特位对应一个特定的控制标志。

控制标志作用
URG(紧急指针位)URG=1,表明紧急数据的存在,紧急数据通常用于高优先级的数据传输,应尽快交付应用程序处理。与紧急指针配合使用
ACK(确认位)当ACK=1时,确认序列号字段有意义。在TCP连接建立后,所有传输的报文段都必须将ACK置为1
PSH(推送位)请求接收端立即将缓冲区内所有数据推送给应用层,而不是等到缓冲区满或者等待更多数据
RST(复位)用于强制关闭连接,通常用于指示连接出现严重问题或者异常情况
SYN(同步位)用于建立连接,表示发起一个连接请求
FIN(结束位)表明此报文段发送方数据已全部发送完毕,要求释放连接

窗口大小

指发送方可以不需要接收确认报文,就可以连续发送的数据最大量。

校验和

在TCP协议中,校验和是TCP报文头部和数据部分的校验和,用于检测数据在传输过程中是否被篡改或损坏。校验和的计算方法是将数据按照一定的规则进行求和,并将结果取反作为校验和字段的值。

接收端在接收数据时会重新计算校验和,并将计算得到的校验和与报文中的校验和进行比较,以判断数据是否正确。

如果接收端计算的校验和与发送端发送的校验和不一致,接收端会丢弃这个数据包并请求重新发送,以确保数据的完整性和正确性。

紧急指针

在TCP协议中,紧急指针(Urgent Pointer)是一个16位的字段,用于指示紧急数据的位置。当发送端需要发送紧急数据时,会设置紧急指针,通知接收端在该该数据段中含有紧急数据,需要优先处理。

紧急指针通常与紧急标志(Urgent Flag)一起使用,紧急标志位于TCP头部的控制位中。当紧急标志被置为1时,紧急指针字段变得有效,接收端会立即处理紧急数据,而不按照正常的顺序处理数据流。

紧急指针的主要作用是在某些情况下,允许发送端发送一些优先级较高的数据,以便在紧急情况下快速响应。例如,在一些应用中,紧急数据可能包含紧急命令或重要信息,需要被尽快处理。

紧急指针并不是经常被使用的TCP特性,而是在某些特定情况下才会被应用。大多数情况下,TCP数据是按照顺序传输和处理的,而紧急指针则提供了一种特殊的机制,用于处理紧急数据。

选项

最大报文长度选项(Maximum Segment Size, MSS):

  • 允许通信的两端协商并设置最大的数据段大小,MSS的值通常是根据网络环境和设备的能力来确定的,以避免分段过大导致的数据包丢失或重新传输。
  • 在TCP握手过程中,双方会交换各自支持的MSS值,然后根据双方的最小MSS值来确定实际的MSS值。这有助于优化数据传输的效率和可靠性,避免不必要的分段和重传。
  • MSS=MTU-(IP和TCP头部,通常为40字节)即MSS最大值为1460字节。

时间戳选项(Timestamp Option):

  • 允许发送端在报文中包含时间戳信息,用于测量往返时间(Round-Trip Time, RTT) 和优化数据传输。以便在数据传输和网络通信中进行时间同步、排序等操作。

选择确认选项(Selective Acknowledgement, SACK):

  • 允许接收端向发送端指示已成功接收的数据段范围,而不仅仅是下一个期望的序列号,使发送方只重传丢失的数据段,而不是整个窗口的数据,避免不必要的重传,提高网络传输效率。
  • 在连接建立时,收发两端商量好是使用累计确认机制还是选择确认选项,绝大部分情况启用选择确认机制

窗口值(Window Size):

  • 发送方可以在不收到回复的情况下,发送的最大数据量。

  • 窗口值是由接收方在TCP连接建立过程中通过TCP选项字段传递给发送方的。发送方根据接收方指定的窗口值来控制发送数据的速率,以确保数据不会超出接收方的处理能力。

  • 窗口值的大小可以根据网络状况和接收方的处理能力进行动态调整。

窗口比例选项/窗口扩大因子(Window Scale Option):

  • 扩大窗口大小的比例因子,用于解决TCP窗口大小受限的问题。TCP头部中的窗口字段是16位的,因此窗口大小的最大值是65535字节。在高速网络中,这个窗口大小可能太小了。为了解决这个问题,引入了窗口比例选项。

  • 窗口比例选项允许发送端和接收端协商一个窗口扩大因子,该因子被用来扩大窗口大小的范围。通过这种方式,即使窗口字段本身只有16位,实际的窗口大小可以达到更大的值,以提高数据传输的效率和速度。

TCP可靠的四大机制

TCP具有,确认、排序、流控、重传四大机制

确认机制分为:

  1. 累计确认
  2. 选择确认

重传机制分为:

  1. 超时重传
  2. 快速重传

累计确认机制

  • 当接收方收到一个数据段时,如果该数据段的序列号之前的所有数据段都已经成功接收,接收方会发送一个累计确认,确认收到的最高序列号,以及该序列号之前的所有数据段都已经接收。

  • 如果仅使用累计确认时发生丢包,则接收端只会发送已收到的确认序列号,对双方来说,只有在发送端一定时间后没有收到接收端返回的确认报文,才会使用超时重传机制,进行重传,并且因为使用的是累计确认,发送方会将后续所有数据进行重传(除了有确认回复之外的所有发送过的数据),这样的重传方式,降低了重传效率并浪费了网络资源。
    在这里插入图片描述

选择确认机制

选择确认(Selective Acknowledgment,SACK)是一种TCP协议的扩展选项,用于改进在数据包丢失时的重传效率。通过启用选择确认选项,接收端可以明确告知发送端哪些数据包已成功接收,哪些数据包丢失需要重传。发送端可以根据这些信息有选择性地重传丢失的数据包,而不是重传整个窗口内的数据,从而提高数据传输的效率减少网络资源占用。

选择确认机制的优势:

  1. 更高的重传效率:发送端可以根据接收端提供的具体丢失数据包信息有选择性地进行重传,避免重传已成功接收的数据包,提高重传效率。

  2. 减少网络拥塞:通过减少不必要的重传,选择确认可以减少网络拥塞和带宽浪费。

  3. 更快的恢复速度:选择确认使发送端能够更快地恢复丢失的数据包,从而减少数据传输的延迟。

SACK

当使用选择确认机制时,接收端可以通过 SACK 指令来告知发送端哪些数据包已经成功接收,哪些数据包需要重传。SACK 指令可以指示一个或多个数据段的序列号范围,从而提供更详细的信息给发送端。

D-SACK
  • D-SACK是SACK机制的一个变种,用于指示接收端收到了重复的数据包。
  • 当接收端收到重复的数据包时,它可以使用D-SACK选项向发送端发送重复数据包的信息。
  • 发送端收到D-SACK选项后,可以根据这些信息避免不必要的重传,从而提高重传的效率。
    在这里插入图片描述

超时重传

超时重传是TCP协议中一种基本的重传机制,用于处理丢失的数据包。当发送端发送数据包后,如果在一定时间内没有收到该数据包的确认,发送端会认为该数据包丢失,并触发超时重传机制,重发送该数据包。这样确保了数据包能够最终到达接收端,从而保证了数据的可靠传输。

在超时重传中涉及到RTT,RTO两个数值

RTT(Round-Trip Time)
  • 数据包从发送到接收再到发送端收到确认所经历的时间。RTT时间是根据网络延迟和拥塞情况动态变化的(涉及时间戳)
RTO(Retransmission Timeout)
  • RTO时间则是根据RTT时间来计算的,用于决定何时触发超时重传机制。
  • RTO时间间隔加倍:如果这个数据包的重传超时再次发生,TCP 会将 RTO 时间间隔加倍而不是立即重传。避免增大网络拥堵状况。
  • RTO数值上限:根据 RFC 6298 中的规定,RTO的上限值为 60 秒。这意味着无论经过多少次重传超时,RTO 时间间隔最大不会超过 60 秒。
  • 重传次数限制:TCP 通常也会设置一个最大的重传次数限制(通常为5~10次),以避免无限制地重传数据包。如果达到了最大重传次数限制仍未收到确认,TCP 可能会放弃该数据包,并通知上层应用程序或执行其他处理。
超时重传流程
  1. 数据包发送:
    • 发送端发送数据包到接收端,并启动一个定时器来监视这个数据包的确认情况。
  2. 等待确认:
    • 发送端等待接收端发送确认(ACK)来确认已发送的数据包。
      如果在设定的超时时间内未收到确认,发送端会认为数据包丢失。
  3. 超时处理:
    • 当超时定时器触发,发送端会将丢失的数据包标记为丢失,并将其重新发送给接收端。

虽然超时重传可以确保数据的可靠传输,但过于频繁的超时重传可能会导致网络传输效率降低。因此,TCP协议通常结合选择重传机制(如SACK和D-SACK)更有效地处理丢失的数据包,提高传输效率。

快速重传

快速重传是TCP协议中的一种优化机制,旨在更快地检测和处理丢失的数据包,而不必等待超时定时器到期。当接收端收到一个乱序的数据包时,它会立即发送重复确(Duplicate ACK)给发送端,指示它收到了乱序的数据包。发送端在收到一定数量的重复确认时(通常是3次),就会触发快速重传,即立即重传丢失的数据包,而不必等待超时定时器。

  1. 数据包发送

    • 发送端发送数据包到接收端。
  2. 接收端收到乱序数据包

    • 如果接收端收到乱序的数据包,它会发送一个重复确认给发送端,指示收到了乱序的数据包。
  3. 快速重传触发

    • 发送端在收到后会忽略,但会记录冗余ACK,一般当冗余ACK=3时,(即收到一定数量(通常是3次)的重复确认后),就会认为丢失了某个数据包,因此立即重传该丢失的数据包,而不必等待超时定时器。
  4. 快速恢复

    • 在触发快速重传后,发送端会立即重传丢失的数据包,并继续发送后续的数据。
    • 这样可以更快地恢复丢失的数据包,提高传输效率和减少等待时间。

快速重传机制能够更快地响应丢失的数据包,避免等待超时定时器到期才进行重传,从而提高了TCP协议在面对丢包情况下的传输效率。
在这里插入图片描述

TCP-流量控制机制

流控(Flow Control)是网络通信中一种重要的机制,用于控制数据发送方的发送速率,以确保接收方能够有效处理接收到的数据,防止数据丢失或网络拥塞。在TCP协议中,流控机制通过滑动窗口(Sliding Window)来实现。

窗口:指发送方可以在不接收确认报文的前提下,一次性发送的数据最大量。

接收方会在连接建立之前创建一个接收缓存,用以存放发送方发送的数据。而窗口大小在最初等于接收缓存大小。之后,窗口大小等于缓存大小减去已存在缓存中的数据量(rwnd—接收窗口大小)。

流控机制过程
  1. 接收方通告窗口大小:接收方通过在TCP报文中的窗口字段(Window)通告发送方自己的接收窗口大小,即接收方当前能够接收的数据量。发送方根据接收方通告的窗口大小来控制发送数据的速率。

  2. 发送方滑动窗口:发送方维护一个发送窗口(Send Window),其大小取决于接收方通告的窗口大小和网络状况。发送方只能发送窗口内的数据,确保不会发送超过接收方能够处理的数据量。

  3. 动态调整窗口大小:TCP允许发送方和接收方根据网络条件动态调整窗口大小。接收方可以根据自身处理能力和网络状况调整窗口大小,发送方会根据接收方通告的窗口大小进行发送速率的调整。
    在这里插入图片描述

排序机制

排序机制通常指的是数据包在传输过程中可能会因为网络延迟、拥塞、传输路径不同等原因而导致乱序到达的情况下,接收端需要对这些乱序的数据包进行重新排序,以确保数据的正确性和完整性。

以下是排序机制的一般步骤:

  1. 接收数据包:接收端收到数据包时,会根据数据包的序列号(Sequence Number)来确定数据包的顺序。

  2. 乱序数据包处理:如果接收到的数据包不是按顺序到达的,接收端会将这些乱序的数据包暂时存储起来,等待后续数据包的到达。

  3. 排序数据包:接收端会根据数据包的序列号对存储的乱序数据包进行排序,以确保数据包按正确的顺序重组数据流。

  4. 交付数据:一旦所有乱序数据包都被正确排序,接收端就可以将数据交付给应用程序或上层协议,确保数据的完整性和正确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值