【网络编程】深入理解TCP协议一(三次握手四次挥手、标记位、确认应答机制、超时重传机制)

news2024/11/27 17:58:59

0000

TCP协议

  • 1.三次握手四次挥手
  • 2.TCP协议段格式
  • 3.标记位介绍
  • 4.确认应答机制
  • 5.超时重传机制

1.三次握手四次挥手

0001

  1. 当客户端发起连接请求时,SYN需要被设置位1,告诉服务器客户端希望建立一个链接
  2. 服务器收到响应之后会回复 SYN+ACK,表示确认了客户端地连接请求,同时服务器也会设置ACK标记位,该标记位表示服务器已经接受到了客户端地链接请求,并且已经做好了与客户端链接地 准备(大多数情况下都是,对历史报文的确认)
  3. 客户端回复ACK,表示确认。
  4. 当通信结束时,由客户端发起fin请求,表示断开请求

当客户端发起一个FIN(Finish)请求时,表示客户端希望关闭连接。此时,客户端的状态会从ESTABLISHED状态(已建立连接)变为FIN-WAIT-1状态。客户端进入FIN-WAIT-1状态后,它正在等待来自服务器的确认,以完成连接的正常关闭。
在TCP连接的正常关闭过程中,连接的一方会首先发送一个FIN请求,然后等待对方的确认。在这个等待状态中,客户端会处于FIN-WAIT-1状态。一旦客户端收到了服务器的确认,它会进入FIN-WAIT-2状态,然后等待服务器发起的关闭步骤。
所以,客户端并不是在发送FIN请求的那一刻就立刻变成FIN-WAIT状态。而是在发送FIN请求后,等待对方确认之后才会进入FIN-WAIT-1状态。接下来,客户端将等待服务器的FIN请求,然后完成连接的关闭过程。

  1. FIN_WAIT1和FIN_WAIT2状态的区别

FIN-WAIT-1 和 FIN-WAIT-2 是 TCP 连接的两个不同状态,它们之间的主要区别在于等待的事件和条件:
FIN-WAIT-1状态:
进入条件:客户端在发送了一个FIN(Finish)请求后,进入FIN-WAIT-1状态。
事件和等待条件:客户端正在等待来自服务器的ACK(确认)以确认其关闭请求。在这个状态下,客户端等待服务器确认关闭请求,以便安全地关闭连接。
FIN-WAIT-2状态:
进入条件:一旦客户端收到了服务器对自己的FIN请求的ACK确认,它就会进入FIN-WAIT-2状态。
事件和等待条件:在FIN-WAIT-2状态下,客户端等待服务器发起的FIN请求。客户端已经完成了主动关闭连接的操作,现在等待服务器也发出关闭请求,以便完成连接的正常关闭。
总结:
FIN-WAIT-1状态是客户端等待来自服务器的ACK确认,以确认自己的关闭请求。
FIN-WAIT-2状态是客户端等待服务器发起的关闭请求,以完成连接的正常关闭。客户端已经完成了主动关闭步骤。

  1. timewait状态

TIME-WAIT 状态是 TCP 连接的一种状态,它表示一个连接已经被正常关闭,但在这个状态下,操作系统仍然保留连接信息一段时间。TIME-WAIT 状态的存在是为了确保连接的可靠关闭和避免出现连接混淆。
TIME-WAIT 状态主要有以下两个作用:
确保可靠关闭连接: 在 TIME-WAIT 状态下,操作系统等待一段时间(称为 2MSL,Maximum Segment Lifetime,最大报文生存时间)才会清除连接信息。这段时间内,如果网络中还有之前的数据包在传输,这些数据包仍然能够正确地被关联到已关闭的连接,而不会与后续的新连接混淆。这样可以确保数据包按照正确的顺序到达,并且不会被误认为属于新连接。
处理延迟重复数据包: 在网络中,数据包可能会因各种原因而被延迟或复制。TIME-WAIT 状态能够处理延迟到达的 ACK 数据包。如果在 TIME-WAIT 状态下接收到与之前连接相关的 ACK 数据包,操作系统会忽略它们,以防止它们被误认为属于新连接。
总之,TIME-WAIT 状态是 TCP 连接管理的一部分,它有助于确保连接的可靠关闭,并维护连接信息,以应对网络中的延迟和复制数据包。它是 TCP 协议的一部分,设计用于提高连接的可靠性和稳定性。

