TCP建立连接时,为什么每次的SYN都不一样

  • 为什么 TCP 每次建立连接时,初始化序列号都要不一样呢?

    • 主要原因是为了防止历史报文被下一个相同四元组的连接接收。

  • TCP 四次挥手中的 TIME_WAIT 状态不是会持续 2 MSL 时长,历史报文不是早就在网络中消失了吗?

    • 是的,如果能正常四次挥手,由于 TIME_WAIT 状态会持续 2 MSL 时长,历史报文会在下一个连接之前就会自然消失。

    • 但是来了,我们并不能保证每次连接都能通过四次挥手来正常关闭连接。

    • 过程如下:

      • 客户端和服务端建立一个 TCP 连接,在客户端发送数据包被网络阻塞了,然后超时重传了这个数据包,而此时服务端设备断电重启了,之前与客户端建立的连接就消失了,于是在收到客户端的数据包的时候就会发送 RST 报文。

      • 紧接着,客户端又与服务端建立了与上一个连接相同四元组的连接;

      • 在新连接建立完成后,上一个连接中被网络阻塞的数据包正好抵达了服务端,刚好该数据包的序列号正好是在服务端的接收窗口内,所以该数据包会被服务端正常接收,就会造成数据错乱。

    • 如果每次建立连接,客户端和服务端的初始化序列号都是一样的话,很容易出现历史报文被下一个相同四元组的连接接收的问题。

  • 客户端和服务端的初始化序列号不一样不是也会发生这样的事情吗?

    • 是的,即使客户端和服务端的初始化序列号不一样,也会存在收到历史报文的可能。

    • 历史报文能否被对方接收,还要看该历史报文的序列号是否正好在对方接收窗口内,如果不在就会丢弃,如果在才会接收。

    • 如果每次建立连接客户端和服务端的初始化序列号都「不一样」,就有大概率因为历史报文的序列号「不在」对方接收窗口,从而很大程度上避免了历史报文

    • 每次初始化序列号不一样能够很大程度上避免历史报文被下一个相同四元组的连接接收,注意是很大程度上,并不是完全避免了。

  • 那客户端和服务端的初始化序列号都是随机的,那还是有可能随机成一样的呀?

    • RFC793 提到初始化序列号 ISN 随机生成算法:ISN = M + F(localhost, localport, remotehost, remoteport)。

      • M是一个计时器,这个计时器每隔 4 微秒加1。

      • F 是一个 Hash 算法,根据源IP、目的IP、源端口、目的端口生成一个随机数值,要保证 hash 算法不能被外部轻易推算得出。

    • 随机数是会基于时钟计时器递增的,基本不可能会随机成一样的初始化序列号。

  • 客户端和服务端初始化序列号都是随机生成的话,就能避免连接接收历史报文了。

    • 是的,但是也不是完全避免了。

    • 序列号(SEQ)和初始序列号(ISN)。

      • 序列号,是 TCP 一个头部字段,标识了 TCP 发送端到 TCP 接收端的数据流的一个字节,因为 TCP 是面向字节流的可靠协议,为了保证消息的顺序性和可靠性,TCP 为每个传输方向上的每个字节都赋予了一个编号,以便于传输成功后确认、丢失后重传以及在接收端保证不会乱序。序列号是一个 32 位的无符号数,因此在到达 4G 之后再循环回到 0。

      • 初始序列号,在 TCP 建立连接的时候,客户端和服务端都会各自生成一个初始序列号,它是基于时钟生成的一个随机数,来保证每个连接都拥有不同的初始序列号。初始化序列号可被视为一个 32 位的计数器,该计数器的数值每 4 微秒加 1,循环一次需要 4.55 小时。

    • 序列号和初始化序列号并不是无限递增的,会发生回绕为初始值的情况,这意味着无法根据序列号来判断新老数据。

    • 为了解决回绕问题,就需要有 TCP 时间戳。tcp_timestamps 参数是默认开启的,开启了 tcp_timestamps 参数,TCP 头部就会使用时间戳选项,它有两个好处,一个是便于精确计算 RTT ,另一个是能防止序列号回绕(PAWS)。

    • 如果发现收到的数据包中时间戳不是递增的,则表示该数据包是过期的,就会直接丢弃这个数据包。

  • 客户端和服务端的初始化序列号都是随机生成,能很大程度上避免历史报文被下一个相同四元组的连接接收,然后又引入时间戳的机制,从而完全避免了历史报文被接收的问题。

  • 如果时间戳也回绕了怎么办?

    • 时间戳的大小是 32 bit,所以理论上也是有回绕的可能性的。

    • 时间戳回绕的速度只与对端主机时钟频率有关。

    • Linux 以本地时钟计数(jiffies)作为时间戳的值,不同的增长时间会有不同的问题

    • 要解决时间戳回绕的问题,可以考虑以下解决方案:

      • 增加时间戳的大小,由32 bit扩大到64bit

        • 导致新旧协议兼容性问题,像现在的IPv4与IPv6一样

      • 将一个与时钟频率无关的值作为时间戳,时钟频率可以增加但时间戳的增速不变

        • 随着时钟频率的提高,TCP在相同时间内能够收发的包也会越来越多。如果时间戳的增速不变,则会有越来越多的报文使用相同的时间戳。这种趋势到达一定程度则时间戳就会失去意义

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

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

相关文章

【MySQL】13. 索引(重点)

1. 没有索引,可能会有什么问题 索引:提高数据库的性能,索引是物美价廉的东西了。 不用加内存,不用改程序,不用调sql,只要执行正确的 create index ,查询速度就可能提高成百上千倍。 但是天下没…

SD卡备份和烧录ubuntu20.04镜像

