面试题答案
一键面试TCP三次握手建立连接
- 第一次握手(客户端 -> 服务器):
- 作用:客户端向服务器发送一个带有 SYN(同步序列号)标志的 TCP 数据包,该数据包中包含一个初始序列号(ISN,Initial Sequence Number)。客户端通过此步骤告知服务器它想要建立连接,并为后续的数据传输初始化序列号。
- 异常情况:若客户端长时间未收到服务器的响应,可能是网络故障(如网络延迟过高、路由错误等),导致 SYN 包无法到达服务器;也可能是服务器端防火墙等安全策略拦截了该 SYN 包。
- 第二次握手(服务器 -> 客户端):
- 作用:服务器接收到客户端的 SYN 包后,会向客户端发送一个 SYN + ACK 包。其中 SYN 部分包含服务器的初始序列号,ACK 部分是对客户端 SYN 包的确认,确认号为客户端的初始序列号加 1。此步骤服务器告知客户端它已收到连接请求,并同意建立连接,同时也初始化自身的序列号。
- 异常情况:如果客户端收到的 SYN + ACK 包中的确认号不正确,可能是在传输过程中数据包被篡改,或者服务器处理 SYN 包时出现错误;若客户端长时间未收到 SYN + ACK 包,可能是网络问题导致该包丢失。
- 第三次握手(客户端 -> 服务器):
- 作用:客户端收到服务器的 SYN + ACK 包后,向服务器发送一个 ACK 包,确认号为服务器的初始序列号加 1,序列号为客户端在第一次握手中的初始序列号加 1。此步骤完成连接的建立,客户端和服务器双方都确认对方已准备好进行数据传输。
- 异常情况:若服务器未收到客户端的 ACK 包,可能是网络问题导致 ACK 包丢失;若服务器收到的 ACK 包中的确认号不正确,可能存在数据篡改或客户端处理 SYN + ACK 包错误。
TCP四次挥手断开连接
- 第一次挥手(主动关闭方 -> 被动关闭方):
- 作用:主动关闭方(通常是客户端,但也可以是服务器)发送一个 FIN 包,标志着主动关闭方不再发送数据,但仍可以接收数据。此步骤告知被动关闭方主动关闭方想要关闭连接。
- 异常情况:若被动关闭方长时间未收到 FIN 包,可能是网络故障导致 FIN 包丢失;也可能是被动关闭方的防火墙等安全策略拦截了该 FIN 包。
- 第二次挥手(被动关闭方 -> 主动关闭方):
- 作用:被动关闭方接收到 FIN 包后,发送一个 ACK 包给主动关闭方,确认号为接收到的 FIN 包的序列号加 1。此时被动关闭方进入 CLOSE_WAIT 状态,表示它已收到关闭连接的请求,但还可能有数据需要继续发送。
- 异常情况:如果主动关闭方收到的 ACK 包中的确认号不正确,可能是传输过程中数据包被篡改,或者被动关闭方处理 FIN 包时出现错误;若主动关闭方长时间未收到 ACK 包,可能是网络问题导致该包丢失。
- 第三次挥手(被动关闭方 -> 主动关闭方):
- 作用:当被动关闭方完成数据发送后,它会发送一个 FIN 包给主动关闭方,表明它也准备好关闭连接。
- 异常情况:若主动关闭方长时间未收到 FIN 包,可能是网络故障导致 FIN 包丢失;也可能是被动关闭方在处理完数据后未能及时发送 FIN 包。
- 第四次挥手(主动关闭方 -> 被动关闭方):
- 作用:主动关闭方接收到被动关闭方的 FIN 包后,发送一个 ACK 包给被动关闭方,确认号为接收到的 FIN 包的序列号加 1。然后主动关闭方进入 TIME_WAIT 状态,等待 2MSL(Maximum Segment Lifetime,最长报文段寿命)时间后完全关闭连接。被动关闭方收到 ACK 包后立即关闭连接。此步骤确保被动关闭方也能确认连接关闭,同时主动关闭方通过 TIME_WAIT 状态等待,以处理可能延迟到达的数据包。
- 异常情况:若被动关闭方未收到 ACK 包,可能是网络问题导致 ACK 包丢失;若主动关闭方在 TIME_WAIT 状态期间收到一些异常数据包,需要按照 TCP 协议的规则进行处理,如判断是否为重复的 FIN 包等。如果主动关闭方在 TIME_WAIT 状态结束前重启,可能会导致一些未处理完的连接出现问题。