(图解)TCP的三次握手,四次挥手

news2024/11/21 11:39:30

文章目录

  • 1. TCP包头结构
  • 1.1固定部分字段
    • 1.2 可变选项部分字段
  • 2. TCP的三次握手与四次挥手
    • 2.1 服务器端状态转换
    • 2.2 客户端状态转换
  • 3. TCP的状态转换图
      • 一、状态说明
      • 二、状态转换

1. TCP包头结构

TCP(Transmission Control Protocol)传输控制协议是一种面向连接的、可靠的、基于字节流的传输层协议。TCP报文段头部由长度为20字节的固定部分和长度可变的选项部分组成.
tcp

1.1固定部分字段

  1. 源端口:占2字节,表示发送方的端口号。端口是传输层与应用层的服务接口,传输层的复用和分用功能都要通过端口才能实现。
  2. 目的端口:占2字节,表示发送方的目标端口号。
  3. 序号占4字节,用于说明该TCP报文段所携带的数据中第一个字节的编号。TCP连接中传送的数据流中的每一个字节都编上一个序号,序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。这是TCP保证数据顺序性的关键字段。
  4. 确认号占4字节,用来表示希望接受的下一个字节的序号,也表示对方所发送的、在该字节之前的字节已经正确接收。这是TCP保证数据可靠性的重要机制。
  5. 数据偏移/首部长度占4位指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。数据偏移的单位是32位字(以4字节为计算单位),因此最大能表示的数值为15,即TCP报文段首部的长度最长为60字节(15×4字节)。该字段也被称为“首部长度”。
  6. 保留字段占6位,保留为将来使用,目前的TCP报文段中该字段置为0。
  7. URG(紧急标志字段):占1位,用于指示紧急指针字段是否有效。当URG=1时,表明紧急指针字段有效,告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
  8. ACK(确认标志字段)占1位用于指示确认字段是否有效。只有当ACK=1时,确认号字段才有效;当ACK=0时,确认号无效。
  9. PSH(急迫标志字段)占1位,用于要求马上发送数据。当PSH=1时,接收TCP收到报文段后,会尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
  10. RST(复位标志字段)占1位,用于对本TCP连接进行复位,还可以用于拒绝非法的数据段或数据连接。当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
  11. SYN(同步标志字段)占1位表示同意建立连接的连接相应TCP报文。当SYN=1时,表示发起一个连接请求或连接接受报文。
  12. FIN(终止标志字段)占1位,用来释放TCP连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
  13. 窗口大小占2字节,通过窗口大小字段的值告知对方自己接收窗口大小,用于实现TCP的流量控制和差错恢复。这个值是本机期望一次接收的字节数。
  14. 校验和占2字节,校验的范围包括TCP报文段头部、用户数据以及一个伪TCP头部。校验和字段用于保证数据的完整性。
  15. 紧急指针占2字节(或16位),指出本报文段中紧急数据的最后一个字节的序号(有的说法是字节数)。紧急指针字段仅在URG=1时有效,它是一个偏移量,和序号字段中的值相加可得到紧急数据最后一个字节的序号。

1.2 可变选项部分字段

TCP包头的可变选项部分用于实现除TCP报文段头部指定功能外的扩展功能,其字节长度最大为40字节。常见的TCP选项包括:

  1. 选项结束(EOP,0x00):占1字节,放在末尾用于填充,表示首部已经没有更多的消息,应用数据在下一个32位字开始处。
  2. 无操作(NOP,0x01):占1字节,也用于填充,放在选项的开头。
  3. MSS(最大报文段长度):格式包括种类(1字节,值为2)、长度(1字节,值为4)和数值(2字节)。用于在连接开始时确定MSS的大小,如果没有确定,就用默认的(一般实现是536字节)。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节。”
  4. 窗口扩大因子:格式包括种类(1字节,值为3)、长度(1字节,值为3)和数值(1字节)。当通信双方认为首部的窗口值还不够大的时候,在连接开始时用这个来定义更大的窗口。仅在连接开始时有效,一经定义,通信过程中无法更改。

2. TCP的三次握手与四次挥手

如图

hank

