图解TCP三次握手:一步步构建网络会话

在互联网通信中,确保数据传输的可靠性至关重要。TCP三次握手的过程正是为了解决这一问题而设计的。在建立连接之前,客户端和服务器需要确认彼此的存在与准备状态,以防止因网络延迟或数据丢失而导致的错误。通过三次握手,双方不仅能够同步序列号,还能有效地建立稳定的通信链路,从而保证后续数据传输的顺利进行。

TCP基础认识

让我们一起来探索一下TCP头部的格式吧。其中,用颜色标注的部分是与我们讨论的主题关系比较密切的字段,而其余部分我们就暂时不深入探讨了。

  • 序列号:在建立连接的过程中,由计算机生成的一个随机数值被用作初始序列号,并通过SYN数据包传递给接收端主机。每当发送数据时,该序列号会根据所发送的数据字节数进行相应的递增。这种方法有助于解决网络传输中可能出现的数据包乱序问题。

  • 确认应答号:下次预期接收的数据序列号,即为确认应答(ACK)中所指的序列号。当发送端接收到此确认应答后,可以认为该序列号之前的所有数据均已成功传输至接收端。这一机制主要用于解决网络传输过程中可能出现的数据包丢失问题。

  • 控制位

    • ACK:当这个位是1的时候,「确认应答」就生效了。TCP 规定,除了刚开始建立连接时发送的 SYN 包之外,其他情况下这个位都必须设为1

    • RST:当这个位是1的时候,意味着 TCP 连接出了问题,必须强制断开。

    • SYN:当这个位置是1的时候,就表示想要建立连接,并且会在[序列号]那一栏设定一个起始的序列号。

    • FIN:当这个位置为1时,意味着之后不会再发送数据了,想要结束连接。当双方都完成了通信并且想要断开连接时,两台电脑会互相发送FIN位设为1的TCP数据包。

TCP连接建立

TCP是一种需要先建立连接才能使用的协议。在开始传输数据之前,双方得通过一个叫做“三次握手”的过程来建立起这个连接。具体怎么握手的步骤可以看下面的图。

TCP三次握手过程

一开始,客户端和服务端都处于CLOSED状态。先是服务端主动监听某个端口,处于LISTEN状态。

第一个报文:SYN报文

客户端会随机初始化序号client_isn,将此序号置于TCP 首部的序号字段中,同时把SYN标志位置为1 ,表示SYN 报文。接着把第一个SYN报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于SYN-SENT状态。

第二个报文:SYN+ACK报文

服务端收到客户端的SYN报文后,首先服务端也随机初始化自己的序号server_isn,将此序号填入TCP首部的序号字段中,其次把TCP首部的确认应答号字段填入client_isn+1, 接着把SYNACK标志位置为1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于SYN-RCVD状态。

第三个报文:ACK报文

  • 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文TCP首部ACK标志位置为1 ,其次确认应答号字段填入server_isn+1 ,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于ESTABLISHED状态。
  • 服务器收到客户端的应答报文后,也进入ESTABLISHED状态。

通过ENSP搭建一个简单的实验环境,如下图

为了让大家直观了解三次握手的过程,以下通过Wireshark抓包软件,抓取三次握手的数据包。

三次握手数据包

  • 第一次握手标志位

从标志位看出,同步位有值,在做请求SYN:Syn同步位为1

第一次握手数据包

  • 第二次握手标志位

从标志位看出,确认位、同步位有值,在做应答SYN+ACKSyn同步位为1Acknowledgment 确认位为1

第二次握手数据包

  • 第三次握手标志位

从标志位看出,只有确认位有值,在做再次确认SYNAcknowledgment确认位为1

第三次握手数据包

常见面试题

  1. TCP 建立连接为什么要三次握手而不是两次?

TCP连接需要三次握手,而不是两次,主要是为了保证两边都能顺利通信,而且连接稳定。第一次握手时,客户端告诉服务器想建立连接;第二次握手,服务器回复说它已经准备好接受连接了;第三次握手是客户端再次确认,确保双方都已经准备好发送数据了。如果只有两次握手的话,有时候可能会导致客户端和服务器之间的情况不对等,造成数据丢失或者连接不稳定的问题。所以,通过三次握手,可以确保两边都确认好了,为后面的数据传输做好准备。

  1. TCP 建立连接为什么要三次握手而不是四次?

TCP用三次握手而不是四次来建立连接,是因为三次已经足够确认双方状态和同步序列号了。第一次握手是客户端发出请求,第二次握手是服务器回应,第三次握手是客户端再次确认,这样就能可靠地建立起连接。如果改成四次握手,反而会增加不必要的等待时间和资源浪费。三次握手既能保证双方都准备好通信,又能快速有效地完成连接。

  1. 有一种网络攻击是利用了TCP建立连接机制的漏洞,你了解吗?这个问题怎么解决?

