博客
关于我
TCP 三次握手 与 四次挥手
阅读量:341 次
发布时间:2019-03-04

本文共 1653 字,大约阅读时间需要 5 分钟。

TCP 三次握手与四次挥手解析

TCP 是一种双向通信协议,能够实现客户端与服务器之间的数据传输。为了建立和断开连接,TCP 使用三次握手进行连接建立,四次挥手进行连接释放。以下从基础到详细解析这两种过程。

TCP 三次握手

TCP 连接的建立需要三次握手完成,主要目的是确保双向通信的可靠性和顺序性。以下是具体过程:

  • SYN 位点:客户端向服务器发送一个 SYN 包,表示请求建立连接。SYN 包携带了客户端随机生成的序列号,用于标识后续数据包的顺序。
  • ACK 确认:服务器接收到 SYN 后,会回传一个 ACK 包。ACK 包中包含了一个确认号,确认客户端的序列号已经被接收。此外,服务器会在 ACK 中指定自己希望接收的下一个序列号,以便客户端知道后续数据包的编号。
  • SYN-ACK:客户端接收到服务器的 ACK 后,会向服务器发送一个 SYN-ACK 包。SYN-ACK 包既携带了客户端的序列号,又包含了对服务器序列号的确认。
  • 连接建立完成:服务器接收到 SYN-ACK 后,会向客户端发送一个 ACK 包,双方完成三次握手,正式建立连接。
  • 通过三次握手,TCP 不仅确保了通信双方能够互相发送数据,还保证了数据包的顺序性和可靠性。如果仅进行两次握手,可能会导致一方的初始序列号无法被确认,影响通信的可靠性。

    为什么 TCP 需要三次握手

    三次握手的主要作用包括信息对等和防止超时。通过三次握手,客户端和服务器能够相互告知初始序列号,并且彼此确认对方的序列号。这种机制避免了连接请求可能因为超时而导致的脏连接问题,确保了连接的可靠性。

    TCP 四次挥手

    断开一个 TCP 连接需要四次挥手完成,原因在于 TCP 是双向通信协议,两个方向的连接都需要关闭。在每个方向上,需要发送一个 FIN 请求,并等待对方的确认(ACK)。以下是详细过程:

  • 发送 FIN 请求:当一方决定关闭连接时,会向对方发送一个 FIN 请求,表示不再发送更多数据。
  • 等待 ACK 确认:发送 FIN 后,接收方需要确认接收到这个请求。ACK 包中包含了对 FIN 的确认,并指定了接收方希望接收的下一个序列号。
  • 发送另一个 FIN 请求:在接收到 ACK 后,接收方会再次向发送方发送一个 FIN 请求,表示自己也要关闭连接。
  • 等待最终 ACK 确认:发送方在收到第二个 FIN 请求后,会向接收方发送 ACK 确认。只有接收方也确认接收到这个 ACK,双方的连接才正式关闭。
  • 为什么需要等待 2MSL

    在四次挥手过程中,双方需要等待 2MSL(最大报文生存时间,大约 4 秒)以确保所有相关报文都已消失。2MSL 的目的是为了防止由于网络延迟或数据丢失导致的连接异常。具体原因包括:

  • 防止丢失的报文:服务器发送 FIN 请求后,需要让客户端确认接收。如果客户端在 2MSL 内没有确认,服务器会重新发送 FIN 请求。
  • 避免旧报文干扰:2MSL 时间足够长,可以确保所有与当前连接相关的报文都已从网络中消失,防止旧报文重复发送或干扰新连接。
  • TIME_WAIT 与 CLOSE_WAIT 的区别

    在四次挥手过程中,连接状态会经历两个阶段:TIME_WAIT 和 CLOSE_WAIT。

    • TIME_WAIT:表示连接已经请求断开,但尚未等待对方的确认。这种状态提示连接已经被一方主动关闭,等待对方的 ACK 确认。
    • CLOSE_WAIT:表示连接已经请求断开,并且已经等待了对方的 ACK 确认。这种状态提示连接仍然需要继续等待。

    两者都反映了连接关闭的过程,但区别在于状态的不同阶段。TIME_WAIT 表示等待确认,而 CLOSE_WAIT 表示正在等待确认。

    总结

    TCP 的三次握手和四次挥手机制确保了连接的可靠性和稳定性。三次握手通过三次通信确认双向序列号的对等,确保连接建立的可靠性。四次挥手则通过四次通信确认双向连接的关闭,避免了因网络延迟或数据丢失导致的连接异常。理解这些机制是掌握 TCP通信的核心内容。

    转载地址:http://lcjh.baihongyu.com/

    你可能感兴趣的文章
    nodejs模块——fs模块
    查看>>
    Nodejs模块、自定义模块、CommonJs的概念和使用
    查看>>
    nodejs生成多层目录和生成文件的通用方法
    查看>>
    nodejs端口被占用原因及解决方案
    查看>>
    Nodejs简介以及Windows上安装Nodejs
    查看>>
    nodejs系列之express
    查看>>
    nodejs系列之Koa2
    查看>>
    Nodejs连接mysql
    查看>>
    nodejs连接mysql
    查看>>
    NodeJs连接Oracle数据库
    查看>>
    nodejs配置express服务器,运行自动打开浏览器
    查看>>
    Nodemon 深入解析与使用
    查看>>
    NodeSession:高效且灵活的Node.js会话管理工具
    查看>>
    node~ http缓存
    查看>>
    node不是内部命令时配置node环境变量
    查看>>
    node中fs模块之文件操作
    查看>>
    Node中同步与异步的方式读取文件
    查看>>
    Node中的Http模块和Url模块的使用
    查看>>
    Node中自启动工具supervisor的使用
    查看>>
    Node入门之创建第一个HelloNode
    查看>>