面试相关文章推荐:
一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么
TCP(Transmission Control Protocol,传输控制协议)是一种可靠的、面向连接的协议,在进行数据传输之前需要进行三次握手建立连接。三次握手的过程如下:
-
第一次握手(SYN):
- 客户端发送一个带有 SYN(同步序列编号)标志的数据包给服务器,请求建立连接。
- 此时客户端进入 SYN_SENT 状态,等待服务器的确认。
-
第二次握手(SYN+ACK):
- 服务器收到 SYN 数据包后,会回复一个带有 SYN/ACK 标志的数据包给客户端,表示确认收到请求,并同意建立连接。
- 此时服务器进入 SYN_RCVD 状态,等待客户端的确认。
-
第三次握手(ACK):
- 客户端收到服务器的 SYN/ACK 数据包后,会发送一个带有 ACK 标志的数据包给服务器,表示确认收到服务器的确认,可以开始数据传输。
- 此时客户端和服务器都进入 ESTABLISHED(已建立连接)状态,可以进行数据传输了。
三次握手的目的是确保客户端和服务器之间的通信能够正常建立,并且双方都知道对方已经准备好了可以进行数据传输。握手过程中的 SYN 和 ACK 标志分别表示同步序列编号和确认序列编号,用于确认双方的通信序列号,保证数据传输的可靠性。
为什么需要四次挥手来终止连接?
-
发起关闭连接请求:
- 第一次挥手中,假设客户端想要关闭连接,它会发送一个FIN包给服务器,表示客户端已经没有数据要发送了。
-
确认关闭请求已接收:
- 第二次挥手中,服务器收到FIN包后,发送一个ACK包作为回应,确认已经收到客户端的关闭请求。此时,客户端进入FIN_WAIT状态,服务器进入CLOSE_WAIT状态。
-
服务器完成数据传输:
- 服务器在完成所有数据的发送后,也会发送一个FIN包给客户端,表示服务器也准备好关闭连接了。
-
确认关闭连接:
- 第四次挥手中,客户端收到服务器的FIN包后,发送一个ACK包作为回应,确认已经收到服务器的关闭请求。客户端进入LAST_ACK状态,等待服务器关闭连接。服务器在发送完FIN包后,关闭连接并进入CLOSED状态。客户端在发送完ACK包后,也会在一段时间后关闭连接并进入CLOSED状态。
为什么tcp连接需要三次握手四次挥手
TCP连接需要三次握手和四次挥手的主要原因是确保通信的可靠性和正确性,同时处理客户端和服务器之间的连接的建立和断开。
三次握手的原因:
- 确认双方的发送和接收能力:通过三次握手,客户端和服务器可以互相确认彼此的发送和接收能力是否正常。这样可以避免因为某一方发送的连接请求未到达另一方而导致连接建立失败。
- 防止已失效的连接请求导致资源浪费:如果服务器收到了一个过期的连接请求,但是客户端并不知道,那么可能会导致服务器浪费资源去处理这个已失效的连接请求。通过三次握手,可以确保客户端和服务器都有意识地建立连接,减少了这种情况的发生。
四次挥手的原因:
- 确保数据传输完整性:在断开连接之前,需要确保客户端和服务器之间的数据传输已经完成,防止数据丢失或者不完整。
- 允许双方有时间去处理未完成的数据传输:断开连接前的四次挥手过程中,允许客户端和服务器有时间去处理未完成的数据传输,确保数据传输的完整性和正确性。
总的来说,三次握手和四次挥手是为了保证TCP连接的可靠性和正确性,确保数据的正确传输,并且有效地管理连接的建立和断开。