三次握手
三次握手就是TCP协议建立连接的过程
(1)第一次握手:客户端向服务端发送报文,标志位SYN(同步请求),seq(序列号)给服务器,客户端进入SYN_SENT(请求发送)状态。
(2)第二次握手: 服务端接收了客户端的报文,进入SYN_RCVD(同步接收)状态,然后发送报文SYN(同步),ACK(应答),ack(应答序列号),seq(序列号)给客户端。
(3)第三次握手: 客户端收到服务端的报文后进入Established(连接建立),发送应答报文ACK,ack给服务端,服务端进入Established状态,双方建立连接。
三次握手通俗理解:
(1)一个男生喜欢一个女生,于是写了一封信告诉女生:我喜欢你,你愿意和我交往吗?写完信之后,男生焦急地在等待,因为他不知道信能否顺利地传达给女生。
(2)女生收到男生的情书后,非常开心,原来我们互相喜欢对方,于是写了一封回信给男生:我收到了你的信,也明白了你的心意,我也喜欢你,我愿意和你交往!写完信之后,女生焦急地在等待,因为她不知道信能否顺利地传达给男生。
(3)男生收到回信之后很开心,因为他知道自己的信女生收到了并且从回信中知道了女生也喜欢自己,并且愿意和自己交往。然后男生又写了一封信给女生:你的心意和信我都收到了,谢谢你答应做我女朋友。
女生再次收到了男生了回信之后,非常开心,因为知道了自己的信件男生都准确无误地收到了。之后男生和女生就非常顺畅地继续交流起来了。
四次挥手
四次挥手就是TCP协议释放连接的过程
(1) 客户端向服务端发送结束报文FIN,客户端进入等待状态1, 服务端收到结束报文后,进入等待关闭状态。
(2)服务端发送应答报文ack, 客户端接收服务端的应答报文ack,进入等待状态2
(3) 服务端释放资源后,发送结束FIN给客户端,服务端进入LAST_ACK状态
(4) 客户端收到服务端的结束报文,进入TIME_WAIT状态,然后发送应答报文ACK给服务端,服务端收到客户端发送的报文后,进入CLOSED状态,连接关闭。
四次挥手通俗理解:
(1)第一次挥手:时间久了,男生发现女生变成了自己讨厌的样子,忍无可忍,于是决定分手,就写了一封信告诉女生。
(2)第二次挥手:女生收到信之后,知道了男生要和自己分手,气得要死,心中骂道:你算什么东西,当初你追我的时候可不是这个样子的!于是立马给男生写了一封回信:分手就分手,给我点时间,我要把你的东西全部还给你!男生收到女生的第一封信之后,明白了女孩知道自己要和她分手。随后等待女生把自己的东西收拾好。
(3)第三次挥手:过了几天,女生把男生送的东西都整理好了,于是再次写信给男生:你的东西我整理好了,赶紧把它们拿走,从此以后我们老死不相往来!
(4)第四次挥手:男生收到女生第二封信之后,知道女生把东西收拾好了,可以正式分手了,于是再次写信告诉女生:我知道了,这就去拿回来!
这就是四次挥手。
面试题:为什么是三次握手,不是两次也不是四次?
不是两次握手的原因:为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”。
客户端发出了一个连接请求报文,因为某些未知的原因在某个网络节点上发生延迟、滞留,导致延迟到连接释放以后的某个时间才到达服务端。服务端会误认为是客户端再次发出的一个新的连接请求,于是服务端就向客户端又发出确认报文,表示同意建立连接。这样服务端就会白白浪费很多资源,所以不能使用两次握手。
不是四次握手的原因:因为三次握手就能建立起可靠的连接传输,四次握手会降低连接的速度和效率 。