TCP为什么需要三次握手和四次挥手,有哪些需要注意的地方?
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。为了确保数据能够准确无误地从一端发送到另一端,TCP设计了一系列机制来保证通信的可靠性,其中包括连接建立和断开的过程。
三次握手(Three-way Handshake)
三次握手是TCP用于建立连接的过程。这个过程可以确保双方在开始数据传输之前已经准备好,并且可以相互发送和接收数据。三次握手的具体步骤如下:
1. 第一次握手:
客户端向服务器发送一个SYN(同步序列编号)包,请求建立连接。这个包中包含了初始序列号(ISN),用以标识该连接的数据流中的第一个字节。
2. 第二次握手:
服务器收到客户端的SYN包后,会回复一个SYN-ACK(同步确认)包。这个包包含了服务器自己的初始序列号,同时也确认了客户端的SYN包中的序列号加一,表示已经收到了客户端的请求。
3. 第三次握手:
客户端收到服务器的SYN-ACK包后,再发送一个ACK(确认)包给服务器,确认号为收到的SYN-ACK包中的序列号加一。当服务器收到这个ACK包后,连接就正式建立了,双方可以开始进行数据交换。
通过三次握手,可以有效地避免错误地建立连接的情况发生,例如由于网络延迟导致的旧的连接请求包突然到达。
四次挥手(Four-way Wave-off)
四次挥手是TCP用于断开连接的过程。与建立连接相比,断开连接需要更谨慎处理,因为每个方向的数据流都需要独立地关闭,以确保所有数据都已正确传输。四次挥手的具体步骤如下:
1. 第一次挥手:
主动关闭方(假设为客户端)发送一个FIN(结束)包,表示客户端已经没有数据要发送了,希望关闭这个方向的连接。
2. 第二次挥手:
被动关闭方(即服务器)收到FIN后,发送一个ACK包作为响应,确认号为收到的FIN包中的序列号加一。
3. 第三次挥手:
如果服务器还有数据需要发送,则继续发送直到完成。完成后,服务器也会发送一个FIN包给客户端,表示自己也没有数据要发送了。
4. 第四次挥手:
客户端收到服务器的FIN后,发送一个ACK包作为确认,确认号为收到的FIN包中的序列号加一。此时,客户端进入TIME_WAIT状态,等待足够的时间以确保服务器接收到最后一个ACK,然后才完全关闭连接。
四次挥手确保了数据传输的完整性,即使在一方已经完成数据发送的情况下,另一方仍然有机会发送剩余的数据。这有助于防止数据丢失或损坏。
常见问题与注意事项
TCP协议虽然设计得非常成熟,但在实际应用中仍可能遇到一些常见问题。了解这些问题有助于更好地使用TCP,优化网络性能和确保数据传输的可靠性。以下是一些常见的TCP问题及注意事项:
1. 拥塞控制
- 慢启动:TCP连接初期,发送方会逐渐增加发送速率,以探测网络的实际带宽。如果过快增加发送速率,可能会引起网络拥塞。
- 拥塞避免:当网络出现拥塞迹象时,发送方会减少发送速率,避免进一步加重拥塞。
- 快速重传:当接收方连续收到三个重复的ACK时,发送方会认为数据包丢失,立即重传丢失的数据包,而不是等到超时重传计时器到期。
- 快速恢复:在快速重传之后,如果接收到新的ACK,表明拥塞情况有所缓解,可以逐步恢复发送速率。
2. 丢包和重传
- TCP通过序列号和ACK机制来检测丢包并进行重传。但如果重传策略不当,可能会导致不必要的带宽浪费或延迟增加。
- 选择性确认(SACK):允许接收方通知发送方哪些数据段已经成功接收,哪些数据段丢失,从而更高效地进行重传。
3. 延时确认
- 接收方可以在一定时间内累积多个ACK,一次性发送出去,以减少网络流量。但这可能会增加发送方的等待时间,影响实时性。
4. 半关闭连接
- 在TCP中,一方可以先关闭其发送方向的连接(即发送FIN),但仍可以接收来自对方的数据。这种情况下,连接处于半关闭状态。需要注意的是,应用程序必须正确处理这种情况,避免数据丢失。
5. TIME_WAIT状态
- 当TCP连接正常关闭时,主动关闭方会进入TIME_WAIT状态,持续一段时间(通常是2MSL,即两倍的最大段生命周期)。这是为了确保最后一个ACK能够被对方接收到,避免旧的数据包在新的连接中出现。但过多的连接处于TIME_WAIT状态会占用系统资源,可能导致性能下降。
6. TCP选项
- TCP头部包含一些可选字段,如MSS(最大报文段长度)、窗口缩放、时间戳等。这些选项可以提高TCP的性能和可靠性,但也需要正确配置和使用。
7. 防火墙和NAT
- 防火墙和NAT设备可能会对TCP连接产生影响,例如限制连接数、修改数据包内容等。在设计网络架构时,需要考虑这些因素,确保TCP连接的正常建立和维护。
8. 性能优化
- 缓冲区大小:合理设置TCP接收和发送缓冲区的大小,可以提高数据传输效率。
- 窗口管理:动态调整TCP窗口大小,以适应网络条件的变化。
- 路径MTU发现:自动发现路径上的最大传输单元,避免数据包分片,提高传输效率。
9. 安全性
- 中间人攻击:TCP连接可能受到中间人攻击,可以通过TLS/SSL等加密协议来保护数据的安全性。
- SYN洪水攻击:攻击者可以通过大量发送SYN包来耗尽服务器资源,导致拒绝服务。可以通过 SYN cookies 等技术来防御这种攻击。
了解和注意这些问题,可以帮助你在设计和使用TCP应用时,更好地应对各种挑战,确保系统的稳定性和性能。
相关文章:

TCP为什么需要三次握手和四次挥手,有哪些需要注意的地方?
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。为了确保数据能够准确无误地从一端发送到另一端,TCP设计了一系列机制来保证通信的可靠性,其中包括连接建立和断开的过程。 三次握手(Three-…...

机器学习(基础2)
特征工程 特征工程:就是对特征进行相关的处理 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。 特征工程API 实例化…...

Cpolar 内网穿透使用
Cpolar登录地址:cpolar - secure introspectable tunnels to localhost 使用固定公网TCP连接ssh ssh -p端口号 用户名公网地址...

ThreadLocal 提供线程局部变量
ThreadLocal作用 相当于建立一个独立的空间,可以把使用频率高的任何类型的数据放到里面,方便调用用来存取数据:set()/get()使用ThreadLocal存储的数据,线程安全 ThreadLocal工具类 /*** ThreadLocal 工具类*/ SuppressWarnings(…...

MongoDB聚合管道数组操作
数组表达式运算符判断数组中是否包含元素( i n ) 并获取元素索引 ( in)并获取元素索引( in)并获取元素索引(indexOfArray) 一、初始化成员数据 db.persons.insertMany([{ "_id" : "1001", "name" : "张三", "fruits" : [ …...

大数据如何助力干部选拔的公正性
随着社会的发展和进步,干部选拔成为组织管理中至关重要的一环。传统的选拔方式可能存在主观性、不公平性以及效率低下等问题。大数据技术的应用,为干部选拔提供了更加全面、精准、客观的信息支持,显著提升选拔工作的科学性和公正性。以下是大…...

Python_爬虫2_爬虫引发的问题
目录 爬虫引发的问题 网络爬虫的尺寸 网络爬虫引发的问题 网络爬虫的限制 Robots协议 Robots协议的遵守方式 Robots的使用 对Robots协议的理解 爬虫引发的问题 网络爬虫的尺寸 爬取网页,玩转网页: 小规模,数据量小,爬取…...

shell编程之编程基础
目录 为什么学习和使用Shell编程Shell是什么shell起源查看当前系统支持的shell查看当前系统默认shellShell 概念 Shell 程序设计语言Shell 也是一种脚本语言用途 如何学好shell熟练掌握shell编程基础知识建议 Shell脚本的基本元素基本元素构成:Shell脚本中的注释和风…...

24.11.15 Vue3
let newJson new Proxy(myJson,{get(target,prop){console.log(在读取${prop}属性);return target[prop];},set(target,prop,val){console.log(在设置${prop}属性值为${val});if(prop"name"){document.getElementById("myTitle").innerHTML val;}if(prop…...

图形几何之美系列:法向量计算之轮廓有向面积辅助法
“ 垂直于平面的直线所表示的向量为该平面的法向量,可以通过法向量识别平面正反面。法向量是轮廓或面的重要特征,求轮廓法向是一种基础的几何工具算法,在图形几何、图像处理等领域具有广泛的应用。” 图形几何之美系列:三维实体结…...

CPU的性能指标总结(学习笔记)
CPU 性能指标 我们先来回顾下,描述 CPU 的性能指标都有哪些。 首先,最容易想到的应该是 CPU 使用率,这也是实际环境中最常见的一个性能指标。 用户 CPU 使用率,包括用户态 CPU 使用率(user)和低优先级用…...

Cadence安装
记录一下安装过程,方便以后安装使用Cadence。 去吴川斌的博客下载安装包,吴川斌博客: https://www.mr-wu.cn/cadence-orcad-allegro-resource-downloads/ 下载阿狸狗破戒大师 我这边下载的是版本V3.2.6,同样在吴川斌的博客下载安装…...

【网络】子网掩码
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是子网掩码,并且能熟练掌握子网掩码的相关计算。 > 毒鸡汤:有些事情,总是不明白,所以我不会…...

Android Osmdroid + 天地图 (二)
Osmdroid 天地图 (二) 前言正文一、定位监听二、改变地图中心三、添加Marker四、地图点击五、其他配置① 缩放控件② Marker更换图标③ 添加比例尺④ 添加指南针⑤ 添加经纬度网格线⑥ 启用旋转手势⑦ 添加小地图 六、源码 前言 上一篇中我们显示了地图…...

使用大语言模型创建 Graph 数据
Neo4j 是开源的 Graph 数据库,Graph 数据通过三元组进行表示,两个顶点一条边,从语意上可以理解为:主语、谓语和宾语。GraphDB 能够通过图来表达复杂的结构,非常适合存储知识型数据,本文将通过大语言实现图数…...

Java poi 模板导出Word 带图片
Java poi 模板导出Word 带图片 重点!!! 官方文档:https://deepoove.com/poi-tl/#_maven 最终效果 模板 其实内容都在官方文档里写的非常明白了 我这里只是抛砖引玉。 Maven依赖 <poi.version>4.1.2</poi.version>…...

SpringCloud-使用FFmpeg对视频压缩处理
在现代的视频处理系统中,压缩视频以减小存储空间、加快传输速度是一项非常重要的任务。FFmpeg作为一个强大的开源工具,广泛应用于音视频的处理,包括视频的压缩和格式转换等。本文将通过Java代码示例,向您展示如何使用FFmpeg进行视…...

shell bash---类似数组类型
0 Preface/Foreword C/C,Python,Java等编程语言,都含有数组类型,那么shell脚本是不是也有类似的语法呢? 1 类似数组类型 1.1 ()类似数组类型 #! /bin/bashecho "Welcome to bash world!" anim…...

IIoT(Industrial Internet of Things,工业物联网)
IIoT(Industrial Internet of Things,工业物联网) 是指物联网技术在工业领域的应用。它将工业设备、传感器、控制系统、数据采集设备等通过互联网或局域网连接起来,实现设备的互联互通和智能化管理。IIoT的目标是提高工业生产效率…...

【C++】引用(reference)
引用是对一个变量或者对象取的别名 定义:真名的数据类型& 别名 真名; 既然是对一个变量或者对象取别名,那就得先有变量或对象,不能凭空取一个别名。也就是定义引用必须初始化。 对引用的操作和对引用对应的变量的操作是完全等价的引用…...

学习日记_20241115_聚类方法(层次聚类)
前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…...

安卓开发怎么获取返回上一级activity事件
在Android开发中,要获取返回上一级Activity的事件,通常是通过点击设备上的返回按钮或者在代码中调用finish()方法时触发的。为了处理这个事件,你可以在当前Activity中重写onBackPressed()方法。 以下是一个简单的例子: Override…...

神经网络与Transformer详解
一、模型就是一个数学公式 模型可以描述为:给定一组输入数据,经过一系列数学公式计算后,输出n个概率,分别代表该用户对话属于某分类的概率。 图中 a, b 就是模型的参数,a决定斜率,b决定截距。 二、神经网络的公式结构 举例:MNIST包含了70,000张手写数字的图像,其中…...

C语言之MakeFile
Makefile 的引入是为解决多文件项目中手动编译繁琐易错、缺乏自动化构建、项目管理维护困难以及跨平台构建不便等问题,实现自动化、规范化的项目构建与管理 MakeFile 简单的来说,MakeFile就是编写编译命令的文件 文件编写格式 目标:依赖文件列表 <Tab>命令列表…...

vue项目PC端和移动端实现在线预览docx、excel、pdf文件
可以参考vue-office官方github:GitHub - loonghe/vue-office: 支持word(.docx)、excel(.xlsx,.xls)、pdf等各类型office文件预览的vue组件集合,提供一站式office文件预览方案,支持vue2和3,也支持React等非Vue框架。…...

FlinkSql读取kafka数据流的方法(scala)
我的scala版本为2.12 <scala.binary.version>2.12</scala.binary.version> 我的Flink版本为1.13.6 <flink.version>1.13.6</flink.version> FlinkSql读取kafka数据流需要如下依赖: <dependency><groupId>org.apache.flink&…...

.NET 9 中 IFormFile 的详细使用讲解
在.NET应用程序中,处理文件上传是一个常见的需求。.NET 9 提供了 IFormFile 接口,它可以帮助我们轻松地处理来自客户端的文件上传。以下是 IFormFile 的详细使用讲解。 IFormFile 接口简介 IFormFile 是一个表示上传文件的接口,它提供了以下…...

使用阿里云远程访问 Synology Web Station 的指南
使用阿里云远程访问 Synology Web Station 的指南 本文将指导如何通过阿里云服务器配置 Nginx 和 FRP,远程访问部署在 Synology NAS 上的 Web Station 服务,同时支持 HTTPS 安全访问。 背景 通过 Synology NAS 的 Web Station,可以部署 Wor…...

LlamaFactory介绍
目录 一、什么是LlamaFactory 1. 安装 LlamaFactory 2. 下载 LLaMA 模型 3. 运行 LLaMA 模型 4. 微调 LLaMA 模型 5. 优化本地运行 6. 推理加速 7. 硬件要求 二、总结 一、什么是LlamaFactory LlamaFactory 是一个用于训练和运行 LLaMA(Meta 的开源大型语言模型)模型…...

vue 项目使用 nginx 部署
前言 记录下使用element-admin-template 改造项目踩过的坑及打包部署过程 一、根据权限增加动态路由不生效 原因是Sidebar中路由取的 this.$router.options.routes,需要在计算路由 permission.js 增加如下代码 // generate accessible routes map based on roles const acce…...