HTTP进阶——三次握手、四次挥手、timewait出现的时刻

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoxiao20121314/article/details/81478283

面试中经常会被问到http的连接和断开的问题,所以我在这里做一个小整理,希望可以帮到大家。

1.HTTP的三次握手

第一次握手Client端A将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server端B,A进入SYN_SENT状态,等待B确认。

第二次握手:B收到数据包后由标志位SYN=1知道A请求建立连接,B将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给A以确认连接请求,Server进入SYN_RCVD状态。

第三次握手:A收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给B,B检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,A和B进入ESTABLISHED状态,完成三次握手,随后A与B之间可以开始传输数据了。


2.http的四次挥手

1)客户端发送FIN信号给server端,server端接受到FIN信号,得知客户端要关闭连接

2)server端发送应答信号,告诉客户端送到关闭连接信号,使客户端多等一会,将剩余的数据发送给给他

3)server在发送完所有数据后,立即发送FIN信号,告诉客户端已经没有数据要传输,要关闭连接

4)客户端接收到server端的关闭连接信号,并产生应答信号发送给server端,进入超时等待状态


3.timewait出现的时间点

大家或许会有疑问为什么握手只要三次就可以,而断开却要四次。其实原因还是比较简单的,挥手的原因是当前方没有数据要发送了,所以要断开连接,这里就要注意了,握手时是由客户端发起的请求,而断开没有限定哪一方先发起。这是由于断开请求不一定是哪一方先发起的,所以要确保线路中没有数据要发送才可以,因此要进行四次通信来确定双发均没有数据要发送了。由此为了确保最后安全断开,则需要在先发起断开连接求取方接受到对方的断开请求后,自己回复应答信号后进入timewait模式,等待对方是否由于没有接到应答信号,而从新发起断开请求,等待的时间一般为2MSL。再次强调timewait是由主动(先发起)FIN信号来维护的。

注意:再断开连接时发送的FIN信号只代表此方没有数据要发送,发送完FIN信号后可以立即关闭发送信道,但要保留接收信道;当收到另一方的FIN信号后才可以关闭接收信道,同时发送应答信号。根据自己的理解总结的,如果有不正确的地方还希望大家及时指正,谢谢大家的浏览,希望我的笔记可以帮到您。

猜你喜欢

转载自blog.csdn.net/xiaoxiao20121314/article/details/81478283