TCP的三次握手与四次挥手

TCP的三次握手与四次挥手

1.网络分层

网络分层代表硬件协议/技术特性
应用层HTTP,DNS,FTP,SMTP,Telnet协议等应用程序实现的,规定应用程序的数据格式
传输层TCP/UDP协议负责两主机之间的数据正确传输主机系统内核实现的
网络层路由器IP协议负责地址管理和路由选择(确定对应主机),如何将数据从发送方路由到接收方
数据链路层交换机以太网,令牌环网,无线LAN,ARP协议(查找MAC地址)负责设备之间的数据
物理层双绞线,wifi电磁波(无线)集线器,网卡发送0,1光电信号,负责比特流在节点间的传输

2.TCP的三次握手与四次挥手

开始的时间:传输层

2.1TCP的传输如图所示:

在这里插入图片描述

2.2 SYN与ACK的作用

在TCP协议中,SYNACK是两个标志位(Flag)用于标识TCP数据包的类型。SYN是**Synchronize(同步)的缩写,ACKAcknowledgement(确认)**的缩写。

具体来说,当一台计算机向另一台计算机建立TCP连接时,它会发送一个SYN数据包,用来请求建立连接。而当接收到这个SYN数据包后,另一台计算机会回复一个SYN+ACK数据包,表示已经收到了请求,并准备好建立连接。最后,第一台计算机会回复一个ACK数据包,表示已经确认了连接。

SYNACK标志位在TCP三次握手的过程中起着重要作用,具体来说:

  1. SYN标志位用于标识TCP连接建立请求,通常由客户端发起,表示客户端要向服务器发起连接请求。
  2. ACK标志位用于标识TCP数据包的确认,表示数据包已经成功传输。在TCP三次握手中,服务器在回复SYN+ACK请求时,会将ACK标志位设置为1,表示已经确认了客户端的请求。

总之,SYNACK标志位是TCP协议中用于标识数据包类型的重要标志位,它们在TCP三次握手过程中发挥着关键作用,确保TCP连接的可靠性和稳定性。

2.3 seq的作用

在TCP协议中,序列号(Sequence Number,简称seq)是用于标识TCP数据包中数据的序号。每个TCP数据包都会包含一个序列号,用来标识传输的数据在整个TCP连接中的位置。

序列号主要有两个作用:

  1. **确定数据包的顺序:**序列号用于标识TCP数据包中传输数据的顺序。在TCP连接建立后,每个数据包都会按照序列号顺序进行传输,确保数据能够正确到达接收方。
  2. **确定数据包的唯一性:**序列号也用于标识TCP数据包的唯一性。每个TCP数据包的序列号都是唯一的,确保每个数据包都能够正确地被接收方识别。

在TCP连接建立时,客户端和服务器都会生成一个随机的初始序列号(ISN),用于标识数据包的序列号。在建立连接时,客户端和服务器会相互发送带有自己ISN的SYN数据包,以此来确认对方的序列号。

总之,序列号是TCP协议中的一个重要概念,用于标识TCP数据包中传输数据的序号,保证数据包按照正确的顺序进行传输,并保证每个数据包的唯一性。

2.4 TCP的三次握手

2.4.1 三次握手的作用

建立TCP连接后传递数据

2.4.2 具体步骤

TCP三次握手是建立TCP连接的过程,其主要目的是确保客户端和服务器之间的通信能够正常进行。这个过程涉及到三个主要步骤:

  1. 客户端向服务器发送一个SYN请求(SYN=1),表示客户端要向服务器发起连接请求。客户端首先会随机生成一个初始序列号(ISN),用于标识客户端发送的数据包。
  2. 服务器接收到客户端的SYN请求后,回复一个SYN+ACK请求(SYN=1,ACK=1),表示服务器已经接收到了客户端的请求,并准备好建立连接。服务器在回复SYN+ACK请求时,会将自己的初始序列号(ISN)加1作为确认号(ACK),同时也会生成一个自己的随机序列号(ISN)作为标识。
  3. 客户端接收到服务器的SYN+ACK请求后,回复一个ACK请求(SYN=0,ACK=1),表示客户端已经接收到了服务器的回复,连接已经建立。在ACK请求中,客户端将确认号设置为服务器发送的序列号加1,将序列号设置为客户端初始序列号加1。

这个过程可以用以下步骤概括:

  1. 客户端发送SYN请求,包含客户端的初始序列号。
  2. 服务器回复SYN+ACK请求,包含服务器的初始序列号和确认号。
  3. 客户端回复ACK请求,确认连接建立,包含客户端和服务器的序列号和确认号。

