TCP协议快问快答

        本文是快问快答形式,供各位读者快速粗略地了解TCP协议。如果想系统学习,推荐博客https://www.cnblogs.com/xiaolincoding/p/12732052.html。

        本文的主要内容为ChatGpt生成,感谢GPT大大提升了笔者学习的效率。

一、超时重传

1.1 什么是超时重传

        发送端还会根据RTT来设置数据包的超时重传时间。如果在一定时间内(通常是RTT的2-4倍)没有收到接收端的确认报文,发送端会认为数据包丢失,并重新发送该数据包。

1.2 什么是快速重传

        TCP(传输控制协议)的快速重传(Fast Retransmit)是一种用于提高传输性能和可靠性的拥塞控制策略。当发送端检测到可能的数据包丢失时,快速重传机制允许发送端在超时之前立即重新发送丢失的数据包,从而减少了重传等待时间,提高了传输效率。

        快速重传的工作原理主要依赖于TCP的累积确认(Cumulative Acknowledgment)机制和接收端的冗余确认(Duplicate Acknowledgment)报文。当接收端收到一个乱序的数据包时,它会发送一个冗余确认报文,其中的确认序号仍然是期望接收的下一个数据包的序号,而不是乱序数据包的序号。这意味着接收端已经收到了某些数据包,但尚未收到期望的数据包。

        发送端会对冗余确认报文进行计数。当发送端连续收到一定数量(通常是3个)的冗余确认报文时,它会认为期望的数据包已经丢失,并立即触发快速重传,而不是等待超时重传计时器到期。这样可以更快地检测和恢复数据包丢失,提高传输效率。

1.3 什么是选择性确认

        还有一种实现重传机制的方式叫:SACK( Selective Acknowledgment 选择性确认)。

        这种方式需要在 TCP 头部「选项」字段里加一个 SACK 的东西,它可以将缓存的地图发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。

        如下图,发送方收到了三次同样的 ACK 确认报文,于是就会触发快速重发机制,通过SACK 信息发现只有 200~299 这段数据丢失,则重发时,就只选择了这个 TCP 段进行重复。

1.4 什么是重复选择性确认

        D-SACK(Duplicate Selective Acknowledgment,重复选择性确认)是TCP(传输控制协议)中的一种拥塞控制策略,它是SACK(Selective Acknowledgment,选择性确认)的一个扩展。D-SACK的主要目的是通知发送端哪些数据包被重复接收,从而帮助发送端识别不必要的重传,优化拥塞控制算法并提高传输性能。

        在TCP数据传输过程中,由于网络延迟、乱序等原因,接收端可能会收到重复的数据包。当接收端使用SACK机制时,它可以在确认报文中携带D-SACK选项,指示发送端已经收到的重复数据包的序列号范围。这样,发送端可以根据D-SACK信息来判断哪些数据包被重复接收,从而避免不必要的重传,并优化拥塞控制算法。

        D-SACK还可以帮助发送端识别网络中的重复数据包,从而更好地估计网络状况和拥塞程度。例如,当发送端收到多个D-SACK报文时,它可以推断出网络中可能存在乱序或重复传输的问题,并相应地调整拥塞窗口大小和重传策略。

1.5 iOS支持SACK吗

        在iOS系统中,底层的TCP协议栈实现了SACK(选择性确认)功能。iOS开发者通常不需要直接操作底层的TCP协议栈,因为iOS提供了高级的网络编程接口,如URLSession和CFNetwork等,它们已经内置了对TCP拥塞控制策略(包括SACK)的支持。
 

1.3 TCP协议的RTT如何确定

        TCP(传输控制协议)的RTT(往返时延)是指一个数据包从发送端发送到接收端,再从接收端返回到发送端所需的时间。它是衡量网络传输速度的一个重要参数。在TCP协议中,RTT的确定主要依赖于以下几个步骤:​

1. 发送端发送数据包:当发送端有数据要发送时,它将数据分成多个数据包,并为每个数据包分配一个序列号。

2. 接收端确认收到数据包:当接收端收到数据包时,它会检查数据包的序列号,并发送一个确认(ACK)报文,其中包含接收到的数据包的序列号。

3. 发送端计算RTT:发送端在发送数据包时,会记录发送时间(T1)。当收到接收端的确认报文时,会记录接收时间(T2)。然后,发送端可以通过计算T2 - T1来得到RTT。

4. 平滑RTT估计:由于网络传输可能受到许多因素的影响,单次测量的RTT可能存在较大波动。因此,发送端通常会使用一种平滑算法,如加权移动平均(Weighted Moving Average,WMA)或指数加权移动平均(Exponential Weighted Moving Average,EWMA)来估计RTT。

发送端会根据RTT来调整自己的发送速率和超时重传时间,从而提高传输效率和可靠性。