一种利用TCP连接建立过程中潜在安全漏洞的网络攻击手段被称为TCP SYN Flood攻击。此类攻击策略性地利用了TCP三次握手协议的特性,通过向目标服务器发送大量SYN(同步序列编号)请求报文,但故意不响应最终的ACK(确认应答)报文来完成握手过程。这种行为会导致目标服务器上开放大量的半开连接状态,进而消耗其有限的资源,如内存和处理能力,最终使得服务器难以或无法为合法用户提供服务。

解决方案

  • SYN Cookies:服务器在收到SYN请求时不立即分配资源,而是生成一个加密的SYN Cookie,只有在收到合法的ACK时才会真正建立连接。
  • 限制SYN请求速率:通过配置防火墙或入侵检测系统(IDS)来限制某个IP地址的SYN请求频率,防止过多请求。
  • 使用负载均衡:将流量分散到多个服务器,减少单一服务器的压力。
  • 设置连接超时:调整服务器的连接超时设置,减少等待状态的持续时间。

推荐阅读


  • Linux命令记不住?试试这个神奇的工具,让你事半功倍!

  • AWK不再难:案例驱动学习,让你成为数据处理高手

  • 忘记密码?一招教你轻松重设欧拉系统密码!

  • 从监控到优化:掌握磁盘I/O性能工具的使用

  • 超越top!探索htop在Linux系统监控中的超强功能

  • 网络架构大解析:这五种拓扑结构将改变你对网络的认知!

  • 掌握Linux性能监控神器:atop实用指南

  • 告别繁琐操作,掌握一线工作中的Shell脚本绝招!

  • 重磅消息:utools工具插件现在完全免费,快来享受!

  • 不可错过!字节跳动打造的最新生产力工具来了

  • 提升效率必备!学习awk命令,轻松搞定数据

  • 高效传输秘籍,揭秘Rsync和SCP的优劣,助你做出明智选择!

  • 当你拥有一台云服务器,你最想做的事情是啥?

  • IP地址乱成一团?用Shell一键搞定!

  • Nginx日志分析:编写Shell脚本进行全面日志统计

  • 如何用find命令按文件大小快速查找并美化输出显示

  • 不再担心数据丢失:用rsync打造你的自动化备份解决方案

  • 从繁琐到简单:Python实现快速批量文件重命名攻略!


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

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

相关文章

[ shell 脚本实战篇 ] 编写恶意程序实现需求(恶意程序A监测特定目录B出现特定文件C执行恶意操作D-linux)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

讲讲RabbitMQ 性能优化

大家好,我是锋哥。今天分享关于【RabbitMQ 性能优化?】面试题。希望对大家有帮助; 讲讲RabbitMQ 性能优化 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ 是一个强大的消息代理,广泛用于分布式系统中&#x…

2-139 基于matlab的弹道轨迹仿真

基于matlab的弹道轨迹仿真。设计GUI图形用户界面,对导弹参数根据需求进行设置,直观的实现更改攻角、各级火箭喷射时间等参数后得到对应参数下的导弹弹道图像以及导弹的飞行时间和飞行距离。得到飞行时间集导弹射程。程序已调通,可直接运行。 …

