原创 通俗易懂的HTTP建立连接的三次握手和四次挥手

http tcp/ip
IT技术 · phper · 更新于 2019-03-05

HTTP建立连接的过程通过三次握手(连接)和四次挥手(关闭连接)

三次握手

第一次握手:客户端发送一个SYN包(SYN=j,发送一个建立连接的请求),进入SYN_SEND状态(等待服务器确定的状态)

第二次握手:服务器接收到SYN包(ACK=j+1)后确认完后发送一个包(ACK=j+1)给客户端即SYN+ACK包,服务器进入SYN_RECV状态(等待接收客户端响应确认建立连接)

第三次握手:客户端接收到服务器发来的SYN+ACK包后,向服务器发送确认包ACK(ACK=k+1),包发送完毕,客户端和服务器进入ESTABLISHED状态(已建立连接的状态)。这样一来客户端和服务器建立连接,客户端可以向服务器发送数据。

四次挥手

(1)客户端发送一个FIN,用来关闭客户到服务器的数据传送,也就是没有数据再发送给服务器了。

(2)服务器收到这个FIN,发回一个ACK给客户端。(这边服务器可能接收FIN进行返回数据给客户端的时候未必都发完给客户端所以发送一个ACK说明客户端还未接收完数据)

(3)服务器关闭与客户端的连接,发送一个FIN给客户端。(当服务器发送完数据后,发送一个FIN给客户端确定数据发送完毕可以进行关闭连接)

(4)客户端接收到FIN后发回ACK报文确认,进行关闭连接。


为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为建立连接的时候服务端的LISTEN监听状态下的SOCKET当收到客户端发来SYN报文的请求连接时候,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送给客户端。但关闭连接时,当收到客户端的FIN报文通知时,它仅仅表示客户端没有数据发送给服务器了,但未必服务器所有的数据都全部发送给客户端了,所以服务器可能未必会马上会关闭SOCKET,也即服务器可能还需要发送一些数据给客户端之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以服务器这里的ACK报文和FIN报文多数情况下都是分开发送的。


|3 收藏|2

思考你要发的内容