博客
关于我
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/

    你可能感兴趣的文章
    npm切换源淘宝源的两种方法
    查看>>
    npm前端包管理工具简介---npm工作笔记001
    查看>>
    npm包管理深度探索:从基础到进阶全面教程!
    查看>>
    npm升级以及使用淘宝npm镜像
    查看>>
    npm发布包--所遇到的问题
    查看>>
    npm发布自己的组件UI包(详细步骤,图文并茂)
    查看>>
    npm和package.json那些不为常人所知的小秘密
    查看>>
    npm和yarn清理缓存命令
    查看>>
    npm和yarn的使用对比
    查看>>
    npm如何清空缓存并重新打包?
    查看>>
    npm学习(十一)之package-lock.json
    查看>>
    npm安装 出现 npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! 解决方法
    查看>>
    npm安装crypto-js 如何安装crypto-js, python爬虫安装加解密插件 找不到模块crypto-js python报错解决丢失crypto-js模块
    查看>>
    npm安装教程
    查看>>
    npm报错Cannot find module ‘webpack‘ Require stack
    查看>>
    npm报错Failed at the node-sass@4.14.1 postinstall script
    查看>>
    npm报错fatal: Could not read from remote repository
    查看>>
    npm报错File to import not found or unreadable: @/assets/styles/global.scss.
    查看>>
    npm报错TypeError: this.getOptions is not a function
    查看>>
    npm报错unable to access ‘https://github.com/sohee-lee7/Squire.git/‘
    查看>>