【TCP】三次握手 与 四次挥手 详解

这篇具有很好参考价值的文章主要介绍了【TCP】三次握手 与 四次挥手 详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在正常情况下,TCP 要经过三次握手建立连接,四次挥手断开连接

【TCP】三次握手 与 四次挥手 详解,TCP,tcp/ip,网络,网络协议

1. 三次握手

【TCP】三次握手 与 四次挥手 详解,TCP,tcp/ip,网络,网络协议

服务端状态转化:

  • [CLOSED -> LISTEN]
    服务器端调用 listen 后进入 LISTEN 状态,等待客户端连接;
  • [LISTEN -> SYN_RCVD]
    一旦监听到连接请求(同步报文段 SYN),就将该连接放入内核等待队列中,并向客户端发送 SYN + ACK 确认报文。
  • [SYN_RCVD -> ESTABLISHED]
    服务端一旦收到客户端的确认报文 ACK,就进入 ESTABLISHED 状态,可以进行读写数据了。

客户端状态转化:

  • [CLOSED -> SYN_SENT]
    客户端调用 connect,发送同步报文段 SYN;
  • [SYN_SENT -> ESTABLISHED]
    connect 调用成功,收到服务器的 SYN + ACK 报文段则进入 ESTABLISHED 状态,开始读写数据;

三次握手有啥用 ? 和可靠性有什么关系 ?

  1. 三次握手相当于 “投石问路”, 检查一下当前这个网络的情况是否满足可靠传输的条件。
    如果网络本身效果比较差,强行进行 TCP 传输,也会涉及到大量的数据丢包,更具体的说,三次握手是在检测通信双方的发送能力和接收能力是否都正常。
  2. 让通信双方能协商一些必要的信息,TCP 通信过程中,需要客户端和服务器之间有一些共同的信息,在三次握手过程中相互之间可以交互一些必要的内容。

举个栗子:
以打电话为例, 这个过程就是在检验通信双方的发送能力和接收能力:

【TCP】三次握手 与 四次挥手 详解,TCP,tcp/ip,网络,网络协议

假如说小明麦克风坏了,喂了几次没回应,就会重传,重试几次还没回应就放弃。

为啥是三次握手,两次行不行? 四次行不行 ?

  • 四次?行,但是没必要,分开传输不如合在一起效率高。
  • 两次 ?不行!两次,意味着缺少最后一次
  • 由上面的两张图就可以知道,两次的话,此时客户端知道双方的发送和接收能力都是正常的
  • 但是服务器这边是残缺的,不知道自己的发送能力和客户端的接收能力是否 OK
  • 此时服务器对于当下能否满足可靠传输心里没底
  • 这第三次交互就是为了给服务器吃一个定心丸。

2. 四次挥手

【TCP】三次握手 与 四次挥手 详解,TCP,tcp/ip,网络,网络协议

服务端状态转化:

  • [ESTABLISHED -> CLOSE_WAIT]
    当客户端主动关闭连接(调用 close),服务器会收到结束报文段 FIN ,服务器返回确认报文段 ACK 并进入 CLOSE_WAIT;
  • [CLOSE_WAIT -> LAST_ACK]
    进入 CLOSE_WAIT 后说明服务器准备关闭连接(需要处理完之前的数据);当服务器真正调用 close (用户代码中执行了 socket.close) 关闭连接时,会向客户端发送 FIN,此时服务器进入 LAST_ACK 状态,等待最后一个 ACK 到来(这个 ACK 是客户端确认收到了 FIN )
  • [LAST_ACK -> CLOSED]
    服务器收到了对 FIN 的 ACK,彻底关闭连接。

客户端状态转化:

  • [ESTABLISHED -> FIN_WAIT_1]
    客户端主动调用 close 时,向服务器发送结束报文段,同时进入 FIN_WAIT_1;
  • [FIN_WAIT_1 -> FIN_WAIT_2]
    客户端收到服务器对结束报文段的确认 ACK,则进入 FIN_WAIT_2,开始等待服务器的结束报文段;
  • [FIN_WAIT_2 -> TIME_WAIT]
    客户端收到服务器发来的结束报文段 FIN,进入 TIME_WAIT,并发出 LAST_ACK;
  • [TIME_WAIT -> CLOSED]
    客户端要等待一个 2MSL(Max Segment Life,报文最大生存时间)的时间,才会进入 CLOSED 状态。