在三次握手过程中,如果任何一方没有收到另一方的请求,就会超时并重新发送请求,直到连接建立成功或者放弃连接。这个过程可以确保客户端和服务器之间的通信是可靠和稳定的。

在TCP三次握手过程中,最后的ACK请求中,SYN标志位通常被设置为0,而不是1。这是因为SYN标志位在握手过程中的作用仅限于建立连接阶段,一旦连接已经建立,SYN标志位就不再有意义。在建立连接后,TCP通信的双方会开始正式的数据传输,这时ACK标志位变得更为重要,因为它表示双方已经确认了彼此的数据。

在TCP三次握手的最后一步中,客户端向服务器发送的ACK请求中,SYN标志位被设置为0,是为了告诉服务器,客户端不再需要SYN标志位了,连接已经建立成功,可以开始数据传输了。此时ACK标志位被设置为1,表示客户端已经接收到服务器的SYN+ACK请求,并已经确认了连接建立成功。

因此,SYN标志位在TCP三次握手的过程中是用来建立连接的,而在连接建立后,SYN标志位就没有作用了。而ACK标志位则是在整个TCP通信过程中都非常重要的标志位,用来确认双方的数据是否已经正确传输。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hEbFVX7b-1687357928695)(../../assets/image-20230413031201008.png)]

最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。

2.5.TCP的四次挥手

2.5.1四次挥手的作用

数据传送完毕,断开连接时就需要进行TCP的四次挥手

2.5.2具体步骤

  1. 第一次挥手(FIN):关闭方向被关闭的一方(例如客户端)发送一个FIN数据包给对方(例如服务器),表示它已经没有数据要发送给对方了,但是仍然可以接收数据。
  2. 第二次挥手(ACK):对方(例如服务器)收到了关闭方发送的FIN数据包,向关闭方发送一个ACK数据包作为响应,表示已经接收到了关闭方的请求。
  3. 第三次挥手(FIN):对方(例如服务器)向关闭方发送一个FIN数据包,表示对方已经没有数据要发送给关闭方了。
  4. 第四次挥手(ACK):关闭方(例如客户端)收到了对方发送的FIN数据包,向对方发送一个ACK数据包作为响应,表示已经接收到了对方的请求。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kyl0qzri-1687357928696)(../../assets/image-20230413031217176.png)]

3.注意

3.1为什么是三次握手

原因主要有两个:
1、主要原因是为了防止历史连接

三次握手时,在网络拥堵等情况下,第一次握手的SYN包迟迟没能发送到服务端,那么客户端会连续发送多次 SYN 建立连接的报文,那么就可能出现一个「后发送SYN 报文」比「早发送的 SYN 报文」 早到达了服务端;

那么此时服务端就会回一个 SYN + ACK 报文给客户端;

如果是两次握手连接,就不能判断当前连接是否是历史连接,导致错误。

三次握手时,客户端收到后可以根据自身的上下文,判断这是一个历史连接(序列号过期或超时),那么客户端就会发送 RST 报文给服务端,中止这一次连接。

2、三次握手可以避免资源浪费

如果只有「两次握手」,当客户端的 SYN 请求连接在网络中阻塞,客户端没有接收到 ACK 报文,就会重新发送 SYN ,

如果是三次握手,第三次握手时服务器可以得到客户端的ack,知道连接已成功建立。
如果没有第三次握手,服务器不清楚客户端是否收到了自己发送的建立连接的 ACK 确认信号,所以每收到一个 SYN 就只能先主动建立一个连接,如果客户端的 SYN 阻塞了,重复发送多次 SYN 报文,那么服务器在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。

3.2为什么是四次挥手

为什么建立连接是三次握手,关闭连接确是四次挥手呢?

关闭连接时无法优化为三次,原因如下:

服务器收到对方的FIN报文时,很可能还有数据没发完,需要等到数据发送完毕之后才向客户端发送FIN报文,但是又不能让客户端等太久,就先发ACK告诉客户端我收到了你的FIN释放连接请求,客户端收到ACK之后便不会重复发送断开连接的请求。
等到服务器数据传输完毕后,才会发FIN释放连接报文。

另外,如果服务端确定没有数据需要发给客户端,那么当然是可以把 FIN 和 ACK 合并成一个包,四次挥手的过程就成了三次。

3.3为什么三次握手中server给client传递的ack = seq+1