当服务器最后一次回复ack的时候此时服务器状态会被置为LASTACK,表示不会再发消息给客户端,但是此时的客户端并不会马上关闭,保证可靠传输他会等上一段时间(服务器没拿完数据),最后在close链接。

2.TCP协议段格式

0002

  • 源端口号和目的端口号:表示数据是从哪个进程来, 到哪个进程去,通过这两个端口号,网络就能够将数据包准确地发送到目标或者服务器程序,这是TCP/IP协议实现端到端通信地关键一环。
  • 32位序号:是TCP协议为每个字节的数据进行的编号。这个编号是唯一的,也就是说,每一条数据都有一个唯一的32位序号。这个序号用于标识发送端每次发送的数据,这样接收端就能正确地将数据按照发送的顺序进行接收。
  • 而32位确认序号:是接收端对于发送端消息的应答序号。这个序号表明所有该序号之前的信息都被接收端成功接收。如果发送端发送了一条数据,接收端成功接收后,就会返回一个确认序号,表示所有该确认序号之前的数据都已经被成功接收。这个机制保证了数据的可靠传输,并且如果数据在传输过程中丢失或者损坏,可以进行重传。
  • 16位窗口大小

在 TCP 协议中,16 位窗口大小指的是 TCP 报文段中的窗口字段,它占用了 16 位(2 个字节)的二进制位数,用来表示发送方可以接收的字节数量。
窗口大小的概念是为了实现流量控制和拥塞控制而引入的。发送方和接收方都维护一个窗口大小的值,用来表示它们各自可以处理的数据量。窗口大小是动态调整的,根据网络条件和接收方的处理能力进行调整。
具体来说,当接收方希望发送方减缓发送速率时,它会将窗口大小减小,从而限制发送方发送的数据量。当接收方准备好接收更多数据时,它会增加窗口大小,允许发送方发送更多数据。
16 位窗口大小的字段允许窗口大小的范围从 0 到 65535 个字节,因此发送方可以发送的数据量也在这个范围内动态调整。这种机制有助于避免网络拥塞和提高网络效率,因为它允许发送方根据接收方的能力来调整发送速率,以保持网络的稳定性和可靠性。
总之,16 位窗口大小是 TCP 协议中用来进行流量控制的重要字段,它允许发送方和接收方动态地调整数据传输速率,以适应不同的网络条件和接收方的处理能力。

3.标记位介绍

  • SYN(Synchronize): SYN 标记位用于建立一个新的 TCP 连接。当客户端希望与服务器建立连接时,它会向服务器发送一个带有 SYN 标记位的 TCP 报文,这个过程称为 TCP 三次握手。SYN 标记位的序列号用于初始化连接的起始序列号。

  • ACK(Acknowledgment): ACK 标记位用于确认接收到的数据。当这个标记位被设置时,它表示该报文包含一个有效的确认号字段,确认了前面收到的数据。通常,除了在连接建立时的初始 SYN 报文外,其他 TCP 报文都会设置 ACK 标记位。

  • FIN(Finish): FIN 标记位用于关闭一个 TCP 连接。当一方希望关闭连接时,它会发送一个带有 FIN 标记位的报文,这个过程称为 TCP 四次挥手。发送 FIN 标记位表示该方不再发送数据,但仍愿意接收数据。

  • RST(Reset): RST 标记位用于强制关闭一个连接。当某些异常情况发生时,可以发送一个带有 RST 标记位的报文来迅速终止连接,而不进行正常的关闭过程。例如,当尝试连接一个未打开的端口时,对方会发送 RST 报文。

  • PSH(Push): PSH 标记位用于提示接收方立即将接收到的数据交给应用层,而不是等到缓冲区满后再交付。这对于实时数据或需要低延迟的应用场景非常有用。