为什么还要 TIME_WAIT ?
为的是给最后一次 ACK 提供重传机会,表面上 A 发送完 ACK 后就没有 A 的事了,按理说 A 可以销毁连接了,但是怕最后一个 ACK 丢包,若最后一个 ACK 丢了,那么 B 一定会因为没收到 ACK 重传 FIN,如果 A 已经销毁连接了,那么就无人能够处理这个 FIN 了,因此 A 不应该释放的太早,要等待一段时间,确保 B 不会重传 FIN 后再真正的销毁连接。

为什么是TIME_WAIT的时间是2MSL?

MSL 是 TCP 报文的最大生存时间,因此 TIME_WAIT 持续存在 2MSL 的话

  • 就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失
    (否则立刻客户端立即重新创建连接时,可能会收到来自上一个进程的迟到的数据(FIN),但是这种数据很可能是错误的);
    【TCP】三次握手 与 四次挥手 详解,TCP,tcp/ip,网络,网络协议

  • 同时也是在理论上保证最后一个报文可靠到达
    (假设最后一个ACK丢失,那么服务器会再重发一个FIN。这时虽然客户端的进程不在了,但是 TCP 连接还在,仍然可以重发 LAST_ACK );

【TCP】三次握手 与 四次挥手 详解,TCP,tcp/ip,网络,网络协议

CLOSE_WAIT
一般而言,对于服务器上出现大量的 CLOSE_WAIT 状态,原因就是服务器没有正确的关闭 socket,没有执行到 socket.close 导致四次挥手没有正确完成。这是一个 BUG。只需要加上对应的 close 即可解决问题。

三次握手和四次挥手的区别

  1. 三次握手一定是客户端发起的(主动发起请求的一方叫做客户端)
    四次握手可能是客户端发起的,也有可能是服务器主动发起的

  2. 三次握手,中间有两次合并和,
    四次握手,中间两次合并不了,不能合并的原因在于 B (被动接收 FIN 的那一方)发送 ACK 和 FIN 的时机不同,
    <1> 四次挥手中,B 发送给 A 的 ACK 是由操作系统内核负责的(除了应用层,TCP/IP … 本身就是属于操作系统层面),那么意味着,当内核收到 FIN 后会立即返回 ACK (我们是感知不到的)
    <2> B 发送给 A 的 FIN,是由用户代码负责的,B 中代码调用了 socket.close() 方法时才触发 FIN 发送,所以要等到用户代码执行到 socket.close() 方法才触发,但是什么时候发送 取决于用户代码,若 <1> <2> 操作之间的时间差较大,就不能合并了,若时间差较小,由于 延时应带和捎带应答 机制,可能会合并。
    而三次握手中 B 发送的 ACK 和 SYN 都是由内核负责的,是同一时机所以能够合并。
    【TCP】三次握手 与 四次挥手 详解,TCP,tcp/ip,网络,网络协议

好啦! 以上就是对 TCP 三次握手 与 四次挥手的讲解,希望能帮到你 !
评论区欢迎指正 !
文章来源地址https://www.toymoban.com/news/detail-730897.html