1.4 在三次握手期间,如何判断是否丢包?此时RTT确定了吗?

        在TCP三次握手期间,我们不能直接通过RTT来判断是否丢包,因为在握手过程中,RTT还没有完全确定。然而,我们可以通过超时重传机制来检测握手过程中的丢包。

        在三次握手过程中,如果发送端在一定时间内没有收到接收端的回应,它会认为握手报文丢失,并重新发送握手报文。这个超时时间通常是一个预设值,比如3秒。这个预设值可能并不是很准确,但在握手过程中,我们没有更好的方法来估计RTT。

以下是三次握手过程中可能出现的丢包情况:

1. SYN丢包:如果客户端发送的SYN包在网络中丢失,客户端将等待预设的超时时间。如果在超时时间内没有收到服务器的SYN+ACK回应,客户端会重新发送SYN包。

2. SYN+ACK丢包:如果服务器发送的SYN+ACK包在网络中丢失,客户端将等待预设的超时时间。如果在超时时间内没有收到服务器的SYN+ACK回应,客户端会重新发送SYN包,触发服务器再次发送SYN+ACK包。

3. ACK丢包:如果客户端发送的最后一个ACK包在网络中丢失,服务器会认为连接尚未建立。然而,客户端认为连接已经建立,因此它可能会开始发送数据。当服务器收到数据包时,它会意识到连接已经建立,并继续正常的数据传输。

一旦三次握手成功完成,RTT的计算和更新将在数据传输过程中进行。

二、传输

2.1 什么是MSS

        TCP的MSS(Maximum Segment Size,最大报文段长度)是指TCP协议在传输数据时,每个报文段所能承载的最大数据长度。MSS是一个重要的参数,它决定了TCP报文段的大小以及网络传输的效率。

MSS的值主要取决于以下两个因素:

1. MTU(Maximum Transmission Unit,最大传输单元):MTU是指网络链路层(如以太网、PPP等)所能承载的最大数据包长度。对于以太网来说,标准MTU的值是1500字节。

2. IP和TCP协议的头部开销:IP协议头部的标准长度是20字节,TCP协议头部的标准长度也是20字节。因此,IP和TCP协议的头部总开销是40字节。

        为了确保TCP报文段在网络中的传输不会发生分片(Fragmentation),TCP的MSS通常设置为MTU减去IP和TCP协议的头部开销。例如,对于以太网,MSS的值通常为1500字节(MTU) - 40字节(头部开销)= 1460字节。

        需要注意的是,当网络路径中存在不同MTU的链路时,MSS可能需要进行调整。在TCP连接建立过程中,双方可以通过TCP选项字段中的"MSS"选项来协商MSS值。这样,发送端可以根据接收端所支持的MSS值来调整报文段的大小,从而避免分片和提高传输效率。

2.2 三次握手中为什么需要协商MSS

        在TCP三次握手期间商定MSS(最大报文段长度)的原因主要是为了提高传输效率,避免IP分片,以及确保双方在传输数据时不会超过对方所能接受的最大报文段长度。

1. 提高传输效率:通过在三次握手期间商定MSS,客户端和服务器可以根据底层网络的MTU(最大传输单元)来确定合适的数据报文大小。这有助于提高传输效率,因为较大的数据报文可以减少TCP首部和IP首部的开销,从而更有效地利用网络带宽。

2. 避免IP分片:当数据报文的大小超过底层网络的MTU时,IP层需要进行分片,将大数据包分割成多个小数据包进行传输。IP分片会增加发送端和接收端的处理开销,并可能导致传输效率降低和数据包丢失。通过在三次握手期间商定MSS,客户端和服务器可以确保发送的数据报文不会超过底层网络的MTU,从而避免IP分片。

3. 适应对方的接收能力:不同的设备和网络环境可能具有不同的接收能力。在三次握手期间商定MSS可以确保双方发送的数据报文不会超过对方所能接受的最大长度,从而提高传输的可靠性和兼容性。

2.3 什么是IP分片

        IP分片(IP Fragmentation)是指在IP层将较大的数据包拆分为多个较小的数据包的过程,以适应底层网络的最大传输单元(MTU)限制。当IP数据包的大小超过底层网络的MTU时,就需要进行IP分片,将大数据包分割成多个小数据包进行传输。

        IP分片发生在发送端,当发送端的IP层检测到要发送的数据包大小超过当前链路的MTU时,它会将数据包分割成多个片段。每个片段都有自己的IP首部,并携带原始数据包的一部分。在IP首部中,有一些字段用于表示分片的信息,如标识(Identification)、片偏移(Fragment Offset)和更多片(More Fragments)标志。这些字段用于在接收端将分片重新组装成完整的数据包。

        IP分片可能导致一些问题,如:

