文章目录

  • 前言
  • 一、TCP三报文握手
  • 二、TCP四报文挥手
  • 三、TCP保活计时器


前言

  TCP通信,通常需要经历三个阶段:三报文握手->发送,接收数据->四报文挥手。
在这里插入图片描述

一、TCP三报文握手

  三报文握手处于TCP的连接建立阶段,主要解决了以下的问题:

  • 使TCP通信的双方知道对方的存在,确认双方的接收与发送能力。
    • 客户端发送 SYN 报文,请求建立连接。
    • 服务器回复 SYN + ACK 报文,表示“我收到了你的请求,也同意建立连接”。
    • 客户端再次回复 ACK 报文,表示“我也收到了你的确认”。
  • 在握手报文中可以携带 TCP 选项字段,允许双方就这些参数进行协商,使得通信性能更优。
    • MSS(最大报文段长度)
    • Window Scale(窗口扩大因子)
    • SACK(选择性确认)
    • Timestamps(时间戳)等
  • 使TCP双方可以对运输的实体资源进行分配和初始化。在三次握手完成后,操作系统会:
    • 在内核中为该连接分配 socket 缓存(接收缓冲区、发送缓冲区)
    • 初始化连接状态(如 TCP 状态机进入 ESTABLISHED 状态)

  三报文握手的流程如下,分为TCP服务TCP客户两个角色:

  1. 最初,两端的TCP进程都处于关闭的状态。TCP连接进程首先创建传输控制块**(服务端和客户都要)**,用于存储TCP连接中的一些重要信息,随后TCP服务进入监听状态。

  2. TCP客户发送连接请求报文段,该请求报文段不能携带数据,TCP客户进入同步已发送状态,连接请求报文段的关键参数:

    • SYN:1
    • seq:设置为初始值x,作为TCP客户进程的初始序号。
      在这里插入图片描述
  3. TCP服务接收到TCP客户的连接请求报文段,并且向TCP客户发送连接请求确认报文段(不能携带数据),TCP服务进入同步已接收状态,连接请求确认报文段的关键参数:

    • SYN:1
    • ACK:1
    • seq:设置为初始值y,作为TCP服务进程的初始序号。
    • ack:x + 1
      在这里插入图片描述
  4. TCP客户接收到TCP服务的请求确认报文后,最后向服务器发送一个普通TCP确认报文段**(可以携带数据,也可以不携带,如果不携带数据,TCP客户进程要发送的下一个数据报文段的seq依旧是x + 1,否则是x + 2)**,TCP客户进入连接已建立状态。普通TCP确认报文段的关键参数:

    • ACK:1
    • seq:x + 1
    • ack:y + 1
      在这里插入图片描述
      在这里插入图片描述
  5. TCP服务在接收到普通TCP确认报文段后,就会进入连接已建立状态。然后双方基于已建立的连接,进行通信。
    在这里插入图片描述

TCP服务和TCP客户,初始都是关闭状态,由TCP客户去主动打开。
当TCP服务创建了传输控制块后,进入监听状态
TCP客户发送第一次握手的消息时,进入同步已发送状态
TCP服务发送第二次握手的消息时,进入同步已接收状态
TCP客户发送第三次握手的消息时,进入连接已建立状态
TCP服务接收到TCP客户的最后一次握手消息,进入连接已建立状态。
三报文握手,TCP客户占两次,TCP服务占一次。

  为什么TCP服务在接收到TCP客户的连接请求报文段,并且向TCP客户发送连接请求确认报文段后**(二次握手),不是立刻进入连接已建立状态,而是需要等待TCP服务再次发送一个普通TCP确认报文段,才会进入连接已建立状态?(三次握手)**
  假设使用二次握手,那么可能会存在如下图的情况。所以TCP服务需要等到TCP客户在接收到连接请求确认报文段后,再发送一个普通TCP确认报文段,才能进入连接已建立状态。
在这里插入图片描述