双发在建立通信的时候,由于某些原因,接收端没及时把缓冲区的数据拿走,导致缓冲区满了,这时发送方就可以发送送PSH请求,让接收端马上把缓冲区数据拿走

  • URG(Urgent): URG 标记位用于标识报文中的紧急数据。当这个标记位被设置时,数据报文中的某些部分被标记为紧急,接收方应尽快处理这部分数据。URG 标记位通常与紧急指针字段一起使用,指示了紧急数据的位置。

报文在发送的时候,可能是乱序到达的,是一种不可靠传输,在有些特殊的应用场景,我们需要设置一些优先级更高的数据,但是正常传输的话不能满足优先级传输,此时就可以讲URG置1,按优先级处理 应用:当客户端和服务器异常的时候,客户端发送了大量的信息给服务器,但是这时由于各种原因,导致服务器异常,没能及时处理数据,客户端也没收到服务器的响应,此时客户端不知道还要不要给服务器发送消息,这时候就可以设置URG,发送一个确认请求(优先级高于前面的数据),及时给服务器,服务器马上响应,给客户端反馈原因

4.确认应答机制

TCP 协议通过确认应答机制来确保可靠的数据传输。这个机制包括以下几个重要的部分:
序列号和确认号: TCP 协议中的每个数据报文段都包含了一个序列号字段和一个确认号字段。发送方使用序列号来标识发送的数据,接收方使用确认号来确认已经接收到的数据。通过这两个字段的配合,TCP 可以精确地追踪传输的数据。

累积确认: 接收方通常会发送一个确认号,表示它已经成功接收到了这个确认号之前的所有数据。这个确认号是连续的,表明所有的数据都已到达。如果接收方收到了一个非连续的数据块,它会发送一个确认号,告诉发送方需要重传未收到的数据。

超时重传: 如果发送方在一定时间内没有收到接收方的确认应答,它会认为数据丢失或损坏,并触发重传机制。发送方会重新发送未被确认的数据,以确保数据的可靠性。

重复数据排除: 接收方在接收到重复的数据时会丢弃重复的部分,只接受首次接收到的数据。这是通过序列号和确认号来实现的,接收方可以识别出重复的数据。

选择性确认(SACK): TCP 协议支持选择性确认,允许接收方在确认报文中指定已经成功接收的数据块范围,而不仅仅是单一的确认号。这有助于提高网络的吞吐量和效率。

窗口控制: TCP 使用滑动窗口机制来调整发送方的发送速率。接收方会告诉发送方它的接收窗口大小,发送方会根据这个窗口大小来控制发送的数据量,以防止过多的数据拥塞网络。

流量控制: TCP 还提供了流量控制机制,允许接收方以自己的速率接收数据,以防止发送方发送速度过快导致数据丢失或溢出。流量控制通过 TCP 的滑动窗口机制实现。

总之,TCP 协议的确认应答机制是其可靠性的关键之一。通过序列号、确认号、重传、窗口控制等机制,TCP 可以确保数据的可靠传输,即使在不可靠的网络环境中也能够有效工作。这使得 TCP 成为广泛应用于可靠数据传输的协议,例如 Web 浏览、电子邮件、文件传输等。

结合图理解:
0003
TCP将每个字节的数据都进行了编号. 即为序列号:
0004
每一个ACK都带有对应的确认序列号, 意思是告诉发送者, 我已经收到了哪些数据; 下一次你从哪里开始发. ** 这就是确认应答机制 **

5.超时重传机制

