三次握手&四次挥手

297 阅读5分钟

什么是三次握手?

三次握⼿(Three-way Handshake)是指在建⽴⼀个 TCP 连接时,需要客户端和服务器总共发送 3 个包。

三次握⼿的⽬的是连接服务器指定端⼝,建⽴ TCP 连接,并同步连接双⽅的序列号和确认号,交换 TCP 窗⼝⼤⼩信

息。在 socket 编程中,客户端调用执行 connect() 时将触发三次握⼿。

下图为三次握手的示意图:

image.png

第⼀次握⼿(SYN=1, seq=x)

客户端发送⼀个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端⼝,以及初始序号 X,保存在包头的序列号(Sequence Number)字段⾥。

发送完毕后,客户端进⼊ SYN_SEND 状态。

第⼆次握⼿(SYN=1, ACK=1, seq=y, ACKnum=x+1)

服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择⾃⼰ ISN 序列号,放到 Seq 域⾥,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即 X + 1。

发送完毕后,服务器端进⼊ SYN_RCVD 状态。

第三次握⼿(ACK=1,ACKnum=y+1)

客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对⽅,并且在数据段放写 ISN 的 +1。

发送完毕后,客户端进⼊ ESTABLISHED 状态,当服务器端接收到这个包时,也进⼊ ESTABLISHED 状态,TCP 握⼿结束。

什么是四次挥手?

四次挥⼿(Four-way handshake),也叫做改进的三次握⼿,TCP 连接的拆除需要发送四个包,客户端或服务器均可主动发起挥⼿动作,在 socket 编程中,任何⼀⽅执⾏ close() 操作即可产⽣挥⼿操作。

下图为四次挥手示意图:

image.png


第⼀次挥⼿(FIN=1,seq=x)

假设客户端想要关闭连接,客户端发送⼀个 FIN 标志位置为1的包,表示⾃⼰已经没有数据可以发送了,但是仍然可以接受数据。发送完毕后,客户端进⼊ FIN_WAIT_1 状态。

第⼆次挥⼿(ACK=1,ACKnum=x+1)

服务器端确认客户端的 FIN 包,发送⼀个确认包,表明⾃⼰接受到了客户端关闭连接的请求,但还没有准备好关闭连接。发送完毕后,服务器端进⼊ CLOSE_WAIT 状态,客户端接收到这个确认包之后,进⼊ FIN_WAIT_2 状态,等待服务器端关闭连接。

第三次挥⼿(FIN=1,seq=y)

服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。发送完毕后,服务器端进⼊ LAST_ACK 状态,等待来⾃客户端的最后⼀个ACK。

第四次挥⼿(ACK=1,ACKnum=y+1)

客户端接收到来⾃服务器端的关闭请求,发送⼀个确认包,并进⼊ TIME_WAIT 状态,等待可能出现的要求重传的 ACK 包。服务器端接收到这个确认包之后,关闭连接,进⼊ CLOSED 状态。客户端等待了某个固定时间(两个最⼤段⽣命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是⾃⼰也关闭连接,进⼊ CLOSED 状态。

TCP 三次握手理解 (双方确认)

TCP是一个端到端的 可靠 面相连接的协议,

HTTP基于传输层TCP协议不用担心数据传输的各种问题(当发生错误时,可以重传)

根据这个IP,找到对应的服务器,发起TCP的三次握手 (tcp 三次握手四次挥手 )

image.png

为什么要3次握手

我们假定第一次发送的请求, 因为网络延迟很慢才到达服务端,

然后客户端以为这服务器居然不叼我,然后默默的关闭的等待连接的请求,走开了(好比追女神);

但事实呢?女神(服务器)是因为各种各样的原因,很晚才看到,然后说我接受你了, 同意你的要求咱们两结婚吧!

但是,A早已经远走高飞,这个请求A完全不会收到(在第二次握手,服务端打开连接,等待客户端的响应),

那么女生呢,以为对方收到了,就会一直等待,这样B的资源就会被浪费的(创建连接的时候,空间浪费以及端口消耗);

而三次握手, 就不会发生,服务端同意连接了,但是A缺一直没有下一步的动作,导致资源浪费;

关闭TCP连接四次挥手的理解 (客气挽留)

关闭连接(四次挥手)

image.png

这和有礼貌的好友道别一样:(a:客户端 b:服务端) 1、一开始A想要回家离开,但是呢?怕B还有事情要交代,那么呢?只好先想B打招呼,我要走了,请求停止交谈(此时,a到B的连接没有断开,依旧可以进行通信); 2、同意A的请求,说好的,但是我这里可能还有一些话(数据)没说完。我检查看看, 你等等, 等我说完你再走。 3、B确实没啥要补充的了,就告知你我可以散伙了 4、A说好的,知道了,88;(B得知A走开了,关闭了自己的连接 )