二、TCP四报文挥手

  四报文挥手处于TCP的连接终止阶段,是由TCP客户发起的。它的流程:

  1. TCP客户主动关闭连接,发送TCP连接释放报文段并进入终止等待1状态,TCP连接释放报文段的关键参数:
    • FIN:1
    • ACK:1
    • seq:u = TCP客户进程传送过的最后一个字节的序号 + 1
    • ack:v = TCP客户进程已收到的最后一个字节的序号 + 1

在这里插入图片描述

  1. TCP服务进程,在接收到TCP客户释放连接的报文后,会发送一个普通的TCP确认报文段,并且自身进入关闭等待状态。普通的TCP确认报文段的关键参数:
    • ACK:1
    • seq:v
    • ack:u + 1,作为对于TCP连接释放报文段的确认

  这时的TCP连接处于半关闭状态,也就是TCP客户已经没有数据需要发送了,但是TCP服务如果有数据需要发送,TCP客户还是需要接收的。

在这里插入图片描述

  1. TCP客户在接收到确认报文段后,进入终止等待2状态。等待TCP服务发送TCP连接释放报文段。(等到TCP服务已经没有数据要发送了)
  2. TCP服务发送TCP连接释放报文段,进入最后确认状态,TCP连接释放报文段的关键参数:
    • FIN:1
    • ACK:1
    • seq:w,因为在半关闭状态下,TCP服务可能又发送了一些数据。
    • ack:u + 1,对收到的TCP客户的连接释放报文的重复确认

在这里插入图片描述

  1. TCP客户在接收到TCP服务的连接释放报文段后,发送TCP普通确认报文段,进入时间等待状态。TCP普通确认报文段的关键参数:
    • ACK:1
    • seq:u + 1,先前TCP客户发送的连接释放报文段,虽然不携带数据,但是要消耗一个序号。
    • ack:w + 1,对收到的TCP服务连接释放报文段的确认。

在这里插入图片描述

6. TCP服务在接收到TCP客户的TCP普通确认报文段后,就进入关闭状态,TCP服务进程撤销传输控制块(是在建立连接时新建的)。TCP客户进程在经过2倍的msl后,才能进入关闭状态,撤销传输控制块。
在这里插入图片描述
  TCP客户在发送最后一个TCP普通确认报文段后,为什么不直接进入关闭状态?如同下图的场景
在这里插入图片描述

  关键点就在于,最后一次TCP客户发送的TCP普通确认报文段,可能存在丢失的问题。如果发生该问题,那么TCP服务的超市重传,TCP客户已经处于关闭状态,是无法进行处理的。
在这里插入图片描述

TCP服务和TCP客户,都是处于连接状态,由TCP客户去主动发起关闭。
TCP客户发送第一次挥手的消息后,进入终止等待1状态。
TCP服务发送第二次挥手的消息后,进入关闭等待状态。
TCP客户接收第二次挥手的消息后,进入终止等待2状态。
TCP服务发送第三次挥手的消息后,进入最后确认状态。
TCP客户接收第三次挥手的消息后,并且发送第四次挥手,进入时间等待状态,。
TCP服务接收第四次挥手的消息后,就进入关闭状态,撤销传输控制块
TCP客户进程在经过2倍的msl后,才能进入关闭状态,撤销传输控制块。
四报文挥手,TCP客户占两次,TCP服务占两次。
客户端的状态流转:终止等待1 -> 终止等待2 -> 时间等待 -> 关闭
服务端的状态流转:关闭等待 -> 最后确认 -> 关闭

三、TCP保活计时器

  如果TCP连接建立后,客户端出现了故障,那么服务端是如何知道客户端发生故障的呢?
  TCP保活计时器正是用于解决这样的问题,**类似于注册中心的心跳机制。**服务端在接收到客户端的数据后,会重新设置并启动保活计时器,假设TCP客户出现问题,超过保活计时器的时限后仍然没有发送数据,则服务端会发送一个TCP探测报文段,每隔75s发送一次,如果发送10次客户端仍然没有响应,TCP服务进程就确认客户出现了故障,就断开连接。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kafka部署和基本操作