0006

  • 主机A发送数据给B之后, 可能因为网络拥堵等原因, 数据无法到达主机B;

  • 如果主机A在一个特定时间间隔内没有收到B发来的确认应答, 就会进行重发;

  • 但是, 主机A未收到B发来的确认应答, 也可能是因为ACK丢失了
    0007
    因此主机B会收到很多重复数据. 那么TCP协议需要能够识别出那些包是重复的包, 并且把重复的丢弃掉.
    这时候我们可以利用前面提到的序列号, 就可以很容易做到去重的效果.
    那么, 如果超时的时间如何确定?

最理想的情况下, 找到一个最小的时间, 保证 “确认应答一定能在这个时间内返回”.
但是这个时间的长短, 随着网络环境的不同, 是有差异的.
如果超时时间设的太长, 会影响整体的重传效率;
如果超时时间设的太短, 有可能会频繁发送重复的包;

TCP为了保证无论在任何环境下都能比较高性能的通信, 因此会动态计算这个最大超时时间.

Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时
时间都是500ms的整数倍.
如果重发一次之后, 仍然得不到应答, 等待 2500ms 后再进行重传.
如果仍然得不到应答, 等待 4
500ms 进行重传. 依次类推, 以指数形式递增.
累计到一定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接

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

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

相关文章

Hum Brain Mapp:皮质脑-心轴的微状态

摘要 脑电图(EEG)微状态是具有准稳态头皮地形的大脑状态。这种状态是否会延伸到身体层面(即外周自主神经系统)目前尚不清楚。假设微状态作为一种中枢自主神经网络的功能状态会延伸到脑-心轴水平。因此,本研究结合了EEG和心跳动力学序列来估计起源于皮层的定向信息传…

第35章_瑞萨MCU零基础入门系列教程之ADXL345三轴传感器驱动实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…

虹科案例 | Zuellig Pharma和ELPRO通过符合GDP标准的温度监测和高效的温度数据管理为未来发展奠定基础

在本案例研究中,您将了解Zuellig Pharma 实施了温度监测解决方案,以一致的数据结构获取各国和各种运输方式的数据; 通过将温度数据上传到其数据库管理系统,显著提高了其效率; 并建立了为未来管理决策提供数据增值使用的基础。 项目合作伙伴 …

《AI新时代:大一新生如何快速入门IT专业?》

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: &#x1f4da…

《使用AADL的模型基工程》读书笔记(一)

1. 什么是模型基工程? 模型基工程(Model-Based Engineering,MBE)旨在建立和分析系统模型,这样就能够预测和了解该系统的能力和工作质量属性 (如性能、可靠性或信息安全性)。在系统集成和验收试验之前,很难发现一些系统级的问题&a…

【数据结构】——排序算法的相关习题

