liunx——三次握手、四次挥手

文章目录

  • 一、相关用语
  • 二、三次握手理解
    • 2.1、第一次握手
    • 2.2、第二次握手
    • 2.3、第三次握手
  • 二、四次挥手
    • 1、第一次挥手
    • 2、第二次挥手
    • 3、第三次挥手
    • 4、第四次挥手
  • 三、为什么握手三次,挥手四次

一、相关用语

  1. **报文:**是网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息
  2. **SYN:**同步序列编号(Synchronize Sequence Numbers)是TCP/IP建立连接时使用的握手信号,1为请求建立连接。
  3. **ACK:**确认字符(Acknowledgement)在TCP/IP协议中,服务器收到客户机发来的SYN后回复的一个数据,用来确定发来的数据已经接受。
  4. **SEQ:**序列号(sequence number),下一个seq是当前seq和包大小加的。

二、三次握手理解

2.1、第一次握手

客户端会发送一个SYN标记为1的包给服务器,并随机取了一个随机数SEQ©=x为自己的初始序列号,发送完后进入SYN-SEND状态。
(男朋友约女朋友出来玩,男朋友发消息给女朋友:我在七天酒店开好房了了,房间号是1,不要走出错了呢,我在这里的等你)

2.2、第二次握手

服务端收到了SYN=1的标记,知道了客户端想要和自己建立连接,此时进入LISTEN状态。于是发送包含一个确认标记ACK(ACK=SEQ©+1),一个建立连接标记SYN=1,并且随机产生自己的序列书SEQ(s)=y的包,发送完后进入SYN-RECV状态。
(女朋友收到消息过后,肯定要回复嘛:好的,我知道在七天酒店了,房间号是1了,再顺便说了一句,我今天穿的白色衣服,然后就准备出发)

2.3、第三次握手

客户端收到服务器端发来的包之后,检查ACK的值是否等于SEQ©+1以及SYN是否为1,确认无误后,再发送包含一个ACK=SEQ(s)+1,一个SEQ=z,此时双方进入ESTABLISHED状态,TCP连接建立。
(男朋友收到消息过后,就回复一下:那好,我就在七天酒店1号房的等你,你快来吧)

liunx——三次握手、四次挥手_第1张图片

二、四次挥手

1、第一次挥手

客户端主动断开连接,并发送一个包含FIN=1,SEQ=u(等于前面已经传送过来的数据的最后一个字节的序号加1,因为TCP协议规定FIN报文段即使不携带数据,也要消耗一个序号)的请求断开报文,发送完后进入FIN-WAIT-1状态;
(两个人一起打王者完了过后,男生说,房间要到期了,要走了)

2、第二次挥手

服务端收到了断开请求报文,便发送一个包含ACK=u+1,SEQ=z的确认报文,发送完后进入CLOSE-WAIT状态。客户端收到服务器端的确认报文后,客户端进入FIN-WAIT-2状态,继续接受服务器端发送的最后的报文;
(女朋友说:啊,这么快就过去了啊,我知道了,那我打扮打扮出门回家吧)

3、第三次挥手

等所有的数据传送完毕后,服务器端发送一个包含FIN=1,SEQ=w,ACK=u+1的连接断开报文,此时服务端进入LAST-ACK状态。。
(女朋友打扮完了:拉着男朋友的手说,走吧,回家)

4、第四次挥手

客户端收到断开连接报文后,必须要发送一个包含ACK=w+1,SEQ=u+1的确认断开报文,此时客户端进入TIME-WAIT状态,服务端进入CLOSED状态,等待2MSL(最长报文寿命)时间后,服务端进入CLOSED状态,双方正式断开连接。
(男朋友确认女朋友打扮完了,可以回家了就去退房回家)

liunx——三次握手、四次挥手_第2张图片

三、为什么握手三次,挥手四次

因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手
(来的时候你是准备好,直接来的。走得时候你要确认1一下东西是否拿完,有没有遗漏,最后说没有遗漏,走吧)

你可能感兴趣的:(linux)