设备及系统:nuc幻影峡谷工控机,ubuntu20.04,树莓派4B,SD卡读卡器 一、确定SD卡设备号的两种方法 方法1: 将有ubuntu镜像的SD卡插入读卡器,再将读卡器插入电脑主机,在 工具 中打开 磁盘&#…

k8s入门到实战(十二)—— pod的深入理解

pod 深入理解 pod 容器生命周期 pod 的几种状态 可以使用命令kubectl get pod -w实时监控查看 pod 的状态 running:正常运行状态Pending:资源分配不对的时候会挂起,出现此状态Terminating:某个节点突然关机,上面的 p…

[DS]Polar靶场web(一)

静以养心,宽以养气。 跟着Dream ZHO大神学专升安的一天 swp 直接dirb扫出.index.php.swp的目录 function jiuzhe($xdmtql){return preg_match(/sys.*nb/is,$xdmtql);//如果包含以 "sys" 开始,后跟任意字符直到 "nb" 的字符串&…

JavaScript中的继承方式详解

Question JavaScript实现继承的方式? 包含原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承和ES6 类继承 JavaScript实现继承的方式 在JavaScript中,实现继承的方式多种多样,每种方式都有其优势和适用场景。以下…

macOS Sonoma 14.4.1 (23E224) 正式版 Boot ISO 原版可引导镜像下载

macOS Sonoma 14.4.1 (23E224) 正式版 Boot ISO 原版可引导镜像下载 2024 年 3 月 26 日凌晨,macOS Sonoma 14.4.1 更新修复了一个可能导致连接到外部显示器的 USB 集线器无法被识别的问题。它还解决了可能导致 Java 应用程序意外退出的问题,并修复了可…

Spring 事务传播行为

实现原理 : Aop (TransactionInterceptor) 实现 使用spring声明式事务注意事项 同一个bean中的方法调用必须重新声明一个bean调用、否则后续方法调用的事务默认使用第一个第二个不生效 package com.cloud.person.service.impl;import com.cloud.person.dao.S1Mapper; import…

STM32常用的开发工具有哪些

大家好,今天给大家介绍STM32常用的开发工具有哪些,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 STM32常用的开发工具主要包括以下几类: 集成开发环境&…

vue.js 开发如何应用“软件工程“的原则?

在使用Vue.js进行开发时,将软件工程的原则和最佳实践应用到项目中,可以帮助提高项目的质量、维护性和团队的协作效率。以下是一些具体的建议: 1. 项目结构和模块化 合理组织项目结构:按功能或特性将代码组织成模块,使…

java数据结构与算法刷题-----LeetCode744. 寻找比目标字母大的最小字母

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 二分查找 二分查找 解题思路:时间复杂度O( l o g 2 …

说说webpack proxy工作原理?为什么能解决跨域?

文章目录 一、是什么二、工作原理三、跨域参考文献 一、是什么 webpack proxy,即webpack提供的代理服务 基本行为就是接收客户端发送的请求后转发给其他服务器 其目的是为了便于开发者在开发模式下解决跨域问题(浏览器安全策略限制) 想要…

电路仿真软件大比拼:哪款更适合你?

以下是关于市面上常见的四款电路仿真软件的整体介绍: 1. Multisim(美国,美国国家仪器(NI)有限公司) 特点与优势: 直观的图形界面:提供用户友好的界面,便于快速搭建和修…

机器学习的分类——无监督学习(Unsupervised Learning)

无监督学习(Unsupervised Learning)是机器学习中的一种重要分类,它与监督学习的主要区别在于训练数据没有标签。无监督学习的目的是探索数据本身的结构和模式,而不是预测或分类具体的输出。这种学习方式对于发现数据中的隐藏模式和…

Openstack创建和操作实例,实现与外部网络通信

一、熟悉OpenStack图形界面操作 1、了解Horizon项目 Horizon项目 各OpenStack服务的图形界面都是由Horizon提供的。Horizon提供基于Web的模块化用户界面。Horizon为云管理员提供一个整体的视图。Horizon为终端用户提供一个自主服务的门户。Horizon由云管理员进行管理与控制&a…

SQL函数操作——3、数据统计综合应用

任务描述 本关任务: 灵活使用分组操作和聚集函数解决比较复杂的数据统计问题 本关使用的关系说明: product(maker,model,type) maker:表示生产厂商 model:生产的产品型号 type:产品类型,有pc laptop两种 pc(model…

面试题解析:bind,call,apply的区别(2)

在面试的过程中,面试官很有可能会问到我们有关this的相关内容。那么关于this我们都知道在 JavaScript 中,this 是一个特殊关键字,它指向当前函数执行时的上下文对象。 this 的值取决于函数被调用的方式: 全局上下文中的 this: 当…

语音陪玩交友软件系统程序-app小程序H5三端源码交付,支持二开!

电竞行业的发展带动其周边产业的发展,绘制着游戏人物图画的抱枕、鼠标垫、海报销量极大,电竞游戏直播、游戏教程短视频也备受人们喜爱,自然,像游戏陪练、代练行业也随之生长起来,本文就来讲讲,从软件开发角…

【字节二面】SpringBoot可以同时处理多少请求

目录 一、示例代码二、那么springboot可以处理多少请求?三、maxConnections、maxThreads、acceptCount的关系 一、示例代码 RestController Slf4j public class RequestController {GetMapping("/test")public String test(HttpServletRequest request) …

mysql_数据_增删改查

DML(数据操作语言) 添加数据 指定字段:INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...); 全部字段:INSERT INTO 表名 VALUES (值1, 值2, ...); 批量添加数据:INSERT INTO 表名 (字段名1, 字段名2…

vscode ai插件“通义灵码”

文章目录 vscode ai插件“通义灵码”为什么安装?官网主要功能 vscode ai插件“通义灵码” 为什么安装? 通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成…