TCP三次握手 四次挥手

1,779 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

TCP 三次握手 四次挥手

TCP三次握手

TCP三次握手是为了:

  • 建立连接
  • 本质是开辟了资源内存空间
    • 客户端和服务器端都要开辟资源空间

TCP三次握手的过程

  • 1握:客户端发送 syn 包给服务器端,进入 SUNC_SENT 状态
  • 2握:服务器端发送 syn+ack包,同时也发syn包,从listen到syn-rcvd状态
  • 3握:客户端接收来着服务端的syn+ack包,向服务器端发送确认包ack包

举个例子加深一下记忆:

我们用约吃饭进行举例:

  • 1握:小明:小红我们明天一起去吃饭吧?
  • 2握:小红:好的,小明明天去哪里吃?
  • 3握:小明:明天去吃沙县吧!

为什么不能是两次握手?

简单来说:如果只有两次握手: 这个时候客户端没有回应,这样会浪费服务端的资源

我们用打电话进行举例:

情景:小明打电话给小红:

  • 1握:小明:小红我们明天一起去吃饭吧?
  • 2握:小红:好的,小明明天去哪里吃? 如果只有两握的话,我们只能确定小红同意小明去吃饭了,这时候小明就心满意足的去睡觉了,但是小红却不知道哪里吃,只能一直等啊等。。。造成浪费。

小结

三次握手的概括一下如下: 1:客户端告诉服务端:我要给你发数据了 2:服务端回复客户端:收到,你可以给我发数据了,并询问A,我能给你发数据吗 3:客户端回复服务端:你也可以给我发数据了,我要开始给你发数据了

3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

TCP四次握手

目的

为了:断开连接

过程:

  • 第一次挥手:Clien发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  • 第二次挥手:Server收到FIN后,发送一个ACK给Client,Server进入CLOSE_WAIT状态。
  • 第三次挥手: Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  • 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次握手。

举个例子加深一下记忆:

我们用吃完饭埋单举例:

  • 第一次挥手:小明:服务员埋单!
  • 第二次挥手:服务员:好的。(服务员操作机器结算)
  • 第三次挥手:服务员:(示意扫码付款),可以埋单了!
  • 第四次挥手:小明:好的,埋单完毕。

为什么连接的时候是三次握手,关闭的时候却是四次握手?

  • 因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。
  • 但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。
  • 只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。