1. 效率降低:分片会增加发送端和接收端的处理开销,因为它们需要进行数据包的拆分和重组。此外,分片还可能导致网络中的传输效率降低,因为较小的数据包可能占用更多的带宽资源。

2. 分片丢失:由于IP分片后的数据包在网络中独立传输,如果其中一个分片丢失,接收端将无法重组完整的数据包。这将导致整个数据包需要重新发送,从而降低传输的可靠性。

        为了避免IP分片,可以采取一些措施,如调整TCP的最大报文段长度(MSS),使其适应底层网络的MTU。此外,还可以使用路径MTU发现(Path MTU Discovery)技术,通过在IP首部设置“不分片”(DF)标志,让网络中的路由器返回MTU信息,从而找到一条传输路径上的最小MTU值,以便发送端调整数据包的大小。

2.4 什么是滑动窗口

        滑动窗口(Sliding Window)是TCP(传输控制协议)中用于实现流量控制和拥塞控制的一种技术。滑动窗口允许发送端和接收端在不等待确认的情况下发送多个数据包,从而提高传输效率。同时,滑动窗口也可以动态调整发送速率,以适应网络的拥塞状况。

滑动窗口包括发送窗口和接收窗口两部分:

2.4.1 发送窗口

        发送窗口是发送端维护的一个缓冲区,用于存储已发送但尚未得到确认的数据包。发送窗口的大小决定了发送端在等待确认之前可以发送多少数据包。当发送端收到接收端的确认(ACK)报文时,它会将发送窗口向前滑动,将已确认的数据包从窗口中移除,并将新的数据包加入窗口。发送窗口的大小可以根据接收端的接收能力和网络的拥塞状况进行动态调整。

2.4.2 接收窗口

        接收窗口是接收端维护的一个缓冲区,用于存储已接收但尚未处理的数据包。接收窗口的大小决定了接收端可以接收多少数据包。接收端会在确认报文中携带接收窗口的大小信息,以通知发送端自己的接收能力。当接收端处理完数据包后,它会将接收窗口向前滑动,并将新的数据包加入窗口。

        滑动窗口的主要优点是提高了传输效率,因为发送端和接收端可以在不等待确认的情况下发送和接收多个数据包。此外,滑动窗口还可以实现动态的流量控制和拥塞控制,通过调整发送窗口的大小来适应网络的变化,从而提高TCP传输的性能和可靠性。

2.5 介绍下流量控制

        TCP(传输控制协议)的流量控制是一种机制,用于在发送端和接收端之间平衡数据传输速率,以防止接收端被发送端发送的数据所淹没。流量控制可以确保发送端不会发送超过接收端处理能力的数据,从而提高传输的可靠性和效率。

TCP流量控制主要依赖于滑动窗口(Sliding Window)机制。通过滑动窗口机制,TCP流量控制可以实现以下功能:

1. 防止接收端缓冲区溢出:通过动态调整发送窗口的大小,发送端可以确保不会发送超过接收端处理能力的数据,从而避免接收端缓冲区溢出。

2. 适应网络状况:流量控制可以根据网络的拥塞状况和接收端的接收能力来调整发送速率,从而提高传输效率。

3. 提高传输可靠性:流量控制可以确保发送端在接收端确认之前不会发送过多的数据包,从而减少数据包丢失的风险,提高传输可靠性。

本小节强烈建议查看开头引用的博客的流程图。

2.6 接收窗口耗尽会怎么样

        当接收窗口的缓冲区耗尽时,意味着接收端已经没有足够的空间来存储新接收到的数据包。在这种情况下,TCP流量控制机制会起到作用,防止发送端继续发送数据,从而避免接收端缓冲区溢出。具体表现为以下几个方面:

1. 接收端通知发送端:当接收窗口的缓冲区耗尽时,接收端会在确认报文(ACK)中携带一个接收窗口大小为0的通知,告诉发送端自己暂时无法接收更多的数据。

2. 发送端暂停发送:发送端在收到接收窗口大小为0的通知后,会暂停发送新的数据包,等待接收端处理完缓冲区中的数据并重新通知自己可以接收数据。

3. 接收端处理数据:接收端在处理完缓冲区中的数据后,会重新计算接收窗口的大小,并在确认报文中携带更新后的接收窗口大小,通知发送端可以继续发送数据。

4. 发送端恢复发送:发送端在收到接收端更新后的接收窗口大小通知后,会根据接收窗口的大小调整发送速率,并恢复发送数据。

需要注意的是,在接收窗口缓冲区耗尽的情况下,发送端仍然可以发送一个最小大小的数据包(通常为1字节的数据),以便探测接收端的状态。这样可以避免在接收端缓冲区恢复后出现死锁现象。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值