美文网首页前端100问
【前端100问】Q16:谈谈你对 TCP 三次握手和四次挥手的理

【前端100问】Q16:谈谈你对 TCP 三次握手和四次挥手的理

作者: alanwhy | 来源:发表于2020-12-12 20:30 被阅读0次

    写在前面

    此系列来源于开源项目:前端 100 问:能搞懂 80%的请把简历给我
    为了备战 2021 春招
    每天一题,督促自己
    从多方面多角度总结答案,丰富知识
    谈谈你对 TCP 三次握手和四次挥手的理解

    正文回答

    q16-1.png

    三次握手讲解

    1. 客户端发送位码为 syn = 1,随机产生 seq number=1234567 的数据包到服务器,服务器由 SYN=1 知道客户端要求建立联机(客户端:我要连接你)
    2. 服务器收到请求后要确认联机信息,向 A 发送 ack number=(客户端的 seq+1),syn=1,ack=1,随机产生 seq=7654321 的包(服务器:好的,你来连吧)
    3. 客户端收到后检查 ack number 是否正确,即第一次发送的 seq number+1,以及位码 ack 是否为 1,若正确,客户端会再发送 ack number=(服务器的 seq+1),ack=1,服务器收到后确认 seq 值与 ack=1 则连接建立成功。(客户端:好的,我来了)

    为什么 http 建立连接需要三次握手,不是两次或四次?

    三次是最少的安全次数,两次不安全,四次浪费资源;

    TCP 关闭连接过程

    1. Client 向 Server 发送 FIN 包,表示 Client 主动要关闭连接,然后进入 FIN_WAIT_1 状态,等待 Server 返回 ACK 包。此后 Client 不能再向 Server 发送数据,但能读取数据。
    2. Server 收到 FIN 包后向 Client 发送 ACK 包,然后进入 CLOSE_WAIT 状态,此后 Server 不能再读取数据,但可以继续向 Client 发送数据。
    3. Client 收到 Server 返回的 ACK 包后进入 FIN_WAIT_2 状态,等待 Server 发送 FIN 包。
    4. Server 完成数据的发送后,将 FIN 包发送给 Client,然后进入 LAST_ACK 状态,等待 Client 返回 ACK 包,此后 Server 既不能读取数据,也不能发送数据。
    5. Client 收到 FIN 包后向 Server 发送 ACK 包,然后进入 TIME_WAIT 状态,接着等待足够长的时间(2MSL)以确保 Server 接收到 ACK 包,最后回到 CLOSED 状态,释放网络资源。
    6. Server 收到 Client 返回的 ACK 包后便回到 CLOSED 状态,释放网络资源。

    为什么要四次挥手?

    TCP 是全双工信道,何为全双工就是客户端与服务端建立两条通道

    通道 1:客户端的输出连接服务端的输入

    通道 2:客户端的输入连接服务端的输出

    两个通道可以同时工作:客户端向服务端发送信号的同时服务端也可以向客户端发送信号。

    所以关闭双通道的时候就是这样:

    • 客户端:我要关闭输入通道了。
    • 服务端:好的,你关闭吧,我这边也关闭这个通道。
    • 服务端:我也要关闭输入通道了。
    • 客户端:好的你关闭吧,我也把这个通道关闭。

    幽默一下

    男:我要挂了哦
    女:等哈,我还要敷面膜
    女:我敷完了,现在可以挂了
    男:我舍不得挂,你挂吧
    女:好吧,我挂了
    男:等了 2MSL 听见嘟嘟嘟的声音后挂断

    相关文章

      网友评论

        本文标题:【前端100问】Q16:谈谈你对 TCP 三次握手和四次挥手的理

        本文链接:https://www.haomeiwen.com/subject/fsyygktx.html