2.1 服务器端状态转换

  1. [CLOSED -> LISTEN]

    • 服务器端的套接字在调用listen函数后,进入LISTEN状态。一旦服务器监听到连接请求(SYN报文段),它会将该连接放入内核的等待队列中,并将套接字的状态从LISTEN改为SYN_RCVD(同步接收)。
  2. [SYN_RCVD -> ESTABLISHED]

    • 当服务器收到客户端的SYN报文并发送了SYN-ACK后,如果成功接收到客户端的ACK确认报文,服务器套接字的状态会从SYN_RCVD变为ESTABLISHED。此时,连接已经建立,服务器和客户端可以开始传输数据。
  3. [ESTABLISHED -> CLOSE_WAIT]

    • 当客户端主动关闭连接(通过调用close函数),服务器会收到一个FIN报文段(结束报文段)。服务器会发送一个ACK报文段作为确认,并将套接字状态更改为CLOSE_WAIT。这个状态表示服务器已经知道了客户端想要关闭连接,但服务器本身可能还需要处理一些未完成的数据或执行一些清理工作。
  4. [CLOSE_WAIT -> LAST_ACK]

    • 当服务器完成所有需要处理的数据或清理工作后,它会调用close函数来关闭连接。此时,服务器会向客户端发送一个FIN报文段,并将套接字状态更改为LAST_ACK。这个状态表示服务器正在等待客户端对FIN报文段的最后一个ACK确认。
  5. [LAST_ACK -> CLOSED]

    • 当服务器收到客户端对FIN报文段的ACK确认后,套接字的状态会从LAST_ACK变为CLOSED。此时,连接已经完全关闭,服务器不再保留与该连接相关的任何资源。

2.2 客户端状态转换

  1. [CLOSED -> SYN_SENT]

    • 当客户端调用connect函数尝试建立连接时,它会发送一个SYN报文段到服务器,并将套接字状态更改为SYN_SENT。这个状态表示客户端已经发送了同步请求,并正在等待服务器的响应。
  2. [SYN_SENT -> ESTABLISHED]

    • 如果客户端成功接收到服务器的SYN-ACK报文段,并发送了ACK确认报文段,那么套接字的状态会从SYN_SENT变为ESTABLISHED。此时,连接已经建立,客户端可以开始发送数据。
  3. [ESTABLISHED -> FIN_WAIT_1]

    • 当客户端主动关闭连接(通过调用close函数),它会发送一个FIN报文段到服务器,并将套接字状态更改为FIN_WAIT_1。这个状态表示客户端已经发送了结束请求,并正在等待服务器的确认。
  4. [FIN_WAIT_1 -> FIN_WAIT_2]

    • 当客户端收到服务器对FIN报文段的ACK确认后,套接字的状态会从FIN_WAIT_1变为FIN_WAIT_2。这个状态表示客户端已经知道了服务器已经收到了结束请求,并正在等待服务器的结束请求。
  5. [FIN_WAIT_2 -> TIME_WAIT]

    • 当客户端收到服务器的FIN报文段(表示服务器也准备关闭连接)时,它会发送一个ACK确认报文段,并将套接字状态更改为TIME_WAIT。这个状态是一个等待状态,客户端需要等待足够的时间(通常是2倍的MSL,即报文最大生存时间),以确保所有可能的延迟或重复的报文都被处理完毕
  6. [TIME_WAIT -> CLOSED]

    • 当等待时间结束后,套接字的状态会从TIME_WAIT变为CLOSED。此时,连接已经完全关闭,客户端可以释放与该连接相关的所有资源。

3. TCP的状态转换图

status

TCP(Transmission Control Protocol,传输控制协议)的状态转换图描述了TCP连接从建立到终止的整个过程中可能经历的各种状态以及这些状态之间的转换。:

一、状态说明

  1. CLOSED:初始状态,表示TCP连接未建立或已关闭。
  2. LISTEN:服务端进入的状态,表示服务端正在监听来自客户端的连接请求。
  3. SYN_SENT:客户端进入的状态,表示客户端已发送SYN(同步)报文段,用于发起连接请求。
  4. SYN_RCVD:服务端进入的状态,表示服务端已接收到客户端发送的SYN报文段,并发送了SYN+ACK(同步+确认)报文段作为响应。
  5. ESTABLISHED:表示TCP连接已经建立成功,客户端和服务端可以进行数据传输。
  6. FIN_WAIT_1:客户端进入的状态,表示客户端已经发送了连接关闭请求(FIN),等待服务端的确认或进一步数据传输。
  7. FIN_WAIT_2:客户端进入的状态,表示客户端已经收到了服务端对连接关闭请求的确认(ACK),继续等待服务端发送连接关闭请求。
  8. CLOSE_WAIT:服务端进入的状态,表示服务端收到了客户端的连接关闭请求(FIN),并已经发送确认(ACK),等待关闭连接。
  9. TIME_WAIT:表示连接已经关闭,但为了确保网络中所有数据包都被正确处理,等待一段时间(2MSL,最长报文段寿命的两倍)后才彻底释放连接。此外,该状态也出现在双方同时关闭连接,即都发送了FIN报文的情况下。
  10. LAST_ACK:表示被动关闭的一方在发送FIN报文后,等待对方的ACK报文。注意,虽然在一些资料中LAST_ACK被列为TCP的一种状态,但在某些描述中,它可能被视为CLOSE_WAIT和TIME_WAIT之间的一个过渡阶段,而不是一个独立的状态。不过,为了全面解释,这里仍将其列出。

