大白话TCP/IP,三次握手,四次挥手, 5分钟搞定

461 阅读3分钟

[TOC]

今儿有个同事问我,TCP/IP三次握手,四次挥手,那你看完下面这个,还不懂,复工了我们面对面可好????

三次握手

发送3个报文包,建立连接

  1. 先不要关注什么 SYN ACK seq,握手就是建立连接,为什么是 3次 ?那我问你:要确认客户端和服务端的收发能力都是OK的,你觉得最少需要几次?

  2. 下面的大白话告诉你要几次

    初始: 客户端,服务端都是关闭状态(closed)

    • 客户端,主动打开, 向服务器发送信息。(第一次)

    • 服务器,还在睡觉,不情愿的打开,(被动打开)。收到客户端的消息。收到了肯定是要礼貌的回应嘛。于是发送信息(第二次),告诉客户端,我收到了。

    • 客户端收到服务端的响应。在对服务器说(第三次):我收到了。我这边准备就绪了。

    • 服务器最后收到客户端的消息。“好的,没问题,我也准备好了”


    至此:连接建立,开始 “交流” 数据。

    再说下,三次握手里面具体变化:

    • 第一次握手: 客户端,服务端的收 发能力都不能确认。(客户端虽然发送了消息,但没有收到响应,就不知道到底发送成功与否)。握手后此时: 【客户端状态:CLOSED => SYN-SENT.】【服务端状态:CLOSED => LISTEN
    • 第二次握手:服务端收到报文,确认 【收】 能力是OK的,然后发送响应报文给客户端,客户端收到后,确认了自己的**【收 发】** 能力都是OK的。【客户端状态:SYN-SENT => ESTAB-LISHED.】【服务端状态:LISTEN => SYN-RCVD
    • 第三次握手:第三次,就是为了确认服务端的**【发】能力是OK**的,(和第一次一样,你发了,没有响应的话,怎么知道发成功了?)服务器收到报文,确认了自己的【发】能力。握手后此时:【客户端状态: ESTAB-LISHED】【服务端状态:SYN-RCVD => ESTAB-LISHED

    现在清楚了不?

四次挥手

握手连接,挥手 “拜拜”。 发送4个“保温包”,断开连接。

  1. 为什么是4次?先花个30秒理解下面这句话:

    TCP连接是全双工的,关闭时,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,

  2. 挥手交流:

    • 客户端,发送消息给服务端(第一次):“我事儿干完了,下班了哦”。
    • 服务端收到消息: 回复客户端(第二次):“晓得了,但你要等哈,我还要确认我手头的事儿处理干净了”,
    • 服务端回复客户端(第三次):"我处理完了,你下班嘛"。
    • 客户端收到消息:回复服务端(第四次):”要得,打卡,下班了,下周见!“
  3. 状态变化:

    • 第一次后: 客户端:ESTAB-LISHED => FIN-WAIT-1 服务端:ESTAB-LISHED

    • 第二次后: 客户端:FIN-WAIT-1 => FIN-WAIT-2 服务端:ESTAB-LISHED => CLOSE-WAIT

    • 第三次后: 客户端:FIN-WAIT-1 => FIN-WAIT-2 服务端:CLOSE-WAIT => CLOSE-WAIT => LAST-ACK

    • 第四次后: 客户端:FIN-WAIT-2 => TIME-WAIT => CLOSED 服务端:LAST-ACK => CLOSED

      TIME-WAIT:是考虑到网络不靠谱的情况。

  4. 除了主动关闭,还可能会同时发起关闭。当然也是4次。

    这个就简单些了,两边同时发关闭(2次),两边相互响应回复(2次)

PS:就不上图了,看完文字,网上找图在巩固一遍吧~~~~~

还要深入?

就这么多了,更多自己去深研,毕竟我是做前端的。【文字囧脸 文字囧脸 文字囧脸】