安卓网络知识总结(二)--三次握手和四次挥手

三次握手和四次挥手

上一篇写了网络的基本知识,然后今天把网络的三次握手和四次挥手来总结下这个。
为什么要有这个东西,很简单
因为HTTP是一个基于TCP的协议,而TCP是一种可靠的传输层协议.
他要确定你是否连接到了,或者要退出连接

三次握手

目的:防止服务器端因接收了早已失效的连接请求报文,从而一直等待客户端请求,最终导致形成死锁、浪费资源//简单的来说就是确认自己和对方可以接收和发送正常
时间:发送正式的请求之前
过程这里写图片描述
第一次握手:Client什么都不能确认;Server确认了对方发送正常
第二次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己接收正常,对方发送正常
第三次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己发送、接收正常,对方发送接收正常

为什么要发送特定的数据包,随便发不行吗?
答:三次握手的另外一个目的就是确认双方都支持TCP,告知对方用TCP传输。
第一次握手:Server 猜测Client可能要建立TCP请求,但不确定,因为也可能是Client乱发了一个数据包给自己
第二次握手:通过ack=J+1,Client知道Server是支持TCP的,且理解了自己要建立TCP连接的意图
第三次握手:通过ack=K+1,Server知道Client是支持TCP的,且确实是要建立TCP连接
SYN是标志位,SYN=1表示请求连接;
这里写图片描述

这里通俗的解释下:
韩梅梅和李雷吵架了,李雷之后并没有找韩梅梅。这时候韩梅梅就想确认李雷死了没有。

韩梅梅首先给李雷发信息问:死鬼,你死了吗?

李雷这时候可能在打dota,lol,王者,不能及时回复,那韩梅梅就着急会重复发:你死了吗!你没死吧!你真的死了吗?

所以,这就是tcp的第一次握手,就是要确认别人是否存在能响应。

那李雷毕竟不能辜负韩梅梅,他回复了:我没死。

然而李雷其实面临着一个尴尬的境地,他回复了韩梅梅,但是确不知道韩梅梅是否还在生气,或者说韩梅梅是否还在手机旁边,所以他现在也只能干等韩梅梅回复或者重复发信息给她(现实其实是他跑去继续玩游戏)。

这就是第二次握手了,起码在这一步知道了对方肯定是存在的了,但是想要保持连接下去,你得看看对方是否“可以传输”

韩梅梅收到了李雷说:我没死的消息,那她基本就可以确定李雷没死了,这时候已经不需要确认对方是否没死了,那韩梅梅现在就可以告诉李雷一个惊天的消息:今晚我们去酒店吧!

如果李雷接受到了,我们今晚去酒店吧,那就基本上可以确认双方都不生气了,并且活着,而且还可以去开房了……

对应到现实中的tcp:
第一个握手包韩梅梅发送syc包给李雷,如果李雷没及时回复,那韩梅梅会一直猛发!
第二个握手包就是李雷收到韩梅梅的syc后,回发syc/ack给韩梅梅,如果韩梅梅没有回复,那李雷也会猛发!
第三个握手包就是韩梅梅知道李雷没死,发给他一个ack,然后韩梅梅单方面就变成了「Established」状态,如果李雷收到了,就也会变成「Established」状态;如果没有那就一直是「active」状态

少于三次握手都不能确定双方是否连接并且可以相互发消息;多于三次,就是浪费了

四次挥手

目的:保证通信双方都能通知对方 需释放 & 断开连接
即释放连接后,都无法接收 / 发送消息给对方
时间:传输东西完了后
过程这里写图片描述
1.A与B交谈结束之后,A要结束此次会话,对B说:我要关闭连接了(seq=u,FIN=1)。(第一次挥手,A进入FIN-WAIT-1)
2.B收到A的消息后说:确认,你要关闭连接了。(seq=v,ack=u+1,ACK=1)(第二次挥手,B进入CLOSE-WAIT)
3.A收到B的确认后,等了一段时间,因为B可能还有话要对他说。(此时A进入FIN-WAIT-2)
4.B说完了他要说的话(只是可能还有话说)之后,对A说,我要关闭连接了。(seq=w, ack=u+1,FIN=1,ACK=1)(第三次挥手)
5.A收到B要结束连接的消息后说:已收到你要关闭连接的消息。(seq=u+1,ack=w+1,ACK=1)(第四次挥手,然后A进入CLOSED)
6.B收到A的确认后,也进入CLOSED。

白话一点:
服务器说:老哥,我要挂了哈,没有东西要发了,
客户端说:好的我知道了
此时服务器开始准备挂的状态,因为他等待也许客户端还有话说
客户端又说:我也沒東西了,你挂吧
服务器说:好的,我知道了
然后断开连接

总结

这些都是基础的网络东西,有些名词还是不知道什么意思,但白话讲起来就好了
三次握手
A:“喂,你听得到吗?”A->SYN_SEND
B:“我听得到呀,你听得到我吗?”应答与请求同时发出 B->SYN_RCVD | A->ESTABLISHED
A:“我能听到你,今天balabala……”B->ESTABLISHED
四次挥手
A:“喂,我不说了。”A->FIN_WAIT1
B:“我知道了。等下,上一句还没说完。Balabala…..”B->CLOSE_WAIT | A->FIN_WAIT2
B:”好了,说完了,我也不说了。”B->LAST_ACK
A:”我知道了。”A->TIME_WAIT | B->CLOSED
A等待2MSL,保证B收到了消息,否则重说一次”我知道了”,A->CLOSED

猜你喜欢

转载自blog.csdn.net/sakurakider/article/details/80410387