TCP连接

目录

1.TCP连接如何保证可靠性

2.拥塞控制

3.TCP连接三次握手的过程,为什么是三次,可以是两次或者更多吗?

三次握手过程

为什么需要三次握手

4.TCP连接四次挥手的过程,为什么是四次?

4.1四次挥手过程


1.TCP连接如何保证可靠性

TCP通过差错控制(序列号,数据校验),超时重传,流量控制,拥塞控制等机制,确保了数据传输的可靠性和效率。

  1. 序列号:每个TCP段都有一个序列号,确保数据包的顺序正确。
  2. 数据校验:TCP使用校验来检查数据在传输过程中是否出现错误,如果检测到错误,接收方会丢弃该数据包,并等待重传。
  3. 超时重传:发送方设置一个定时器,如果在定时器超时之前没有收到确认,发送方会重传数据。
  4. 流量控制:TCP通过滑动窗口机制来进行流量控制,确保接收方能够处理发送方 的数据量。
  5. 拥塞控制:TCP通过算法如慢启动,拥塞避免,快重传,和快恢复等,来控制数据的发送速率,防止网络拥塞。

2.拥塞控制

TCP拥塞控制是通过一系列算法动态调节发送端速率,避免网络过载的核心机制。其实现逻辑可拆解为四个阶段的算法协同,结合网络状态反馈形成闭环控制。

  1. 慢启动(Slow Start):网络容量的探测阶段。发送端从较小的拥塞窗口(CWND,初始通常为1-2个MSS)开始,每收到一个ACK就将CWND翻倍,呈指数型增长,快速探测网络可用带宽。
  2. 拥塞避免:平稳增长的保护阶段。CWND超过ssthresh后(慢启动阈值)改为每轮次仅增加一个MSS,避免突发流量导致拥塞。
  3. 快速重传:丢包的快速响应。若通过三次冗余ACK检测到丢包(说明严重网络拥塞),就会触发快速重传丢失的数据包,减少延迟。
  4. 快速恢复:拥塞后的快速恢复。发送端完成快速重传后,不直接进入慢启动,而是执行以下操作:1.将ssthresh设为当前CWND的一半;2.将CWND设为ssthresh + 3个MSS(假设三次冗余ACK对应3个已确认的数据包;3.开始线性增长(每轮次 + 1MSS),加速恢复传输效率。
  5. 与超时重传的区别:快速恢复避免了慢启动的指数级回退,适用于网络轻度拥塞场景,减少性能损失。

3.TCP连接三次握手的过程,为什么是三次,可以是两次或者更多吗?

三次握手过程

  • 第一次握手:客户端向服务器发送一个SYN(同步序列号)报文,请求建立连接,客户端进入SYN_SENT状态
  • 第二次握手:服务器收到SYN报文后,如果同意建立连接,则会发送一个SYN-ACK(同步确认)报文作为响应,同时进入SYN_RCVD状态。
  • 第三次握手:客户端收到服务器的SYN-ACK报文后,会发送一个ACK(确认)报文作为最终响应,之后客户端和服务器都进入ESTABLISHED状态,连接建立成功。

为什么需要三次握手

通过三次握手,客户端和服务器都能够确认对方的接收和发送能力。第一次握手确认了客户端到服务器的通道是开放的;第二次握手确认了服务器到客户端的通道是开放的;第三次握手则确认了客户端接收到服务器的确认,从而确保了双方的通道都是可用的。

而如果仅使用两次握手,服务器可能无法确定客户端的接收能力是否正常,比如客户端可能已经关闭了连接,但之前发送的连接请求报文在网络上延迟到达了服务器,服务器就会主动去建立一个连接,但是客户端接收不到,导致资源的浪费。而四次握手可以优化为三次。

4.TCP连接四次挥手的过程,为什么是四次?

4.1四次挥手过程

第一次挥手:客户端发送一个FIN报文给服务端,报文中会指定一个序列号(seq=x)。然后,客户端进入FIN-WAIT-1状态。

第二次挥手:服务端收到FIN报文后,回复ACK报文给客户端,且把客户端的序列号值+1,作为ACK报文的序列号(seq=x + 1)。然后,服务端进入CLOSE-WAIT(seq= x+1),客户端进入FIN-WAIT-2状态。

第三次握手:服务器完成所有数据传输后,发送FIN包,进入LAST_ACK状态。客户端收到FIN后,准备关闭连接。

第四次挥手:客户端发送最后一个ACK包,进入TIME_WAIT状态,等待可能迟到的FIN包。服务器收到ACK后,关闭连接,进入CLOSED状态。客户端再TIME_WAIT计时结束后,正式关闭连接。

为什么需要四次挥手

可以三次挥手吗?如果服务器没有数据要发送了,可以将FIN+ACK一起发送给客户端。

5.为什么TCP挥手需要TIME_WAIT状态?

1.确保最后的ACK被成功接收:

  • 在TCP四次挥手过程中,主动关闭连接的一方在发送最后一个ACK确认包后进入TIME_WAIT状态。
  • 如果这个ACK丢失了,另一方(被动关闭连接的一份)没有收到确认包,会重新发送FIN报文。主动关闭的一方需要在TIME_WAIT状态下保持一段时间,以便能够重新发送ACK,确保连接能够被正确的关闭。

2.防止旧的重复分段干扰新连接:

  • TCP连接关闭后,可能会有一些延迟的或者已经失效的报文还在网络中传输。如果立即重新使用相同的IP地址和端口建立新的连接,可能会受到这些旧报文的干扰。
  • TIME_WAIT状态可以确保在旧连接的所有报文失效超时后,才允许新的连接使用相同的IP地址和端口,从而避免数据混乱。

你可能感兴趣的:(八股文,tcp/ip,网络,服务器)