前端工程师面试的时候,关于HTTP三次握手是最常被询问的一个知识点,往往很多人,都是知道其原理及过程,就是用话语表达不出来,正式一点,就是词不达意。今天浏览到一篇关于HTTP三次握手与四次挥手的博文,感觉上面的讲的可以轻松转成话语,赶紧收藏一下。
三次握手
- 第一次握手:客户端向服务器发送一个SYN报文,并指明客户端的初始化序列号ISN。此时客户端处于SYN_Send状态;
- 第二次握手:服务器收到SYN报文之后,会以自己的SYN报文作为应答,并且也指明自己的初始化序列号ISN,同时会把客户端的ISN+1作为ACK的值,表示自己已经收到了客户端的SYN,此时服务器处于SYN_REVD的状态;
- 第三次握手:客户端收到SYN+ACK报文之后,会应答一个ACK报文,当然也是一样把服务器的ISN+1作为ACK的值,表示已经收到了服务器的SYN报文,此时客户端处于establised状态;
- 服务器收到ACK报文之后,也处于establised状态,三次握手建立完成。
作用是为了确认双方的接受与发送能力是否正常;指定自己的初始化序列号,为后面的可靠传送做准备。
需要注意的几点:
- ISN不是固定的,二十动态生成的;
- 三次握手过程中是可以携带数据的(仅第三次握手可携带数据);
四次挥手
- 第一次挥手:客户端发送一个FIN报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态;
- 第二次挥手:服务器收到FIN之后,会发送ACK报文,且把客户端的序列号值+1作为ACK报文的序列号值,表明已经收到客户端的报文了,此时服务端处于CLOSE_WAIT状态。
- 第三次挥手:如果服务端也想端开链接了,和客户端的第一次挥手一样,发送FIN报文,且指定一个序列号,此时服务端处于LAST_ACK的状态。
- 第四次挥手:客户端收到FIN报文之后,一样发送一个ACK报文作为应答,且把服务端的序列号值+1作为自己ACK报文的序列号值,此时客户端处于TIME_WAIT状态。需要过一阵子以确保服务端收到自己的ACK报文之后才会进入CLOSED状态
- 服务端收到ACK报文之后,就处于关闭连接了,处于CLOSED状态。
原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/front-end/http-link.html