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

news2024/10/7 8:22:18

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

在这里插入图片描述

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.coloradmin.cn/o/956883.html

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

相关文章

YOLOv5算法改进(10)— 替换主干网络之GhostNet

前言:Hello大家好,我是小哥谈。GhostNet是一种针对计算机视觉任务的深度神经网络架构,它于2020年由中国科学院大学的研究人员提出。GhostNet的设计目标是在保持高精度的同时,减少模型的计算和存储成本。GhostNet通过引入Ghost模块…

浅谈多人游戏原理和简单实现。

😜作 者:是江迪呀✒️本文关键词:websocket、网络、原理、多人游戏☀️每日 一言:这世上有两种东西无法直视,一是太阳,二是人心! 一、我的游戏史 我最开始接触游戏要从一盘300游戏…

RSA算法与错误敏感攻击

参见《RSA 算法的错误敏感攻击研究与实践》 RSA 算法简介 RSA 算法原理: 1) RSA 算法密钥产生过程 (1)系统随机产生两个大素数 p p p 和 q q q,对这两个数据保密; (2)计算 n p …

Java类的声明周期、对象的创建过程

一、类的生命周期 使用类时,要先使用类加载器将类的字节码从磁盘加载到内存的方法区中,用Class对象表示加载到内存中的类,Class类是JDK中提供的类创建对象时,是根据内存中的Class对象,在堆中分配内存,完成…

c语言之指针的学习

1.指针是什么 (指针是内存中一个最小单元的编号,也就是地址) int main() {int a10;//当我们取出地址a的时候,取出的其实是a占4个字节中的第一个字节的地址int *pa&a;//pa是一个指针变量,用于存放地址//pa在口头语上常说为指针//指针本质上就是地址,…

C++学习|CUFFT计算一维傅里叶变换

CUFFT计算一维傅里叶变换 CUFFT库介绍CUFFTW计算一维傅里叶变换CUFFT计算一维傅里叶变换 前言:之前实现了CPU运行一维傅里叶变换,最近要改成GPU加速一维傅里叶变换,于是有了此篇作为记录,方便以后查阅。 CUFFT库介绍 CUFFT&#…

Protein - ECD (ExtraCellular Domain) 膜蛋白胞外区的 UniProt 与 PDB 数据分析

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132597158 ECD 是 Extracellular Domain 的缩写,指的是跨膜蛋白质的细胞外部分 (膜蛋白的胞外区),通常包含一些功能性的结…

JVM的故事——类文件结构

类文件结构 文章目录 类文件结构一、概述二、无关性基石三、Class类文件的结构 一、概述 计算机是只认由0、1组成的二进制码的,不过随着发展,我们编写的程序可以被编译成与指令集无关、平台中立的一种格式。 二、无关性基石 对于不同平台和不同平台的…

77GHz线性调频连续波雷达

文章目录 前言 一、背景 二、优缺点 三、工作原理 四、电路模块设计 4.1.LFMCW信号源 4.2.发射电路 4.3.接收电路 4.4.信号处理器 五、应用 5.1.汽车测距 5.2.军事方面 5.3.气象方面 总结 前言 这篇文章是博主本科期间整理的关于77GHz线性调频连续波雷达的相关资料,…

【Java】文件操作和IO

文件操作和IO 文件树形结构组织和目录文件路径 Java中操作文件File 文件内容的读写(数据流)Reader和Writer字符输入流 Reader字符输出流 WriterFileReader 和 FileWriterFileReaderFileWriter InputStream和OutputStreamInputStreamFileInputStreamFileOutputStream 小程序扫描…

Vue3实现24小时倒计时

方法一:时间戳(24小时以内,毫秒为单位)转成时间,并且倒计时 效果预览: <script> // 剩余时间的时间戳,24小时的时间戳是86400000 const exTime = ref(86400000) // 支付时间期限 const payTime = ref() const maxtime = ref(0) //倒计时(时间戳,毫秒单位)转换成秒…

java 工程管理系统源码+项目说明+功能描述+前后端分离 + 二次开发

​ ​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈&#xff0c;内卷严重&#xff0c…

OPENCV实现ORB特征检测

# -*- coding:utf-8 -*- """ 作者:794919561 日期:2023/8/31 """ import cv2 import numpy as np# 读图像 img = cv2.imread(F:\\learnOpenCV\\openCVLearning\\pictures\\chess.jpg)

应急日光灯 补光灯 太阳能路灯 升压LED电源驱动恒流IC

产品说明 AP9196 是一系列外围电路简洁的宽调光比升压调光 恒流驱动器&#xff0c;适用于 3-40V 输入电压范围的 LED 照明领域。 AP9196 采用我司专利算法&#xff0c;可以实现高精度的恒流 效果&#xff0c;输出电流恒流精度≤3&#xff05;&#xff0c;电压工作范围为 5-40V&…

重庆市人才系统注册流程

1、IE浏览器打开重庆市科技局官网首页(http://kjj.cq.gov.cn/) 2、选择“重庆市科技管理信息系统”—选择“科技资源共享”—板块—注册—选择“个人注册”—填写注册信息—注册 3、注册—选择“个人注册”—填写注册信息—注册—登录 4、选择“科技管理系统“ 5、选择“科技人…

Linux进程概念及其状态

文章目录 &#x1f347;1. 什么是进程&#x1f348;1.1 概念&#x1f348;1.2 理解进程 &#x1f34b;2. Linux的PCB&#x1f34e;3. 查看进程 & 杀死进程&#x1f352;4. 系统调用获取进程标识符&#x1f353;4.1 进程PID&#x1f353;4.2 父进程PPID &#x1f346;5. 系统…

MetInfo5.0文件包含漏洞

MetInfo历史版本与文件 环境在这里下载&#xff0c;使用phpstudy搭建 我们来看到这个index.php&#xff0c;如下图所示&#xff0c;其中定义了fmodule变量与module变量&#xff0c;其中require_once语句表示将某个文件引入当前文件&#xff0c;在这个代码中&#xff0c;通过r…

【JasperReports笔记06】JasperReport报表开发之常见的组件元素(Table、Subreport、Barcode等)

这篇文章&#xff0c;主要介绍JasperReport报表开发之常见的组件元素&#xff08;Table、Subreport、Barcode等&#xff09;。 目录 一、基础组件元素 1.1、StaticText 1.2、TextField 1.3、Image 1.4、Break分页 1.5、Rectangle矩形区域 1.6、Ellipse椭圆区域 1.7、Li…

基于MQTT协议的物联网关

随着工业领域的不断发展&#xff0c;数字化转型已经成为企业迈向未来的必由之路。在这个数字化浪潮中&#xff0c;HiWoo Box以其强大的功能和创新的设计&#xff0c;在工业物联网领域被越来越多的人所熟知。特别是其基于MQTT协议的物联网关能力&#xff0c;也为企业实现智能化数…

喷泉码浅谈

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