计算机网络 | TCP 三次握手四次挥手 |半关闭连接

本来是不愿意写的,可是在实际场景,对具体的描述标志还是模糊不清,基础不扎实,就得承认!!!

在这里插入图片描述

TCP 连接建立需要解决三大问题:

  1. 知道双方存在
  2. 约定一些参数,如最大滑动窗口值、是否使用滑动窗口扩大选项、时间戳、服务质量等等
  3. 双方能够对运输实体资源(缓存大小、连接表中的项目)进行分配

三次握手
握手: TCP客户端和服务器之间进行交换三个TCP报文段

  1. 初始状态:两端的进程都处于关闭状态
  2. 服务器端创建传送控制块,用来存储TCP连接中的一些重要信息(TCP连接表、指向发送和接收缓存的指针、指向重传队列的指针、当前发送和接收序号等等),之后准本接收TCP客户进程的连接请求。TCP服务器处于监听状态,等待客户端进程的连接请求(TCP服务器是被动等待TCP客户进程的连接请求)(这又叫被动打开连接,不是主动建立连接的)
  3. TCP客户进程首先创建传输控制块 (请求发送和接收缓存的指针、指向重传队列的指针、当前的发送和接收序号)
  4. 开始第一次握手,TCP客户进程发送TCP请求报文段,进入同步已发送状态(SYN-SENT),发送的请求报文段中首部的同步位(SYN = 1),序号字段(seq = x,作为TCP客户进程所选择的初始序号)(注意TCP规定,SYN被设置为1的报文段不能携带数据,但是要消耗一个序号**)(主动打开连接
  5. 第二次握手(前提是服务进程接收客户进程的连接请求),TCP服务进程向TCP客户进程发送连接请求确认报文段(进入同步已接收状态, 监听状态–> 同步已接收状态)(连接请求报文段中头部SYN = 1,ACK = 1, seq = y, ack = x + 1) (同步位SYN = 1,确认位ACK = 1,这可以确定这是连接请求确认报文段) 序号字段 seq = y(初始值设置为y,作为TCP服务器进程所选择的初始序号,确认字段ack = x + 1,这是对TCP客户进程所选择的初始序号的确认),注意,这次发送的报文段(第二次握手)也不能发送数据,同样消耗一个序号
  6. 第三次握手(前提是TCP客户进程收到TCP请求确认报文段),接着TCP客户进程向TCP服务进程发送一个普通的TCP确认报文段。此时客户进程进入连接已建立状态,该发送的普通报文段中,确认位ACK = 1(这表明这是一个普通的TCP确认报文段),序号字段seq = x +1,确认字段ack = y +1(这是对TCP服务进程所选择的初始序号的确认)。(注意,这里的序号为x + 1 ,就是第一次握手发送的报文段是消耗了一个序号,然后TCP规定普通报文段是可以传输数据的,如果不携带数据这不消耗序号,在不携带数据的情况下,下一个数据报文段的序号仍然是x + 1)。TCP服务进程接收到该报文段后也进入了连接已建立状态
  7. 接下来就可以进行可靠的数据传输。

在这里插入图片描述
为什么还要发送一个普通的TCP确认报文段呢????===>能够两次握手建立连接???
特殊情境:TCP客户进程发送的请求报文段发送到了TCP服务端进程,但用了很长时间,所以会引发该报文段的超时重传,然后重传的报文段被TCP服务进程正常接收(注意后来发送的超时重传的报文段反而先被接收)然后地第二次握手。注意如果这是两次握手。然后TCP服务进程就进入了连接已建立状态(而不是三次握手进入同步已接收状态。这个时候TCP服务进程会等待TCP客户进程发送TCP连接请求确认报文段的普通确认报文段),第二次握手,没有给TCP发送普通 报文段,进入了连接已建立状态。此时两两可以开始传输数据。开始传输数据了哈,然后传输的数据很少,然后很快就断开连接,两端断开连接后,这时变态的事情就发生了,TCP服务线程接收到第一次发送的TCP连接请求报文段(TCP服务线程进入的连接已建立状态)。然后TCP服务线程肯定会发送确认报文段嘛,搞笑的事情就发生了,TCP客户线程就会莫名奇怪。明明断开连接之后,我啥也没干呀!!!(不理睬,关闭状态)

四次挥手
数据传输结束后,双方都可以释放连接

释放连接前的状态都是 连接已建立(EDTABLISHED)

  1. 假设是TCP客户进程的应用进程通知其主动关闭TCP连接。TCP客户进程发送TCP连接释放报文段,接着TCP客户进程主动关闭状态,进入终止等待1状态(FIN-WAIT-1),该发送的连接释放报文段中的头部终止位FIN = 1,确认位ACK = 1。可以通过这些头部字段信息判定这是TCP连接释放报文段(因为有时候抓包,需要确认什么什么是什么什么包)。同时,对之前收到的报文段确认 seq = u,ack = v。(u -1 , v - 1 分别表示什么 可以参照TCP三次握手)(注意:TCP规定终止位FIN = 1的报文段即使不携带数据,也要消耗一个序号
  2. TCP服务进接收到发送的连接释放报文段后,会发送一个普通的TCP确认报文段,ACK = 1,seq = v, ack = u + 1(还是解释以下吧,seq = TCP服务进程之前已经传送的数据的最后一个字节序号加1),—>关闭等待状态(CLOSE-WAIT),同时TCP服务进程通知高层应用进程,TCP客户进程要和我们断开TCP连接,请做好断开连接的准备。注意这时,TCP客户进程到TCP服务进程这个方向(—>)的连接就释放了。这时的TCP连接也叫做半关闭状态。(怎么个半关闭呢?TCP客户进程已经没有发数据给TCP服务进程,但是要注意这个时候TCP服务进程还可以发送数据给TCP客户进程。虽然在TCP服务这边,服务进程已经传达断开消息给高层应用了,但是这段时间内,高层应用是可以继续发送消息的,简言之TCP服务线程可以发送数据给TCP客户线程,并且TCP客户线程是可以接受到发送过来的数据)。TCP客户进程接收到TCP确认报文段后就进入终止等待2状态(FIN-WAIT-2)
  3. TCP服务应用进程知晓后,也就会通知TCP服务进程没有数据要发送,接着TCP服务进程就会发送连接释放报文段(报文段首部FIN = 1 ACK = 1 ,seq = w, ack = u + 1 所以期间发送的报文段次数为w - v 注意 u + 1 是对之前收到的TCP连接释放报文段的重复确认。也就是TCP客户线程第一次发送的报文段的确认)给TCP客户线程。TCP服务这边是被动关闭连接,TCP服务线程发送TCP连接释放报文段后,其状态---->最后确认 (LAST-ACK)
  4. TCP客户线程 接收到发送的报文段后,紧接着发送TCP普通确认报文段 ACK = 1, seq = u + 1, ack = w + 1。之后TCP客户端进入时间等待状态 发送的报文段消耗一个序号。TCP 服务线程接收到该报文段后进入关闭状态(CLOSED),注意TCP客户线程需要经过2MSL时间后才能进入关闭状态。

解释:MSL 最长报文段寿命 RFC793建议为2分钟
在这里插入图片描述思考为什么TCP客户线要经历2MSL的时间自动关闭连接,置为关闭状态呢?
分析,如果TCP客户端发送TCP普通确认报文段后直接置为关闭状态,但是这个报文段很遗憾没有发送成功,在半路丢失。在TCP服务线程触发超时重传,又进行第三次挥手。但是TCP客户线程已经下线了,怎么也连不上,那这就是没有关闭成功。(怎么算的2MSL ??TCP客户线程 发送过去,触发超时,TCP服务线程发送报文段,两倍2MSL)

引申 保活计时器
在这里插入图片描述

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

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

相关文章

Ubuntu 22.04安装 —— Win11 22H2

目录 Ubuntu使用下载UbuntuVmware 安装图示安装步骤图示 Ubuntu使用 系统环境: Windows 11 22H2Vmware 17 ProUbutun 22.04.3 Server Ubuntu Server documentation | Ubuntu 下载 Ubuntu 官网下载 建议安装长期支持版本 ——> 可以选择桌面版或服务器版(仅包…

【Leetcode】130.被围绕的区域

一、题目 1、题目描述 给你一个 m x n 的矩阵 board ,由若干字符 X 和 O ,找到所有被 X 围绕的区域,并将这些区域里所有的 O 用 X 填充。 示例1: 输入:board = [[“X”,“X”,“X”,“X”],[“X”,“O”,“O”,“X”],[“X”,“X”,“O”,“X”],[“X”,“O”,“X”,“…

高德地图jsapi报错INVALID_USER_SCODE

看了各种网上方法,还是搞不定。无奈在高德开放平台提了工单。 很快高德的技术人员就给出了答复“您好,您检查一下您的安全密钥是否在key之前,安全密钥设置必须是在JS API 脚本加载之前进行设置,否则设置无效。” 并给出了推荐的…

【数据结构】C语言队列(详解)

前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--C语言实现队列 目录 一.队列概念及结构 1.1队列的概念 1.2队列的结构 二.队列的实现 2.1头文…

【python爬虫】6.爬虫实操(带参数请求数据)

文章目录 前言项目:狂热粉丝分析过程什么是带参数请求数据如何带参数请求数据 代码实现被隐藏的歌曲清单什么是Request Headers如何添加Request Headers 复习 前言 先来复习一下上一关的主要知识吧,先热个身。 Network能够记录浏览器的所有请求。我们最…

AZ900备考

文章目录 云服务的概念云服务模型云服务类型消费的模型云服务的好处可靠性和可预测性的优势云中的管理 Azure 体系结构和服务核心结构组件物理基础结构组件 Azure计算和网络服务Azure 存储服务身份认证AD身份认证 Azure 管理和治理成本管理治理合规性的功能和工具管理和部署Azu…

喷泉码浅谈

01、喷泉码简介 喷泉码(Fountain Code)是一种在无线通信、数据传输和网络编码领域中使用的错误纠正技术。它与传统的纠错码和编码方法有所不同,喷泉码被设计用于在不确定信道条件下的高效数据传输。传统的纠错码(如海明码、RS码等…

Linux服务器部署JavaWeb后端项目

适用于:MVVM前后台分离开发、部署、域名配置 前端:Vue 后端:Spring Boot 这篇文章只讲后端部署,前端部署戳这里 目录 Step1:服务器上搭建后端所需环境1、更新服务器软件包2、安装JDK83、安装MySQL4、登录MySQL5、修…

钉钉消息已读、未读咋实现的嘞?

前言 一款app,消息页面有:钱包通知、最近访客等各种通知类别,每个类别可能有新的通知消息,实现已读、未读功能,包括多少个未读,这个是怎么实现的呢?比如用户A访问了用户B的主页,难道…

Mac下Docker Desktop安装命令行工具、开启本地远程访问

Mac系统下,为了方便在terminal和idea里使用docker,需要安装docker命令行工具,和开启Docker Desktop本地远程访问。 具体方法是在设置-高级下, 1.将勾选的User调整为System,这样不用手动配置PATH即可使用docker命令 …

Nuxt 菜鸟入门学习笔记五:CSS 样式

文章目录 本地样式表在组件内导入通过 Nuxt 配置 CSS 属性导入使用字体导入通过 NPM 发布的样式表 外部样式表动态添加样式表【高级】使用 Nitro 插件修改渲染的头部 使用预处理器单文件组件 SFC 样式类和样式绑定使用 v-bind 的动态样式Scoped StylesCSS Modules预处理器支持 …

基于Python+OpenCV智能答题卡识别系统——深度学习和图像识别算法应用(含Python全部工程源码)+训练与测试数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境PyCharm安装OpenCV环境 模块实现1. 信息识别2. Excel导出模块3. 图形用户界面模块4. 手写识别模块 系统测试1. 系统识别准确率2. 系统识别应用 工程源代码下载其它资料下载 前言 本项目基于Python和OpenCV图像处…

图像扭曲之旋转

源码: void twirl(cv::Mat& src,cv::Mat& dst,double angle,double radius) {dst.create(src.rows, src.cols, CV_8UC3);dst.setTo(0);int radius2radius*radius;int cx src.cols / 2;int cy src.rows / 2;int distance,distance2 0;for (int h 0; h &…

P13 VUE 二级menu实现

主要修改以下几个点&#xff1a; CommonAside.vue中 外层便利有孩子节点&#xff0c;关键词key是对应的标签&#xff0c;class动态图表渲染 内层遍历不能再用item&#xff0c;用subitem&#xff0c;遍历该item.childeren&#xff0c;关键词是path&#xff0c; <templat…

k8s etcd 简介

Etcd是CoreOS基于Raft协议开发的分布式key-value存储&#xff0c;可用于服务发现、共享配置以及一致性保障&#xff08;如数据库选主、分布式锁等&#xff09;。 如&#xff0c;Etcd也可以作为微服务的注册中心&#xff0c;比如SpringCloud也基于ETCD实现了注册中心功能&#…

dayjs格式转换成日期

目录 方法一&#xff1a; ​编辑方法二&#xff1a; 这个项目在筛选订单时间的时候是由前端进行筛选的&#xff0c;用的是adt-design-pro进行二开的&#xff0c;其中在用日期组件的时候遇到了一个问题&#xff0c;组件返回的是&#xff1a; 但是我需要的是年-月-日&#xff…

计算机网络 第二节

目录 一&#xff0c;计算机网络的分类 1.按照覆盖范围分 2.按照所属用途分 二&#xff0c;计算机网络逻辑组成部分 1.核心部分 &#xff08;通信子网&#xff09; 1.1电路交换 1.2 分组交换 两种方式的特点 重点 2.边缘部分 &#xff08;资源子网&#xff09; 进程通信的方…

模拟电子技术基础学习笔记三 PN结

采用不周的掺杂工艺&#xff0c;将P型半导体与N型半导体制作在同一块硅片上&#xff0c;在它们的交界面就形成PN结。 扩散运动 物质总是从浓度高的地方向浓度低的地方运动&#xff0c;这种由于浓度差而产生的运动称为扩散运动。 空间电荷区 - 耗尽层 漂移运动 在电场力的作…

成集云 | 飞书审批同步金蝶云星空 | 解决方案

源系统成集云目标系统 方案介绍 飞书员工报销审批通过后&#xff0c;审批单据内容和审批状态实时同步金蝶云星空 飞书是字节跳动于2016年自研的新一代一站式协作平台&#xff0c;将即时沟通、日历、云文档、云盘和工作台深度整合&#xff0c;通过开放兼容的平台&#xff0c;…

BIO到NIO、多路复用器, 从理论到实践, 结合实际案例对比各自效率与特点(下)

文章目录 多路复用器简介多路复用器的两个阶段Java中的多路复用器封装测试代码压测结果总结 本篇文章是BIO到NIO、多路复用器, 从理论到实践, 结合实际案例对比各自效率与特点(上)的下一篇, 如果没有看的小伙伴, 可以先看下, 不然可能会不连贯. 多路复用器简介 多路复用器是对…