目录 一、选择题题型一 (插入排序)1、直接插入排序2、折半插入排序3、希尔排序 题型二(交换排序)1、冒泡排序2、快速排序 题型三(选择排序)1、简单选择排序~2、堆排序 ~题型四(归并排序&#xf…

测试平台项目部署二(手动部署改成Dockerfile)

测试平台项目部署二(手动部署改成Dockerfile) 一、Dockerfile制作1、entrypoint.sh制作2、构建镜像3、启动容器二、遇到的问题1、pip install --no-cache-dir -r requirements.txt安装第三方库时,报Installing build dependencies: started2、安装第三方库文件比较慢,考虑更…

可以在图片上编辑文字的软件推荐?来试试这几款

在图片上编辑文字的优势之一是可以更好地传达信息。有时候,图片本身可能不足以清楚地说明重点,但是添加文字可以强调或澄清要点。此外,对于社交媒体等视觉重要的平台,图像上的文字可以更好地吸引用户的注意力和交流。那么有哪些可…

TypeScript类型兼容:结构化类型

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 1. 鸭子类型:定义和示例 2. 鸭子类型的优点 2.1 代码的灵活性 2.2 代码的复用 2.3 与 JavaScript 的…

ACM模板二:树、图、并查集、DancingLink

目录 〇,全文说明、宏定义代码 一,二叉树 二,树状数组、线段树 三,多叉树 四,并查集、DancingLink、无向图、最小生成树 五,有向图、单源最短路径、连通分量、拓扑排序 六,网格图、回路链…

关于 Resolution(分辨率、解析力)各单位的意义及相互之间的换算

1、问题背景 最近在调试的项目,有关于对解析力的要求,用 imatest 软件测试 MTF50 的值,如下图所示,可以看到他有不同的单位表示,LW/PH、Cycles/pixel 。另外关于解析力的单位还有LP/mm、L/mm、Cycles/mm、LP/PH&#…

学生护眼灯用白炽灯还是led?专业的学生护眼灯推荐

现在的护眼灯逐渐成为了孩子们学习路上必不可少的一盏灯具,它比普通的台灯光线更加均匀舒适,而且更加护眼。因此也成为了家长们呵护孩子视力健康的一大“帮手”,不过护眼台灯的种类也有很多,最近就有家长问孩子使用的护眼灯是白炽…

用GPT干的18件事,能够真正提高学习生产力,建议收藏

用GPT干的18件事,能够真正提高学习生产力,建议收藏。 语法更正 文本翻译 语言转换 代码解释 修复代码错误 作为百科全书 信息提取 好友聊天 创意生成器 采访问题 论文大纲 故事创作 问题类比 创建 SQL 需求 情感分析 将产品描述转变为广告 关键字提取 闲…

Tailwind CSS 初学者指南

Tailwind CSS是一个实用程序优先的CSS框架,允许您快速构建现代网站,而无需离开HTML。它是 Web 开发社区中最流行和使用最广泛的 CSS 框架之一,每月下载量超过 250 万次1。在本文中,我们将探讨 Tailwind CSS 2023 的路线图&#xf…

go string类型简叙

字符串赋值后就不能修改 var str string "abcd" str[0] f //这里就有能修改str内容字符串的两种表示形式 双引号,会识别转义字符反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出输出源代…

el-table表格中加入输入框

<template><div class"box"><div class"btn"><el-button type"primary">发送评委</el-button><el-button type"primary" click"flag true" v-if"!flag">编辑</el-button…

Android EditText筛选+选择功能开发

在日常开发中经常会遇到这种需求&#xff0c;EditText既需要可以筛选&#xff0c;又可以点击选择。这里筛选功能用的是AutoCompleteTextView&#xff0c;选择功能使用的是第三方库https://github.com/kongzue/DialogX。 Android AutoCompleteTextView(自动完成文本框)的基本使用…

Mozilla 紧急修补 Firefox 和 Thunderbird 中的 WebP 严重零日漏洞

Mozilla 周二发布了安全更新&#xff0c;修复了 Firefox 和 Thunderbird 中的一个关键零日漏洞。 该漏洞被标记为 CVE-2023-4863&#xff0c;是 WebP 图像格式中的堆缓冲区溢出漏洞&#xff0c;在处理特制图像时可能导致任意代码执行。 Mozilla 在一份公告中说&#xff0c;打…

MyBatisPlus(二)基础Mapperr接口:增删改查

MyBatisPlus&#xff1a;基础Mapper接口&#xff1a;增删改查 插入一条数据 代码 Testpublic void insert() {User user new User();user.setId(6L);user.setName("张三");user.setAge(25);user.setEmail("zhangsanexample.com");userMapper.insert(use…

系统安全漏洞检测技术第三方检测机构

安全测试报告 建立一个安全的Web系统一直是很多企业的目标&#xff0c;一个比较实用的方法就是建立比较容易实现的相对安全的系统&#xff0c;同时按照一定的安全策略建立相应的安全辅助系统&#xff0c;系统安全漏洞检测就是这样一类安全辅助系统。 系统安全漏洞检测技术 1、…