【spark的集群模式搭建】Standalone集群模式的搭建(简单明了的安装教程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接4、配置spark环境变量5、修改 spark-env.sh配置文件6、启动hdfs,创建文件夹7、修改spark-defaults.conf配置文件8、修改workers配置文件9、修改log4j.properties配置文件(可选&…

HTML 基础标签——多媒体标签<img>、<object> 与 <embed>

文章目录 1. `<img>` 标签主要属性示例注意事项2. `<object>` 标签概述主要属性示例注意事项3. `<embed>` 标签概述主要属性示例注意事项小结在现代网页设计中,多媒体内容的使用变得越来越重要,因为它能够有效增强用户体验、吸引注意力并传达信息。HTML 提…

校门外的树(算法:标记法)

思路实现&#xff1a; 1.利用二维数组来存储输入数据 2.开辟一个包含所有范围的数组用来做标记初始为0 3.遍历二维数组&#xff0c;取到每段区间的开始位置和结束位置&#xff0c;在标记数字组中将边界点及边界点内置1 4.遍历标记数组记录0的个数&#xff0c;即可 代码实现…

100M宽带测速只有20M

100M宽带测速只有20M的原因主要有以下几点‌&#xff1a; ‌网络设备不匹配‌&#xff1a;100兆宽带的实际使用需要全千兆路由器、超五类网线以及千兆网卡的支持。如果使用老旧的路由器、五类网线或百兆网卡&#xff0c;可能会导致网速受限。例如&#xff0c;使用普通网线可能…

二、基础语法

入门了解 注释 **作用&#xff1a;**在代码中加一些注释和说明&#xff0c;方便自己或者其他程序员阅读代码 两种格式&#xff1a; 单行注释&#xff1a;// 描述信息 通常放在一行代码的上方&#xff0c;或者一条语句的末尾&#xff0c;对该行代码进行说明 多行注释&#x…

minikube 的 Kubernetes 入门教程--(五)

本文记录 Minikube 在 Kubernetes 上安装 WordPress 和 MySQL。 这两个应用都使用 PersistentVolumes 和 PersistentVolumeClaims 保存数据。 在深入这些步骤之前&#xff0c;先分享来自kubernetes.io教程。 链接>>使用持久卷部署 WordPress 和 MySQL | Kubernetes 获…

向量数据库|第2期|pgvectorscale

向量数据库|第2期|pgvectorscale 大家都听说过pgvector&#xff0c;一个PostgreSQL存储和查询向量的扩展&#xff0c;是PG AI生态当之无愧的最受推崇的工具之一。pgvector向PG中添加了vector类型&#xff0c;以及各种搜索操作符和索引&#xff0c;使其拥有vectors和metadata的完…

【sqlmap使用】

sqlmap简介 sqlmap 目录结构 sqlmap常用参数 sqlmap实现注入 测试注入点&#xff0c;检测到注入点后&#xff0c;直接爆数据库名 python sqlmap.py –u http://172.16.12.2/7/9/strsql.php --data "usernameadmin" --dbs注意sqlmap在使用过程中可能会出现几个需要…

通过源码分析类加载器里面可以加载的类

类列表 每一个ClassLoader里面的类列表&#xff0c;类的数量都是固定的。 对上一节中的dex反编译 使用DexClassLoader类动态加载插件dex   利用jadx对dex进行反编译可以看到有哪些类 源码分析 BaseDexClassLoader 从BaseDexClassLoader类加载器开始分析 在BaseDexClassLoade…

宝塔使用clickhouse踩坑

前言 最近有个物联网项目&#xff0c;需要存储物联网终端发送过来的信息&#xff08;类似log日志&#xff0c;但又要存储在数据库里&#xff0c;方便后期聚合统计&#xff09;&#xff0c;本来想写文件的奈何客户要求聚合统计&#xff0c;所以只能用数据库才能达到更高的计算效…

parted 磁盘分区

目录 磁盘格式磁盘分区文件系统挂载使用扩展 - parted、fdisk、gdisk 区别 磁盘格式 parted /dev/vdcmklabel gpt # 设置磁盘格式为GPT p # 打印磁盘信息此时磁盘格式设置完成&#xff01; 磁盘分区 开始分区&#xff1a; mkpart data_mysql # 分区名&…

NFTScan Site:以蓝标认证与高级项目管理功能赋能 NFT 项目

自 NFTScan Site 上线以来&#xff0c;它迅速成为 NFT 市场中的一支重要力量&#xff0c;凭借对各类 NFT 集合、市场以及 NFTfi 项目的认证获得了广泛认可。这个平台帮助许多项目提升了曝光度和可见性&#xff0c;为它们在竞争激烈的 NFT 市场中创造了更大的成功机会。 在最新更…

leetcode-5-最长回文子串

题解&#xff1a; 回文串&#xff1a;如果一个字符串正着读和反着读都是一样的那这个字符串就是回文串。 对于一个子串而言&#xff0c;如果它是回文串&#xff0c;并且长度大于 2&#xff0c;那么将它首尾的两个字母去除之后&#xff0c;它仍然是个回文串。 1、初始化字典d…

mysql5安装

1.下载安装包 https://downloads.mysql.com/archives/community/ mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar tar -xvf mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar2.安装依赖 yum -y install perl yum -y install net-tools yum install numactl libaio libaio-devel -y也可…

【工具变量】“宽带中国”试点城市名单匹配数据集(2000-2023年)

参照秦文晋&#xff08;2022&#xff09;的《网络基础设施建设对数字经济发展的影响研究——基于"宽带中国"试点政策的准自然实验》一文中的做法&#xff0c;将选为“宽带中国”试点城市的虚拟变量作为核心解释变量&#xff0c;当一个城市被批复成为“宽带中国”试点…

php内置服务停止shell小工具,用来停止指定的端口的php内置服务进程

最近vscode总是喜欢闪退&#xff0c;这导致了上面启动的php内置服务变成了无法管理状态&#xff0c;所以就有了这个工具来停止相关的PHP内置服务进程. 将下面的代码保存到本地合适的位置&#xff0c;并命名为 stop.sh #!/bin/bash # Author: tekintian # Date: 2024-11-02 …

Servlet 3.0 注解开发

文章目录 Servlet3.0注解开发修改idea创建注解的servlet模板内容讲解 关于servlet3.0注解开发的疑问_配置路径省略了属性urlPatterns内容讲解内容小结 Servlet3.0注解开发 【1】问题 说明&#xff1a;之前我们都是使用web.xml进行servlet映射路径的配置。这样配置的弊端&…