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)
引用是对一个变量或者对象取的别名 定义:真名的数据类型& 别名 真名; 既然是对一个变量或者对象取别名,那就得先有变量或对象,不能凭空取一个别名。也就是定义引用必须初始化。 对引用的操作和对引用对应的变量的操作是完全等价的引用…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...