1. TCP是基于连接的协议

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。所谓面向连接,是指通信双方在进行通信之前,事先在双方之间建立起一个完整的、可以彼此沟通的通道,这个通道就是连接。

TCP是基于连接的协议,也就是说,在正式收发数据之前,必须和对方建立可靠的连接。一个TCP连接的建立要经过三次握手,释放连接一般需要四次挥手

2. 连接的建立

建立连接的过程一般需要三次握手,如下图所示:

在握手之前,主动打开连接的客户端结束CLOSE阶段,被动打开的服务器也结束CLOSE阶段,并进入LISTEN阶段。随后进入三次握手阶段:

(1)首先客户端向服务器发送一个SYN包,并等待服务器确认

  • 标志位为SYN,表示请求建立连接
  • 序号为Seq = xx一般为1
  • 随后客户端进入SYN-SENT阶段

(2)服务器接收到客户端发来的SYN包后,对该包进行确认后结束LISTEN阶段,并返回一段TCP报文

  • 标志位为SYNACK,表示确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接
  • 序号为Seq = y
  • 确认号为Ack = x + 1,表示收到客户端的序号Seq并将其值加1作为自己确认号Ack的值,随后服务器端进入SYN-RECV阶段

(3)客户端接收到发送的SYN + ACK包后,明确了从客户端到服务器的数据传输是正常的,从而结束SYN-SENT阶段。并返回最后一段报文

  • 标志位为ACK,表示确认收到服务器端同意连接的信号
  • 序号为Seq = x + 1,表示收到服务器端的确认号Ack,并将其值作为自己的序号值
  • 确认号为Ack= y + 1,表示收到服务器端序号seq,并将其值加1作为自己的确认号Ack的值
  • 随后客户端进入ESTABLISHED

当服务器端收到来自客户端确认收到服务器数据的报文后,得知从服务器到客户端的数据传输是正常的,从而结束SYN-RECV阶段,进入ESTABLISHED阶段,从而完成三次握手

为什么是「三」次握手?

因为次是保证clientserver让对方知道自己具备发送接收能力的最小次数

  • client > serverclient具备发送能力
  • server > clientserver具备接收发送能力
  • client > serverclient具备接收能力

2. 连接的释放

释放连接的过程一般需要四次挥手,如下图所示:

这里假设客户端主动释放连接。在挥手之前主动释放连接的客户端结束ESTABLISHED阶段,随后开始四次挥手:

(1)首先客户端向服务器发送一段TCP报文表明其想要释放TCP连接

  • 标记位为FIN,表示请求释放连接
  • 序号为Seq = u
  • 随后客户端进入FIN-WAIT-1阶段,即半关闭阶段,并且停止向服务端发送通信数据

(2)服务器接收到客户端请求断开连接的FIN报文后,结束ESTABLISHED阶段,进入CLOSE-WAIT阶段并返回一段TCP报文

  • 标记位为ACK,表示接收到客户端释放连接的请求
  • 序号为Seq = v
  • 确认号为Ack = u + 1,表示是在收到客户端报文的基础上,将其序号值加1作为本段报文确认号Ack的值
  • 随后服务器开始准备释放服务器端到客户端方向上的连接

客户端收到服务器发送过来的TCP报文后,确认服务器已经收到了客户端连接释放的请求,随后客户端进入FIN-WAIT-2阶段。

(3)服务器端在发出ACK确认报文后,服务器端会将遗留的待传数据传送给客户端,待传输完成后即经过CLOSE-WAIT阶段,便做好了释放服务器端到客户端的连接准备,再次向客户端发出一段TCP报文

  • 标记位为FINACK,表示已经准备好释放连接了
  • 序号为Seq = w
  • 确认号Ack = u + 1,表示是在收到客户端报文的基础上,将其序号Seq的值加1作为本段报文确认号Ack的值

随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段,并且停止向客户端发送数据

(4)客户端收到从服务器发来的TCP报文,确认了服务器已经做好释放连接的准备,于是进入TIME-WAIT阶段,并向服务器发送一段报文

  • 标记位为ACK,表示接收到服务器准备好释放连接的信号

  • 序号为Seq= u + 1,表示是在已收到服务器报文的基础上,将其确认号Ack值作为本段序号的值

  • 确认号为Ack= w + 1,表示是在收到了服务器报文的基础上,将其序号Seq的值作为本段报文确认号的值

随后客户端开始在TIME-WAIT阶段等待2 MSL。服务器端收到从客户端发出的TCP报文之后进入CLOSED阶段,由此正式确认管关闭服务器端到客户端方向上的连接。客户端等待完2 MSL之后,进入CLOSED阶段,由此完成四次挥手

