TCP 三次握手和四次挥手个人理解

  • 首先是三次握手和四次挥手相关术语的基础概念:
    概念摘自https://blog.csdn.net/qq_38950316/article/details/81087809
   序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。

    确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。

    确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效

    同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

    终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接

    PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

相关术语的全称(很助于理解):
SYN:Synchronize Sequence Numbers
ACK:Acknowledge Character
FIN:Finished

  • 三次握手的图例展示(来自百科)
    在这里插入图片描述
    完整的解释可以参考百科:https://baike.baidu.com/item/%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B
    以下是我个人对于这个三次握手的理解:
    第一次是由客户端发送一个SYN序列号给服务器:作用是告诉服务器,我要开始连你了,间接的也证明的客户端能发送消息的能力。
    第二次是服务端收到客户端发送的SYN之后发送SYN和ACK包给客户端,即服务端告诉客户端,我收到你的消息了,然后我也可以发送东西给你,就是说明服务端收发自如。
    第三次是客户端收到SYN和ACK之后,发送一个ACK应答消息给服务端,告诉服务端我也能收东西。

  • 为什么需要三次握手呢?
    简单的来说,三次握手就能证明服务端和客户端收发自如的能力,因为两个都得知道对方既能收东西,也能发东西的能力,那么,最短的握手次数,就是三次最少。

  • 四次挥手的图例展示(来自百科)
    在这里插入图片描述
    简单的理解如下:
    注释:默认情况下,主动方为客户端,被动方为服务器端

  • 第一次就是客户端发送FIN和ACK给服务端,告诉服务端,它要关闭了,然后客户端就停止继续发送消息。

  • 第二次是服务端收到FIN和ACK,然后发送ACK给客户端,告诉客户端“ok,我知道要关闭了”

  • 第三次是服务端剩余的东西传完之后,发送FIN给客户端,就是类似于告诉客户端“好了,我这里已经全部解决了”

  • 第四次是客户端收到关闭消息了,然后发送ACK给服务端,就是告诉服务端,好了,你可以关了,然后客户端要等一段时间才关闭,服务端收到ACK之后就关闭,不再发送消息。

  • 为什么需要四次挥手
    因为就跟分手是一样的,是有优先顺序的,就是有一方肯定是先有这个想法的,同时间都有想法那是几率太低了,所以肯定是一方(客户端)先死心,然后提分手(第一次挥手),然后另一方(服务端)就说ok了(第二次挥手),然后告诉以方,但是大概率暂时还是念念不忘(张震岳这首念念不忘还挺好听),然后还会继续挽回,最后发现死心了,然后就说“那就这样吧”(第三次挥手),然后客户端就说好吧(第四次挥手),所以后面服务端就收到消息,然后死心,也就不回了,离开了。

比较生动的讲解,希望可以帮助理解,个人是觉得比较好理解。

四次挥手为什么最后需要等待两个时间周期
因为有可能最后一个报文会发送失败,服务器如果超时没收到的话,会重新传FIN-ACK,等待两个时间周期,是为了防止失败,就算失败了,能再次收到FIN-ACK报文,然后重新发送确认报文给服务器,保证服务器能收到。

发布了365 篇原创文章 · 获赞 80 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/Giser_D/article/details/103259272