计算机网络:传输控制协议(Transmission Control Protocol-TCP协议
计算机网络:传输控制协议(Transmission Control Protocol-TCP协议)
- 本文目的
- 前置知识点
- TCP协议简介
- 主要特性
- 通信流程
- 1. 建立连接的过程(三次握手,243)
- 1.1 为什么要三次握手,两次不行吗?
- 2. 释放连接的过程(四次挥手,3343)
- 2.1 TIME-WAIT时间等待状态是做什么的?
- 参考文献
本文目的
介绍TCP协议的内容,三次握手和四次挥手的必要性和原因
前置知识点
- 计算机网络基本知识。
TCP协议简介
全称Transmission Control Protocol,传输控制协议,运输层协议。
主要特性
参考《计算机网络》传输层协议TCP概述p211
- 面向连接的运输层协议,传输前需要简历TCP连接
- 每一条TCP协议都是点对点通信的
- 提供可靠交付的数据,通过TCP连接传输的数据无差错,不丢失,不重复
- 全双工通信
- 面向字节流
通信流程
1. 建立连接的过程(三次握手,243)
需要阐明为什么每次交互会有这些标志位。
图解如下
- 最开始客户端和服务器都处于关闭状态
- 服务器创建传输控制块(TCB,Transmit Control Block),进入绑定自己的ip和端口进入监听(listen)状态。
- 客户端创建TCB,已知服务器的ip和端口,向服务器发出连接请求报文,包括以下内容:(发送后进入同步已发送SYN_SENT状态)
- SYN(SYNchronization)同步序号置1,表示这是一个连接请求报文。
- seq初始序号x,该报文不携带数据但是需要消耗一个初始序号,也是服务器应答的依据(服务器需要应答x+1这样客户端才知道刚刚那条报文发过去了)
- 服务器收到连接请求报文之后,如同意连接,返回确认报文段,包含以下内容:(发送后进入同步收到SYN_RCVD状态)
- SYN同步序号置1,表示这是一个连接接受报文段。
- seq初始序号y,同样的需要小号一个初始序号,也是客户端应答的依据。
- 确认ACK = 1,ACK= 1的时候确认号字段(ack)才有效,建立连接后所有的报文段都要把ACK置1。
- 确认号ack = x + 1,期望对方下一个报文段第一个字节的序号,表示x之前的数据都收到了。
- 客户端收到连接确认报文之后,还要再给B发出确认,包含以下内容:(同时客户端已进入连接建立ESTABLISHED状态)
- ACK = 1,seq = x + 1, ack = y + 1。
- 可以包含数据,如果不包含则不消耗x + 1这个序列号。
- 服务器收到之后进入连接建立ESTABLISHED状态,三次握手建立成功。
1.1 为什么要三次握手,两次不行吗?
参考《计算机网络》5.9 TCP的运输连接管理p239
两次握手可以避免已失效的连接请求报文段,客户端发送给服务器但是延迟送达,对于客户端来说早已失效(过期了),而且失效之后客户端没有再重发请求,但是服务器响应并且发回确认报文段,如果两次握手,服务器此时就开始建立连接,而客户端根本不会相应确认报文段,所以没连接,服务器就会干等消耗资源。
其他情况理论上都可以被三次握手解决。试图举反例举不出来。
2. 释放连接的过程(四次挥手,3343)
- 最开始客户端和服务器都处于ESTABLISHED状态
- 客户端发完要发的消息之后,需要释放连接,发出连接释放报文,包含以下内容:(同时进入终止等待1-FIN-WAIT-1状态)
- FIN = 1,表示是一个连接释放报文
- seq = u,释放报文需要消耗一个序号。
- ACK = 1,理由同连接的时候一致。
- 服务器收到连接释放报文之后需要立刻应答,表示收到了连接释放报文,包含以下内容:(同时进入关闭等待-CLOSE-WAIT状态)
- ACK = 1
- ack = u + 1
- seq = v,需要消耗一个序号
- 客户端收到之后进入终止等待2-FIN-WAIT-2状态,可能服务器还有一些消息要发,这个阶段如果服务器发消息,客户端也要接着收。这个时候TCP称之为半关闭状态。
- 服务器也发完消息之后,发送连接释放报文,包含以下数据:(同时进入最后确认-LAST-ACK状态)
- FIN = 1,表示释放连接报文
- seq = w,因为因为可能半关闭期间发了些消息,所以不是v + 1。
- ack = u + 1不变,因为客户端没发过消息了。
- ACK = 1。
- 客户端收到之后,发送最后确认,包含以下内容:(然后进入时间等待-TIME-WAIT状态)
- ACK = 1
- ack = w + 1
- seq = u + 1
- 服务器收到之后就可以关闭连接了
- 客户端TIME-WAIT结束后也会断开连接。
2.1 TIME-WAIT时间等待状态是做什么的?
参考《计算机网络》5.9.2 TCP的连接释放p240
避免最后一个客户端发出的ACK报文丢失带来的问题。
时间等待计时器TIME-WAIT timer 是2MSL(Maximum Segment Lifetime)最长报文段寿命
- 当最后一个报文丢失(超过了MSL)的时候,服务器收不到会卡在最后确认-LAST-WAIT状态,这个时候服务器可能会重新发送连接释放报文,客户端需要保证能收到,才有可能再次发送最后确认的报文。一来一回刚好是两倍的MSL。
- 保证本次通信的所有报文都消失(2MSL之后肯定都消失了),防止旧的包干扰下一次连接
- 个人理解不一定对:假设第一次发了两次连接请求,但是有一个卡在路上了,然后关闭了,然后卡在路上的那个又到服务器了,其实服务器是可以不用理的
参考文献
《计算机网络》传输层协议TCP概述p211
《计算机网络》5.9 TCP的运输连接管理p239
《计算机网络》5.9.2 TCP的连接释放p240
相关文章:

计算机网络:传输控制协议(Transmission Control Protocol-TCP协议
计算机网络:传输控制协议(Transmission Control Protocol-TCP协议) 本文目的前置知识点TCP协议简介主要特性通信流程1. 建立连接的过程(三次握手,243)1.1 为什么要三次握手,两次不行吗? 2. 释放连接的过程(…...

GEE实践应用|热岛效应(一)地表温度计算
目录 1.学习目标 2.理论介绍 3.从MODIS获得地表温度 4.从Landsat卫星获得地表温度 1.学习目标 ①了解如何使用GEE计算地表温度 2.理论介绍 城市化涉及用建筑物、道路和停车场等建筑结构取代自然景观。这种土地覆盖的改变也改变了土地表面的特性。这些变化的范围从表面反射和…...
Java查找算法知识点(含面试大厂题和源码)
查找算法是计算机科学中的基础概念,它们在解决实际问题时扮演着关键角色。了解和掌握不同的查找算法,能够帮助我们更高效地处理数据检索任务。以下是一些关于查找算法的关键知识点: 算法分类: 线性查找算法:按照顺序逐…...

67、yolov8目标检测和旋转目标检测算法部署Atlas 200I DK A2开发板上
基本思想:需求部署yolov8目标检测和旋转目标检测算法部署atlas 200dk 开发板上 一、转换模型 链接: https://pan.baidu.com/s/1hJPX2QvybI4AGgeJKO6QgQ?pwdq2s5 提取码: q2s5 from ultralytics import YOLO# Load a model model YOLO("yolov8s.yaml")…...

A Little Is Enough: Circumventing Defenses For Distributed Learning
联邦学习的攻击方法:LIE 简单的总结,只是为了能快速想起来这个方法。 无目标攻击 例如总共50个客户端,有24个恶意客户端,那么这个时候,他需要拉拢2个良性客户端 计算 50 − 24 − 2 50 − 24 0.923 \frac{50-24-2}{…...

文心一言 VS 讯飞星火 VS chatgpt (225)-- 算法导论16.3 7题
七、推广赫夫曼算法,使之能生成三进制的码字(即码字由符号0、1、2组成),并证明你的算法能生成最优三进制码。如果要写代码,请用go语言。 文心一言: 推广赫夫曼算法以生成三进制码字需要对算法进行一定的修改,确保在每…...

【计算机】——51单片机——持续更新
单片机是一种内部包含CPU、存储器和输入/输出接口等电路的集成电路(IC芯片) 单片机是单片微型计算机(Single Chip Microcomputer)的简称,用于控制领域,所以又称为微型控制器(Microcontroller U…...

QT资源添加调用
添加资源文件,新建资源文件夹,命名resource,然后点下一步,点完成 资源,右键add Prefix 添加现有文件 展示的label图片切换 QLabel *led_show; #include "mainwindow.h" #include<QLabel> #include&l…...
LeetCode-49. 字母异位词分组【数组 哈希表 字符串 排序】
LeetCode-49. 字母异位词分组【数组 哈希表 字符串 排序】 题目描述:解题思路一:哈希表和排序,这里最关键的点是,乱序单词的排序结果必然是一样的(从而构成哈希表的key)。解题思路二:解题思路三…...

绘制特征曲线-ROC(Machine Learning 研习十七)
接收者操作特征曲线(ROC)是二元分类器的另一个常用工具。它与精确度/召回率曲线非常相似,但 ROC 曲线不是绘制精确度与召回率的关系曲线,而是绘制真阳性率(召回率的另一个名称)与假阳性率(FPR&a…...

.Net 知识杂记
记录平日中琐碎的.net 知识点。不定期更新 目标框架名称(TFM) 我们创建C#应用程序时,在项目的工程文件(*.csproj)中都有targetFramework标签,以表示项目使用的目标框架 各种版本的TFM .NET Framework .NET Standard .NET5 及更高版本 UMP等 参考文档&a…...

海豚【货运系统源码】货运小程序【用户端+司机端app】源码物流系统搬家系统源码师傅接单
技术栈:前端uniapp后端vuethinkphp 主要功能: 不通车型配置不通价格参数 多城市定位服务 支持发货地 途径地 目的地智能费用计算 支持日期时间 预约下单 支持添加跟单人数选择 支持下单优惠券抵扣 支持司机收藏订单评价 支持订单状态消息通知 支…...

01---java面试八股文——mybatis-------10题
1、什么是MyBatis Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,…...

增强现实(AR)的开发工具
增强现实(AR)的开发工具涵盖了一系列的软件和平台,它们可以帮助开发者创造出能够将虚拟内容融入现实世界的应用程序。以下是一些在AR领域内广泛使用的开发工具。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎…...

用Unity制作正六边形拼成的地面
目录 效果演示 1.在Unity中创建正六边形 2.创建一个用于管理正六边形的类 3.创建一个用于管理正六边形地面的类 4.创建一个空对象并将游戏控制脚本挂上 5.设置正六边形碰撞所需组件 6.创建正六边形行为触发脚本并挂上 7.创建圆柱体——田伯光 8.创建圆柱体移动脚本 运…...
Spark部署详细教程
Spark Local环境部署 下载地址 https://dlcdn.apache.org/spark/spark-3.4.2/spark-3.4.2-bin-hadoop3.tgz 条件 PYTHON 推荐3.8JDK 1.8 Anaconda On Linux 安装 本次课程的Python环境需要安装到Linux(虚拟机)和Windows(本机)上 参见最下方, 附: Anaconda On Linux 安装…...

慧天[HTWATER]:创新城市水务科技,引领行业变革
【城市内涝水文水动力模型介绍】 慧天[HTWATER]软件:慧天排水数字化分析平台针对城市排水系统基础设施数据管理的需求,以及水文、水力及水质模拟对数据的需求,实现了以数据库方式对相应数据的存储。可以对分流制排水系统及合流制排水系统进行…...

vscode调试Unity
文章目录 vscode调试UnityC#环境需求开始调试 Lua添加Debugger环境配置联系.txt文件配置Java环境 添加调试代码断点不生效的问题 vscode调试Unity C# 现在使用vscode调试Unity的C#代码很简单,直接在vscode的EXTENSIONS里面搜索“Unity”,第一个就是&am…...
JavaScript是如何实现页面渲染的
JavaScript实现页面渲染主要涉及到对DOM的操作、样式的修改以及与后端数据的交互。以下是JavaScript实现页面渲染的主要步骤和方式: 一、DOM操作 创建和修改元素:JavaScript可以使用document.createElement()来创建新的DOM元素,使用appendC…...

【YOLOv8 代码解读】数据增强代码梳理
1. LetterBox增强 当输入图片的尺寸和模型实际接收的尺寸可能不一致时,通常需要使用LetterBox增强技术。具体步骤是先将图片按比例缩放,将较长的边缩放到设定的尺寸以后,再将较短的边进行填充,最终短边的长度为stride的倍数即可。…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...