美文网首页
TCP的三次握手与四次挥手

TCP的三次握手与四次挥手

作者: 好有魔力 | 来源:发表于2019-08-16 14:49 被阅读0次

    TCP的三次握手

    链接建立

    第1步:从客户端开始发送 SYN (同步)字节,告诉服务器客户在(待建立的)连接中初始序列编号(i),向服务器请求建立连接

    第2步:服务器做一些准备工作,并发送给客户端自己的序列编号SYN,并且对第1步做出应答 ACK i +1 ,告诉客户端已经准备好建立连接

    第3步:客户端接收到 服务器 发来的 SYN J ,和 ACK i+ 1后,知道服务器已经准备好 ,发送 ACK J +1 建立连接

    上述过程与socket代码有何联系?

    客户端发起TCP连接的过程是:

    client

    服务器处理TCP逻辑一般是:

    server

    在客户端, tcp 的 三次握手过程 都在 connect 函数中完成 。 在服务端,握手的过程在 accept 函数中. 还可知道 accept 和 connect 函数都是阻塞当前线程的. 那么是什么时候解除阻塞呢? 答案就在三次握手的过程中.

    合并

    由此可知 client 和 server 都是在接收到自己期望的ACK之后,才解除对当前线程的阻塞 ,保证了连接建立的可靠, 第一次的 ack 由SYN i 触发,第二次的 ACK 由 SYN j触发,这也是 TCP 握手是三次的原因.

    TCP的四次挥手(直接与socket 结合)

    image.png
    普通情况:
    1. 客户端 首先调用 close , 是主动方, 向服务器 发送 FIN 分节,表示此时客户端 已经没有数据要发送, client 此时进入等待状态 FIN_WAIT_1

    2. 服务端 接收 到 FIN , 向 客户端 发送 ACK ,并进入 CLOSE_WAIT 状态

    3. 在 CLOSE_WAIT 状态下的 服务端 ,将没有发送完的数据传送给 客户端 , 发送 FIN 表示服务端数据已经发送完成. 客户端 在接收到 FIN 后 回送 ACK 释放资源,客户端 关闭了TCP 连接

    4. 服务端 接收到 ACK 之后 释放资源, 服务端关闭连接

    由于 客户端 在close 方法后,并不能保证此时服务端 的数据都发送完毕, 所以多了一步 服务端 通知 客户端 数据发送完毕的过程, 导致了关闭连接要"四次挥手".

    相关文章

      网友评论

          本文标题:TCP的三次握手与四次挥手

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