在TCP三次握手中,服务器端在收到客户端发送的SYN包后,需要确认客户端发送的序列号seq,并且也需要向客户端发送一个ACK数据包以确认收到了客户端发送的SYN包。因此,服务器端向客户端发送的ACK数据包中的确认号ack需要设置为客户端发送的SYN包的序列号seq加1,表示服务器端已经成功接收到了客户端发送的SYN包,并且下一个数据包应该从seq+1开始发送。

这种设置ACK的确认号ack等于seq+1的方式,可以保证客户端能够收到服务器端的确认信息,并且也可以避免服务器端接收到重复的SYN包时重复建立连接

(在ACK包中确认收到客户端发送的SYN包的序列号seq,同时在ACK包中将确认号ack设置为seq+1。这样,在客户端重复发送相同的SYN包时,服务器端会忽略掉这些重复的SYN包,因为在之前已经确认过这些SYN包,并且已经返回过相应的ACK包。这就可以避免重复建立连接的问题。)

同时,这种设置还可以防止一些恶意攻击,例如SYN洪泛攻击,防止攻击者利用TCP的设计漏洞来占用服务器资源或者造成拒绝服务等问题。

因此,在TCP三次握手中,服务器端向客户端发送的ACK数据包中的确认号ack等于seq+1,是一种合理且有效的设置方式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端Vue自定义简单实用中国省市区三级联动选择器

前端Vue自定义简单实用中国省市区三级联动选择器&#xff0c; 请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13118 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- themeColor:主题颜色 ref:设置唯一ref pickerValueDefault:默认选择…

周大福荣获2023亚洲零售大奖——年度珠宝零售商

由成立于1991年、服务于亚洲充满活力的零售业的行业杂志—《亚洲零售杂志》主办的“2023亚洲零售大奖”评选结果于6月15日揭晓&#xff0c;周大福珠宝集团凭借创新和卓越的表现荣获“2023亚洲零售大奖—年度珠宝零售商&#xff08;中国&#xff09;”&#xff0c;是中国唯一入榜…

【kafka】kafka基础架构

文章目录 1、kafka简介2、kafka的特性3、kafka的应用场景4、kafka架构&#xff08;重点&#xff09;4.1、broker4.2、topic4.3、partition4.4、offset4.5、producer4.6、consumer4.7、consumer group4.8、leader4.9、follower4.10、rebalance 5、对kafka架构的几点解释6、几种M…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 21 日论文合集)

文章目录 一、检测相关(14篇)1.1 CrossKD: Cross-Head Knowledge Distillation for Dense Object Detection1.2 Depth and DOF Cues Make A Better Defocus Blur Detector1.3 Spatiotemporal Pyramidal CNN with Depth-Wise Separable Convolution for Eye Blinking Detection …

Windows 离线安装mysql5.7

一、下载MySQL5.7最新版 1、官网地址 https://downloads.mysql.com/archives/community/ 2、下载MySQL5.7最新版 下载下图所示的安装包&#xff1a; 二、安装MySQL5.7 1、解压 将刚才下载压缩包解压搭配目录C:\software\mysql-5.7.41&#xff0c;&#xff08;路径大家可…

物联网通信技术

通信的技术指标是什么&#xff1f;AB A. 可靠性 B. 有效性 C. 实时性D. 广覆盖 多路复用技术有哪些&#xff1f;ABCD A. FDMA B. CDMA C. SDMA D. TDMA 使用多个频率来传输信号的技术被称为扩展频谱技术&#xff0c;该技术使用的目的是什么&#xff1f; AB A. 抗干扰B. 提…

python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)

目录 一、前言二、基于轨迹与路面重心偏离度误差的预测自动差速小车循迹控制策略三、轨迹图像的处理要点四、本篇部分核心控制策略python代码&#xff1a;五、结论 一、前言 基于最近的测试&#xff0c;得到了一种粗略控制的算法&#xff0c;其控制效果适合单线路和急转弯的情…

我们该如何提升测试效率?

在大部分研发项目经理心中&#xff0c;进度往往会放在第一位&#xff0c;其次是成本&#xff0c;最后是质量&#xff0c;当然人员队伍最好也要稳定。天下武功&#xff0c;唯快不破&#xff1a;进度 > 成本 > 质量 > 人。 这个说法并不是绝对&#xff0c;今天我们并不是…

高频前端React面试题汇总

