面试鸭Java后端面试题, TCP 的三次握手和四次挥手
面试鸭Java后端面试题, TCP 的三次握手和四次挥手
QA
Step 1
Q:: TCP 三次握手的过程是怎样的?
A:: TCP 三次握手是为了建立可靠的连接。第一次握手:客户端发送 SYN 包(同步序列编号)到服务器,并进入 SYN_SENT 状态,等待服务器确认。第二次握手:服务器收到 SYN 包,必须确认客户的 SYN(发送 ACK 包),同时自己也发送一个 SYN 包,此时服务器进入 SYN_RECV 状态。第三次握手:客户端收到服务器的 SYN+
ACK 包,向服务器发送确认包 ACK,此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。
Step 2
Q:: TCP 四次挥手的过程是怎样的?
A:: TCP 四次挥手是为了断开连接。第一次挥手:客户端发送一个 FIN 包,用来关闭客户端到服务器的数据传送,客户端进入 FIN_WAIT_1 状态。第二次挥手:服务器收到 FIN 包,发送一个 ACK 包给客户端,确认序号为收到序号+1
(与 SYN 相同,一个 FIN 占用一个序号),服务器进入 CLOSE_WAIT 状态。第三次挥手:服务器发送一个 FIN 包,用来关闭服务器到客户端的数据传送,服务器进入 LAST_ACK 状态。第四次挥手:客户端收到服务器的 FIN 包,客户端进入 TIME_WAIT 状态,接着发送一个 ACK 包给服务器,服务器进入 CLOSED 状态,完成四次挥手。
Step 3
Q:: 为什么需要三次握手才能建立连接?
A:: 三次握手的目的是为了确认双方的接收和发送能力都是正常的,防止已失效的连接请求报文段突然又传送到了服务器,因而产生错误。第一次握手只能确认客户端发送数据到服务器的能力;第二次握手确认了服务器接收和发送数据到客户端的能力;第三次握手则确认了客户端接收数据的能力。
Step 4
Q:: 为什么需要四次挥手才能断开连接?
A:: 因为 TCP 是全双工的,意味着两方都需要分别关闭各自的数据传送通道。第一次挥手和第二次挥手关闭的是客户端到服务器的数据通道;第三次挥手和第四次挥手关闭的是服务器到客户端的数据通道。因此需要四次挥手来完全断开连接。
Step 5
Q:: TCP 为什么要设计 TIME_WAIT 状态?
A:: TIME_WAIT 状态的设计是为了确保 TCP 协议的全双工连接能够完全关闭。主要作用有两个:1. 防止旧数据包的重传影响新连接。2.
确保最后的 ACK 包能被正确接收,若服务器没有收到 ACK 包会重新发送 FIN 包。