一、部署kafka 解压 tar xzvf kafka_2.12-3.9.1.tgz tar -zxf kafka_2.12-3.9.1.tgz 1.修改config/server.properties # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # …

Bootstrap 5学习教程,从入门到精通,Bootstrap 5 导航语法知识点及案例代码(17)

Bootstrap 5 导航语法知识点及案例代码 Bootstrap 5 提供了强大的导航组件,帮助开发者快速构建响应式且美观的导航栏。 一、Bootstrap 5 导航组件概述 Bootstrap 5 提供了多种导航组件,主要包括: 导航栏(Navbar)&am…

清除 docker 无用的 镜像/容器

清除 docker 无用的 镜像/容器 删除 <none> 的 docker 镜像 使用以下命令删除所有 的 Docker 镜像&#xff08;即悬空镜像 / dangling images&#xff09;&#xff1a; docker image prune -f这会自动删除所有没有 tag 的镜像&#xff08;&#xff09;&#xff0c;不会…

使用Charles抓包工具提升API调试与性能优化效率

在软件开发过程中&#xff0c;网络请求调试和性能优化往往成为开发者遇到的挑战&#xff0c;尤其是在进行API接口调试时。开发者需要确保网络请求的正确性、响应时间以及系统的整体性能。然而&#xff0c;传统的调试方法常常无法提供足够的细节来深入分析问题&#xff0c;进而影…

如何协调各项目关键节点的冲突与依赖

在多项目并行的环境下&#xff0c;关键节点间的冲突与依赖是导致项目延期、资源浪费和沟通误解的主要根源。要高效协调此类问题&#xff0c;企业应重点从建立透明的进度依赖图、使用项目管理工具对齐节点、推动跨部门协同机制入手。其中&#xff0c;通过Gantt图或关键路径法实现…

mongodb单节点改副本集模式

前一阵将三节点的副本集改成了单节点&#xff0c;但后面业务代码出现问题&#xff1a;无法使用事务&#xff0c;因为事务只有在副本集上能用&#xff0c;单节点无法使用&#xff0c;故需要改回副本集模式&#xff0c;而我目前仅有一台服务器&#xff0c;所以考虑在一台服务器上…

Android 修改了页面的xml布局,使用了databinding,这时候编译时需要用到apt吗

deepseek回答&#xff1a; 在 Android 开发中使用 DataBinding 时&#xff0c;不需要显式使用 apt&#xff08;Annotation Processing Tool&#xff09;。以下是详细说明&#xff1a; 1. DataBinding 的编译机制 DataBinding 是 Android Gradle 插件原生支持的功能&#xff…

服务器如何从http升级到https(nginx)

1.证书申请 可以到阿里云或者华为云去申请证书&#xff0c;申请完下载证书是个压缩包&#xff0c;然后解压 可以到到几个文件夹&#xff0c;找到 .Nginx 文件夹打开 会有两个文件&#xff0c;将这两个文件上传至nginx/conf/cert文件夹下&#xff08;cert需要手…

6.19_JAVA_微服务

1、跑后端的时候要把数据库跑起来&#xff0c;否则会报错。 2、predicate断言&#xff1a; 预言&#xff1a;predict 3、gateway&#xff1a;出路口 4、API&#xff1a;List.of("a", "b", "c");把abc编程一个集合。 5、 6、shortcutFieldOrd…

Linux 基础命令:`ls`、`cd`、`du` 快速入门

在 Linux 系统中&#xff0c;ls、cd 和 du 是日常操作中最常用的三个命令。掌握它们能大幅提升文件管理效率。 1. ls&#xff1a;查看目录内容 用途&#xff1a;列出当前或指定目录下的文件和子目录。 常用命令&#xff1a; ls -l # 详细列表&#xff08;权限、大…

408第一季 - 数据结构 - 散列表