到了这里,关于【TCP】三次握手 与 四次挥手 详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TCP/IP 三次握手&四次挥手详解,以及异常状态分析

    1.TCP/IP 三次握手 TCP/IP 三次握手过程 主要依靠IP协议报文中的 SYN ACK 两个标识位,SYN 表示是请求连接的报文,ACK 表示确认报文的请求 过程: 客户端处于 CLOSE 状态,服务器处于 LISTEN 状态,客户端向服务器发送请求连接报文,SYN=1 seq=x,发送成功后,客户端状态修改为 SYN_SEND

    2024年02月22日
    浏览(28)
  • 网络扫盲:Tcp协议和hettp、https协议、三次握手四次挥手

    是一种用于传输超文本的协议,是Web应用程序的基础。HTTP协议使用客户端-服务器模型,客户端发出请求,服务器返回响应。HTTP协议是无状态的,即服务器不会记住之前的请求和响应,每个请求和响应都是独立的。HTTP协议使用TCP作为传输协议,通常使用80端口。 HTTP协议的应

    2024年02月04日
    浏览(84)
  • 计算机网络:TCP协议的三次握手和四次挥手与UDP协议区别.

    TCP协议: UDP协议: TCP协议与UDP协议都工作在传输层. TCP协议与UDP协议它们的目标: TCP协议与UDP协议的最大区别: TCP协议保持连接的三个关键步骤: UDP协议: TCP协议与UDP协议主要区别: 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的

    2023年04月15日
    浏览(41)
  • Linux TCP协议——三次握手,四次挥手

    TCP协议是可靠的、面向连接的、基于字节流的传输层通信协议。 TCP的头部结构: 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;(tcp是传输层的协议,端与端之间的数据传输,在TCP和UDP协议当中不会体现出IP) 32位序号:一次TCP通信(从TCP连接建立到断开)过程中某

    2024年02月11日
    浏览(30)
  • TCP 协议(包含三次握手,四次挥手)

    确认应答是可靠传输的最核心机制 接收方反馈一个应答报文(ACK),表示已收到 假设现在 A 想去 B 家里玩游戏,于是 A 给 B 发消息,若消息没有出现错误且顺序正确 结果如下所示: 但网络传输比较复杂,可能存在一种情况\\\"后发先至\\\" 由于数据的长度不同或者传输网络不同,先发

    2024年02月02日
    浏览(30)
  • linux【网络编程】TCP协议通信模拟实现、日志函数模拟、守护进程化、TCP协议通信流程、三次握手与四次挥手

    Tcp通信模拟实现与Udp通信模拟实现的区别不大,一个是面向字节流,一个是面向数据报;udp协议下拿到的数据可以直接发送,tcp协议下需要创建链接,用文件描述符完成数据的读写 1.1.1 接口认识 1.1.1.1 listen:监听socket 1.1.1.2 accept:获取连接 通信就用accept返回的文件描述符,

    2024年02月06日
    浏览(38)
  • 计算机网络面经之TCP三次握手和四次挥手的详解

    1.详细描述三次握手和四次挥手的过程。 2.三次握手可以变成两次握手吗? 3.简述 TCP 连接和关闭的状态转移。 4.简述TCP 四次挥手的 TIME_WAIT状态,以及为什么需要有这个状态 (1)序号(sequence number):seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据

    2024年02月12日
    浏览(35)
  • OSI(七层)网络模型,三次握手四次挥手梳理,Socket.TCP/IP.HTTP三者说明

    目录 一   OSI网络模型 二   三次握手与四次挥手的简单理解 ● 常见问题梳理 三   Socket,TCP/IP,HTTP ① TCP/IP连接 ② HTTP连接 ③ Socket说明 ● 套接字(socket)概念 ● 建立socket连接 四   Socket连接与TCP/IP连接 五   Socket连接与HTTP连接 OSI网络模型也称七层网络模型 7 应用层

    2023年04月09日
    浏览(32)
  • 【TCP 协议】连接管理之 “三次握手,四次挥手”

    哈喽,大家好~我是你们的老朋友: 保护小周ღ    本期为大家带来的是网络编程中的 TCP 传输控制协议保证数据可靠性传输的机制 之一的—— 连接管理 ,通信双方采用 “三次握手” 来建立连接,采用 “四次挥手” 会断开连接,如何进行 ”握手” 和 “挥手” 操作,本文

    2024年02月07日
    浏览(31)
  • 【网络原理进阶篇】自定义协议,协议约定符,三次握手,四次挥手,TCP(保证可靠性机制)和UDP原理

    前言: 大家好,我是 良辰丫 ,我们已经学习了网络原理基础版,初步认识了网络,还学习了网络编程,了解了网络通信的各种程序,接下来我们更深入的了解网络是如何工作的.这篇文章我们主要介绍协议,UDP和TCP的一些原理.💞💞 🧑个人主页:良辰针不戳 📖所属专栏:javaEE初阶 🍎

    2023年04月24日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包