为什么是「四」次挥手?

因为TCP是一个全双工协议,必须单独拆除每一条信道,两个方向的接收发送都需要单独关闭。


参考:

《LeetBook》

TCP连接的建立和释放过程详解(三次握手、四次挥手)相关推荐

  1. TCP连接的三次握手四次挥手——类比异地恋情侣开始交往和分手(通俗易懂)

    首先,要详细解释的,先看下面两篇文章.这篇文章只是一个类比,可以辅助理解和记忆. 计算机网络--TCP三次握手详解为什么两次不行 计算机网络--TCP四次挥手过程详解 三次握手(开始交往) 男:(写一 ...

  2. TCP连接的建立与释放

    概述 TCP是一个面向连接的协议.无论哪一方向另一方发送数据前,都必须先在双方之间建立一条连接. 这种两端间连接的建立与无连接协议如UDP不同.一端使用UDP向另一端发送数据报时,无需任何预先的握手. ...

  3. TCP三次握手四次挥手过程及其中的状态量

    网上看到过一些有关TCP三次握手四次挥手的过程,觉得有必要总结一下了,对于了解TCP的过程还是有帮助的 1.变量含义 SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DAT ...

  4. TCP三次握手四次挥手详解

    TCP三次握手四次挥手 1. TCP报文格式 2. TCP连接需要解决的问题 3. 三次握手 4. 四次挥手 5. 一些补充问题 1. TCP报文格式 在了解三次握手和四次挥手之前,先知道TCP报文内 ...

  5. TCP连接管理【三次握手-四次挥手】

    https://www.bilibili.com/video/BV19E411D78Q?p=64 通俗易懂的TCP里面的三次握手以及四次挥手 TCP连接传输三个阶段: TCP连接的建立采用客户服务器方 ...

  6. go tcp客户端自动重连_阿里面试: HTTP、HTTPS、TCP/IP、三次握手四次挥手过程?(附全网最具深度讲解)

    前言 这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在阿里面试的时候确实被问到了这个问题,HTTP.HTTPS.TC ...

  7. Android init.rc文件解析过程详解(三)

    Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...

  8. 在深谈TCP/IP三步握手四步挥手原理及衍生问题—长文解剖IP

    如果对网络工程基础不牢,建议通读<细说OSI七层协议模型及OSI参考模型中的数据封装过程?> 下面就是TCP/IP(Transmission Control Protoco/Interne ...

  9. TCP三次握手四次挥手(图解)

    <TCP-IP协议栈概略图与TCP三次握手四次挥手> 目录 1 TCP过程详解 1.1 三次握手 1.2 四次挥手 2 使用tcpdump分析三次握手的过程 2.1 tcpdump抓包和t ...

最新文章

  1. mysql5.6源码编译_MySQL 5.6 源码编译安装
  2. python编辑时怎样换行_python怎么换行输入
  3. 动态配置流处理-BetterCloud如何使用Flink构建报警系统
  4. 用SDL创建一个窗口
  5. 【Foreign】采蘑菇 [点分治]
  6. 很基本的权限功能小结
  7. GPS监控系统解决方案
  8. 线程安全问题的本质详解: 原子性、有序性、可见性
  9. CDH6.2.1安装Kafka出现的问题
  10. Linux RTC驱动模型分析之rtc-proc.c
  11. /dev/null空字符设备文件
  12. 智慧档案库房库房一体化安全管控平台方案【转载】
  13. python arp 网关_python arp欺骗伪造网关代码
  14. wps如何将字体竖着排列_WPS文字中怎么竖着打字?wps文字竖排的设置方法介绍
  15. vmware 安装报错:failed to install hcmon drivers 完美解决(含VMware15激活码)
  16. 解决Cortana显示空白的情况
  17. linux虚拟机扩展磁盘
  18. (四)UPF之常用低功耗单元(Isolation、Level Shifter、Power Switch、State Retention、Always on cell)
  19. layerui如何隐藏按钮?
  20. object mapping for [details] tried to parse field [details] as object, but found concrete value

热门文章

  1. 未选择的路*弗罗斯特
  2. 用Matlab计算多项式的值
  3. c语言编写“输入密码,是否登录成功的程序”
  4. 测试笔试题汇总(测试开发)
  5. 【往届EI已检索】2023年第三届应用数学、建模与智能计算国际研讨会(CAMMIC2023)
  6. activiti的流程事件
  7. PMP49个子过程ITTO总结
  8. IP地址分类及子网掩码划分网段详解!!!
  9. MySQL 生成随机数字、字符串、日期、验证码以及 UUID
  10. 人脸识别技术的简单认识(含原理)