另外,还有一个较为罕见的状态CLOSING,表示一方发送FIN报文后,并没有收到对方的ACK报文,反而收到了对方的FIN报文。这通常发生在双方几乎同时关闭SOCKET的情况下。

二、状态转换

  1. 连接建立过程

    • 从CLOSED状态开始,客户端发送SYN报文。
    • 服务端收到SYN报文后,回复SYN+ACK报文。
    • 客户端收到SYN+ACK报文后,发送ACK报文进行确认。
    • 双方进入ESTABLISHED状态,表示连接已建立。
  2. 连接关闭过程

    • 在数据传输完成后,一方发送FIN报文段,另一方收到后发送ACK确认。
    • 发送FIN报文的一方进入FIN_WAIT_1状态(客户端)或CLOSE_WAIT状态(服务端)。
    • 根据情况,发送方可能进入FIN_WAIT_2状态,等待对方发送FIN报文。
    • 接收方在发送完自己的数据后,发送FIN报文,然后等待对方的ACK确认。
    • 双方最终进入TIME_WAIT状态(通常是主动关闭连接的一方),等待2MSL时间后彻底释放连接。
  3. 特殊情况

    • 在FIN_WAIT_1状态下,如果收到了对方同时带FIN标志和ACK标志的报文,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
    • 如果出现异常情况,如网络故障或设备重启,可能导致状态转换不按正常流程进行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2244651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv(c++)----图像的读取以及显示

opencv(c)----图像的读取以及显示 imread: 作用:读取图像文件并将其加载到 Mat 对象中。参数: 第一个参数是文件路径,可以是相对路径或绝对路径。第二个参数是读取标志,比如 IMREAD_COLOR 表示以彩色模式读取图像。 返回值&#x…

GIT 入门详解指南

前言: 注:本博客仅用于记录本人学习过程中对git的理解,仅供学习参考,如有异议请自行查资料求证 安装 使用git之前必须完成git的安装,Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行 git 安装教程 基本…

基于YOLOv8深度学习的违法暴力行为检测系统研究与实现(PyQt5界面+数据集+训练代码)

本研究提出了一种基于YOLOV8深度学习模型的违法暴力行为检测系统,并结合PyQt5框架实现了一个直观且易于操作的用户界面。随着监控系统在公共场所的广泛应用,如何快速、准确地识别并检测视频中的暴力和违法行为已成为当今公共安全管理中的重要挑战。现有的…