散列表 概念 散列表本身就是为了查找 原始人思想 散列表思想 6%5 是 1 1%5 也是1 冲突 冲突怎么办&#xff1f; 线性探测法 就往后找&#xff0c;1跑到索引为2 然后查找&#xff0c;可以发现&#xff0c;只要没冲突就只用查找1次 然后你想找10的话&#xff0c;发现索引为0…

Spring Boot 集成 Elasticsearch(含 ElasticsearchRestTemplate 示例)

Elasticsearch 是一个基于 Lucene 的分布式搜索服务器&#xff0c;具有高效的全文检索能力。在现代应用中&#xff0c;尤其是需要强大搜索功能的系统中&#xff0c;Elasticsearch 被广泛使用。 Spring Boot 提供了对 Elasticsearch 的集成支持&#xff0c;使得开发者可以轻松地…

CMake实践:指定gcc版本编译和交叉编译

目录 1.指定gcc版本编译 1.1.通过CMake参数来实现 1.2.使用 RPATH/RUNPATH 直接指定库路径 1.3.使用符号链接和 LD_LIBRARY_PATH 1.4.使用 wrapper 脚本封装 LD_LIBRARY_PATH 2.交叉编译 2.1.基本用法 2.2.工具链文件关键配置 2.3.多平台工具链示例 2.4.注意事项 2.…

详解鸿蒙Next仓颉开发语言中的全屏模式

大家好&#xff0c;今天跟大家分享一下仓颉开发语言中的全屏模式。 和ArkTS一样&#xff0c;仓颉的新建项目默认是非全屏模式的&#xff0c;如果你的应用颜色比较丰富&#xff0c;就会发现屏幕上方和底部的留白&#xff0c;这是应用自动避让了屏幕上方摄像头区域和底部的导航条…

LoRA 浅析

1. 核心思想 LoRA 是一种参数高效的微调方法&#xff0c;旨在减少微调大型语言模型 (LLMs) 所需的计算资源和存储空间。其核心思想是&#xff1a; 冻结预训练模型权重&#xff1a; 在微调过程中&#xff0c;保持预训练 LLM 的原始权重不变。引入低秩矩阵&#xff1a; 对于 LL…

软件范式正在经历第三次革命

核心主题&#xff1a;软件范式正在经历第三次根本性革命&#xff08;软件3.0&#xff09;&#xff0c;其核心是“智能体”&#xff08;Agent&#xff09;&#xff0c;未来十年将是“智能体的十年”。 逻辑模块解析&#xff1a; 软件的三次重生革命 软件1.0&#xff1a; 传统编…

JavaScript 变量与运算符全面解析:从基础到高级应用

昨天学长说可以放缓一下学习进度,刚好最近期末复习也不是很紧张,所以来重新复习一下js的一些知识点。 一&#xff1a;变量 &#xff08;1&#xff09;变量声明 来简单看一下变量的一些知识点。首先是变量声明&#xff1a;变量声明尽量使用数组字母下划线 来举几个例子&#x…

移动语义对性能优化的具体示例

前言 本文章对比了&#xff1a;小中大字符串在普通传值、传值移动、传左值引用、传右值引用、模板完美转发、内联版本等多种测试&#xff0c;对比各个方式的性能优异&#xff1a; 测试代码1 #include <iostream> #include <string> #include <chrono> #incl…

C/C++ 和 OpenCV 来制作一个能与人对弈的实体棋盘机器人

项目核心架构 整个系统可以分为四个主要模块&#xff1a; 视觉感知模块 (Vision Perception Module): 任务: 使用摄像头“看懂”棋盘。工具: C, OpenCV。功能: 校准摄像头、检测棋盘边界、进行透视变换、分割 64 个棋盘格、识别每个格子上的棋子、检测人类玩家的走法。 决策模…

SpringBoot扩展——日志管理!

Spring Boot扩展 在Spring Boot中可以集成第三方的框架如MyBatis、MyBatis-Plus和RabbitMQ等统称为扩展。每一个扩展会封装成一个集成&#xff0c;即Spring Boot的starter&#xff08;依赖组件&#xff09;。starter是一种非常重要的机制&#xff0c;不需要烦琐的配置&#xf…