近期整理了一下高频的前端面试题&#xff0c;分享给大家一起来学习。如有问题&#xff0c;欢迎指正&#xff01; 一、组件基础 1. React 事件机制 <div onClick{this.handleClick.bind(this)}>点我</div>React并不是将click事件绑定到了div的真实DOM上&#xff0…

DDOS攻击防御实战(威胁情报)

背景&#xff1a; 不知道大家最近有没有关注到&#xff0c;百度云CDN不支持免费了&#xff0c;网站安全问题越来越严重了…… 常见攻击 DDOS Distributed Denial of Service 分布式拒绝服务攻击可以使很多的计算机在同一时间遭受到攻击&#xff0c;使攻击的目标无法正常使用&…

css基础知识六:谈谈你对BFC的理解?

一、是什么 我们在页面布局的时候&#xff0c;经常出现以下情况&#xff1a; 这个元素高度怎么没了&#xff1f;这两栏布局怎么没法自适应&#xff1f;这两个元素的间距怎么有点奇怪的样子&#xff1f; 归根究底是元素之间相互的影响&#xff0c;导致了意料之外的情况&#…

C++完成淄博烧烤节管理系统

背景&#xff1a; 这次我们结合今年淄博烧烤做一个餐厅管理系统&#xff0c;具体需求如下&#xff0c;我们选择的是餐饮商家信息管理 问题描述&#xff1a; 淄博烧烤今年大火&#xff0c;“进淄赶烤”是大家最想干的事情&#xff0c;淄博烧烤大火特火的原因&#xff0c;火的…

X86架构与Arm架构区别

X86架构和ARM架构是主流的两种CPU架构&#xff0c;X86架构的CPU是PC服务器行业的老大&#xff0c;ARM架构的CPU则是移动端的老大。X86架构和arm架构实际上就是CISC与RISC之间的区别&#xff0c;很多用户不理解它们两个之间到底有哪些区别&#xff0c;实际就是它们的领域不太相同…

【前端 - CSS】第 15 课 - 复合选择器

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、复合选择器 2.1、后代选择器 2.2、子代选择器 2.3、并集选择器 2.4、交集选择器&#xff08;了解&#xff09…

【华为自研】| 国产数据库 GaussDB崛起

目录 GaussDBGaussDB 简介产品优势GaussDB(for openGauss)GaussDB(for MySQL)GaussDB(for Cassandra)GaussDB(for Mongo)GaussDB(for Redis)GaussDB(for Influx) GaussDB GaussDB采用一体化架构&#xff0c;同时支持关系型和非关系型数据库引擎&#xff0c;能够满足政企全方位…

【前端布局篇】响应式布局 Bootstrap 移动端布局

前言 1. 布局介绍 布局:layout 对事物的全面规划和安排 页面布局&#xff1a;对页面的文字、图形或表格进行格式设置。包括字体、字号、颜色纸张大小和方向以及页边距等。 网页布局&#xff1a;利用html搭建结构与内容&#xff0c;使用CSS添加装饰 网页布局有很多种方式&a…

Binder对象的流转(系统服务的调用过程、AIDL的使用过程)

零、Binder的传递 Android系统中&#xff0c;存在大量的 IPC 交互&#xff0c;同时也使用了大量的 Binder&#xff0c;那么Binder是怎么在各进程中进行对象的传递&#xff1f; 一、调用系统服务时&#xff0c;Binder的传递 回忆一下&#xff0c;Android系统的启动流程&#x…

数据结构--》从数据结构开始,打好算法基础

目录 数据结构的基本概念 数据结构的三要素 算法的基本概念 数据结构的基本概念 在学习某个知识之前&#xff0c;我们是否都有问过自己我们到底在学习的目的是什么&#xff1f;学习数据结构也一样&#xff0c;我们学习数据结构主要是为了用程序把现实世界的问题信息化&#…

Fiddler之日常使用简介

目录 前言&#xff1a; Fiddler界面简介 一、Fiddler抓取http、https请求配置 二、抓取指定域名会话 三、http请求统计试图 前言&#xff1a; Fiddler是一款功能强大的Web调试工具&#xff0c;它可以帮助开发人员在开发和测试过程中捕获、修改和检查HTTP请求和响应。 使用Fiddl…

leetcode111. 二叉树的最小深度(java)

二叉树的最小深度 leetcode111. 二叉树的最小深度题目描述 DFS 深度优先遍历解题思路代码演示 BFS 广度优先遍历解题思路代码演示 往期经典 leetcode111. 二叉树的最小深度 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problem…