Flutter:RotationTransition旋转动画

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationController late AnimationController _controller;overridevoid initState() {super…

Java基础知识(六)

文章目录 StringString、StringBuffer、StringBuilder 的区别&#xff1f;String 为什么是不可变的?字符串拼接用“” 还是 StringBuilder?String#equals() 和 Object#equals() 有何区别&#xff1f;字符串常量池的作用了解吗&#xff1f;String s1 new String("abc&qu…

微积分复习笔记 Calculus Volume 1 - 6.3 Volumes of Revolution: Cylindrical Shells

6.3 Volumes of Revolution: Cylindrical Shells - Calculus Volume 1 | OpenStax

开源在线聊天系统Fiora本地Docker快速搭建并实现与好友远程聊天

文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 相信大家在聊天时候总是很没安全感&#xff0c;比如在和小姐妹背着男朋友聊一些不能说的坏话&#xff0c;或者背着女朋友和兄…

基于Amazon Bedrock:一站式多模态数据处理新体验

目录 引言 关于Amazon Bedrock 基础模型体验 1、进入环境 2、发现模型及快速体验 3、打开 Amazon Bedrock 控制台 4、通过 Playgrounds 体验模型 &#xff08;1&#xff09;文本生成 &#xff08;2&#xff09;图片生成 关于资源清理 结束语 引言 在云计算和人工智能…

11.21 代码随想录Day37打卡(动态规划)

完全背包 题目&#xff1a;小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等&#xff0c;它们各自占据不同…

el-table实现最后一行合计功能并合并指定单元格

效果图如下&#xff1a; 表格代码如下&#xff1a; <el-table width"100%"ref"tableRef" style"margin-bottom: 15px;":data"jlData"class"tableHeader6"header-row-class-name"headerStyleTr6":row-class-n…

【Amazon】亚马逊云科技Amazon DynamoDB 实践Amazon DynamoDB

Amazon DynamoDB 是一种完全托管的 NoSQL 数据库服务&#xff0c;专为高性能和可扩展性设计&#xff0c;特别适合需要快速响应和高吞吐量的应用场景&#xff0c;如移动应用、游戏、物联网和实时分析等。 工作原理 Amazon DynamoDB 在任何规模下响应时间一律达毫秒级&#xff…

基于arduino 用ESP8266获取实时MAX30102 血氧数据动态曲线显示在网页上

基于arduino 用ESP8266获取实时MAX30102 血氧数据动态曲线显示在网页上 原理&#xff1a; ESP8266获取MAX30102 血氧数据&#xff08;R,IR,G的值&#xff09;发送到路由器局域网内&#xff0c;局域网内的手机电脑&#xff0c;访问ESP的ip地址&#xff0c;获取实时的血氧数据动…

PostgreSQL常用时间函数与时间计算提取示例说明

文章目录 常用函数与常量to_timestamp(字符串转时间戳、数字转时间戳)date与to_date(字符串转日期、时间戳转日期)interval(时间计算)基本操作与格式混合运算 to_char(各种时间转字符串)extract(提取时间字段&#xff0c;年月日时分秒&#xff0c;周、季度&#xff0c;第几周、…

【MATLAB源码-第218期】基于matlab的北方苍鹰优化算法(NGO)无人机三维路径规划,输出做短路径图和适应度曲线.

操作环境&#xff1a; MATLAB 2022a 1、算法描述 北方苍鹰优化算法&#xff08;Northern Goshawk Optimization&#xff0c;简称NGO&#xff09;是一种新兴的智能优化算法&#xff0c;灵感来源于北方苍鹰的捕猎行为。北方苍鹰是一种敏捷且高效的猛禽&#xff0c;广泛分布于北…

Android Studio启动模拟器显示超时

问题报错: Timed out after 300seconds waiting for emulator to come online. 解决方案&#xff1a;升级Android Emulator 情况二&#xff1a;Error while waiting for device:AVD Pixel_4a_API_32 is already running. If that is not the case, delete the files at E:\An…

Stable Diffusion经典应用场景

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…

linux 常用命令指南(存储分区、存储挂载、docker迁移)

前言&#xff1a;由于目前机器存储空间不够&#xff0c;所以‘斥巨资’加了一块2T的机械硬盘&#xff0c;下面是对linux扩容的一系列操作&#xff0c;包含了磁盘空间的创建、删除&#xff1b;存储挂载&#xff1b;docker迁移&#xff1b;anaconda3迁移等。 一、存储分区 1.1 …

AI时代,百度的三大主义

现实主义、长期主义、理想主义。 定焦One&#xff08;dingjiaoone&#xff09;原创 作者 | 苏琦 郑浩钧 编辑 | 魏佳 “人工智能很像是一次新的工业革命&#xff0c;这意味着它不会三五年就结束&#xff0c;也不会一两年就出现‘超级应用’&#xff0c;它更像是三五十年对于整…

服务器Docker OOM RSS高问题排查思路

优质博文&#xff1a;IT-BLOG-CN 防走弯路为防止走弯路&#xff0c;强烈建议先仔细阅读以下加粗内容&#xff1a; 如果你的应用是因为公司最近降成本调小实例物理内存才出现docker oom&#xff0c;而之前从来没有出现过&#xff0c;那么大概率是堆内存太大导致&#xff0c;这种…

Ubuntu Linux使用前准备动作_使用root登录图形化界面

Ubuntu默认是不允许使用 root 登录图形化界面的。这是出于安全考虑的设置。但如果有需要&#xff0c;可以通过以下步骤来实现使用 root 登录&#xff1a; 1、设置 root 密码 打开终端&#xff0c;使用当前的管理员账户登录系统。在终端中输入命令sudo passwd root&#xff0c…