(学习笔记-TCP连接建立)三次握手丢失后分别会发生什么?

news/2024/2/28 18:41:24

第一次握手丢失

当客户端想和服务端建立TCP连接后,首先第一个发的就是SYN报文,然后进入到SYN_SENT状态。

在这之后如果客户端迟迟没有收到服务端的SYN-ACK报文(第二次握手),就会触发[超时重传]机制,重传SYN报文,而且重传的SYN报文的序列号都是一样的。

不同版本的操作系统可能超时时间不同,有的1秒,有的3秒,这个超时时间是写死在内核里的,如果想要修改则需要重新编译内核,比较麻烦。

当客户端在1秒后没收到服务端的SYN-ACK报文后,客户端就会重发SYN报文,那么重发几次呢?

在Linux系统里,客户端的SYN报文最大重传次数由tcp_syn_retries内核参数控制,这个参数是可以自定义的,默认值一般是5.

# cat /proc/sys/net/ipv4/tcp_syn_retries
5

通常,第一次超时重传是在1秒后,第二次超时重传是在2秒后,第三次超时重传是在4秒后...每一次超时重传的时间都是上一次的2倍

总耗时  = 1+2+4+8+16+32 = 63秒

 

 具体过程:

  • 当客户端超时重传3次SYN报文后,由于tcp_syn_retries为3,已达到最大重传次数,于是再等待一段时间(时间为上一次超时时间的2倍),如果还是没能收到服务器的第二次握手,那么客户端就会断开连接。

第二次握手丢失

当服务端收到客户端的第一次握手后,就会回SYN-ACK报文给客户端,这个就是第二次握手,此时服务端会进入SYN_RCVD状态。

第二次握手的SYN-ACK报文有两个目的:

  • 第二次握手的ACK,是对第一次握手的确认报文
  • 第二次握手的SYN,是服务器端发起建立TCP连接的报文

如果第二次握手丢失了:

因为第二次握手报文里包含对客户端的第一次握手的ACK确认报文,所以,如果客户端迟迟没有收到第二次握手,那么客户端就觉得可能自己的SYN报文(第一次握手)丢失了,于是客户端就会触发超时重传机制,重传SYN报文。

然后,因为第二次握手中包含服务端的SYN报文,所以当客户端收到后,需要给服务端发送ACK确认报文(第三次握手),服务端才会认为该SYN报文被客户端收到了。

那么,如果第二次握手丢失了,服务端就收不到第三次握手,于是服务端这边会触发超时重传机制,重传SYN-ACK报文

在Linux下,SYN-ACK报文的最大重传次数由tcp_synack_retries内核参数决定,默认值是5

# cat /proc/sys/net/ipv4/tcp_synack_retries
5

因此,当第二次握手丢失了,客户端和服务端都会重传:

  • 客户端会重传SYN报文,也就是第一次握手,最大重传次数由tcp_syn_retries内核参数决定;
  • 服务端会重传SYN-ACK报文,也就是第二次握手,最大重传次数由tcp_syn_retries内核参数决定;

举个例子,假设tcp_syn_retries参数值为1,tcp_synack_retries参数值为2,那么当第二次握手一直丢失时,发生的过程如下图:

 具体过程:

  • 当客户端超时重传1次SYN报文后,由于tcp_syn_retries为1,已达到最大重传次数,于是再等待一段时间(时间为上次超时时间的2倍),如果还是没能收到服务端的第二次握手(SYN-ACK报文),那么客户端就会断开连接。
  • 当服务端超时重传2次SYN-ACK报文后,由于tcp_synack_retries为2,已达到最大重传次数,于是再等待一段时间(时间为上次超时时间的2倍),如果还是没能收到客户端的第三次握手(ACK报文),那么服务器就会断开连接。

第三次握手丢失

客户端收到服务端的SYN-ACK报文后,就会给服务端回一个ACK报文,也就是第三次握手,此时客户端状态进入到ESTABLISH状态。

因为这个第三次我收的ACK是对第二次握手SYN的确认报文,所以当第三次握手丢失了,如果服务端那一方迟迟收不到这个确认报文,就会触发超时重传机制,重传SYN-ACK报文。直到收到第三次握手,或者达到最大重传次数。

注意,ACK报文是不会有重传的,当ACK丢失了,就由对方重传对应的报文

具体过程:

  • 当服务端超时重传2次SYN-ACK报文后,由于tcp_synack_retries为2,由于已经达到了最大重传次数,于是再等待一段时间(时间为上一次超时时间的2倍),如果还是没能收到客户端的第三次握手(ACK报文),那么服务端就会断开连接。


http://www.ppmy.cn/news/938303.html

相关文章

计算机音乐按键在线使用说明书,电脑音乐键盘 Computer music keyboard

摘要: The utility model relates to a computer music keyboard, which is composed of a box body 11, a piano key keyboard and a switch key 9 arranged on the surface of the box body, a piano key controller 7 arranged in the box body 11 and a non-vol…

钢琴模拟软件弹奏音乐

你是不是一直困惑,没有足够的时间去花精力练习弹奏钢琴,这是现在想要学习钢琴的朋友们都有的困惑。若是能直接在里模拟钢琴弹奏乐曲的就好了。今天分享一下钢琴软件弹奏音乐。 点 击【钢琴键盘模拟器】的图标,进入可操作界面会跳转到横屏界面…

给游戏添加背景音乐并控制播放

分两部分: 1.加载音乐文件 主要学习了加载页面的代码game.loader。 var loader {loaded: true,loadedCount: 0, // Assets that have been loaded so fartotalCount: 0, // Total number of assets that need to be loadedinit: function() {// check for sound su…

EOJ Monthly 2020.3 D.钢琴演奏家

EOJ Monthly 2020.3 D.钢琴演奏家 Cuber QQ 在疫情期间已经宅在家两个月了。 实在是无所事事的他,决定重操旧业,继续实现他曾经梦寐的钢琴演奏家梦想。 掀开积满了灰尘的钢琴盖,是他许久都未触碰的琴键,按下的瞬间,…

我的世界服务器背景音乐修改,我的世界怎么添加背景音乐 修改添加bgm音乐方法...

我的世界PC端如何修改和添加BGM?我的世界本地的客户端可以进行各种不同需求的修改,但是玩家修改添加BGM并不是很多,因为一般都是制作RPG地图或者是冒险地图才会用到这样的修改。那么要怎么修改呢?下面来看看我的世界怎么添加背景音乐 修改添加bgm音乐方…

库里扛起了勇士对凯尔特人的第四场

最近临近毕业季,有朋友这样说「我一定是要支持勇士的,毕竟库里和詹姆斯陪了整个大学四年啊」。 昨晚上加班到11点半,到家洗完澡已经是凌晨1点了,那时候是想得很清楚的,明天是不想被其他事情打扰我看球赛的。 这场比赛&…

2011NBA季后赛playbyplay数据库

源数据来自BasketballValue.com,All 2010-2011 playoffs data。 数据库设计 create table 2010NBAplayoffs (gameID char(14),period int,time varchar(5),homescore int,awayscore int,teamPoss char(3),athome int,playType varchar(12),playDetail varchar(40),…

midi音乐历史

这节课,我们要开始讲MIDI技术了。但是看到这个标题可能读者会大吃一惊!学MIDI,不是在学最先进的高端技术么?你怎么说…… 哈哈!你错了。我告诉你,MIDI是老掉牙的技术了。可能你要问,有多老&…

伟大的钢琴玩家的西部乡村音乐

伟大的钢琴玩家的西部乡村音乐   这可能是很难想象的,但钢琴并不总是接受入乡村和西部音乐。有许多钢琴家谁坚持下来了,并带来了一个全新的层面的音乐。这些音乐家们带来了其他的演奏风格成为一个非常严格的音乐风格,使其扩展到今天它是力量…

python怎么后撤步_nba2kol后撤步跳投 后撤步跳投按键技巧

关键词:后撤步跳投,nba2kol后撤步,后撤步跳投按键 导读:后撤步跳投是NBA2KOL玩家们非常喜爱的一种进攻手段,那么如何才能施放出nba2kol后撤步跳投呢,因为不是每个玩家都知道如何正确的按出nba2kol后撤步跳投…

B2. Palindrome Game (hard version)

原题链接:Problem - B2 - Codeforces 题意:对一个01回文串,每次有两个操作 (1)将一个0变为1,消耗1美元; (2)将字符串翻转,不消耗金钱,但只有在非回文情况下才可做该操作,且上家做完该…

22.3 MIDI 和音乐

摘录于《Windows程序(第5版,珍藏版).CHarles.Petzold 著》P1035 乐器数字接口(Musical Instrument Digital Interface, MIDI) 是在 20 世纪 80 年代初期由电子音乐合成器制造商的一个合作组织开发的。MIDI 是各种电子乐器之间及其和计算机之间…

开发运维一体化平台 应用研发全生命周期管理

在国家大力发展信创建设及云计算、大数据、5G等新技术加速创新,日益融入经济社会发展的方方面面的背景下,数字经济正成为新的经济增长点和改造提升传统产业的支撑点。2022年,中国数字经济规模超过50万亿,占GDP比重超过40%&#xf…

【网络可用性】

网络可用性 Availability defined in a service-level agreement (SLA) between a network operator (carrier) and a customer. 关于SLA,可参考 思科Service Level Management: Best Practices White Paper 可用性对应的停机时间 转载于 https://blog.csdn.net/a…

ffmpeg OverLay

FFMPEG的overlay代码分析。\ 源博客: http://blog.csdn.net/win_lin/article/details/14109209 <a target_blank id"L1" href"http://blog.csdn.net/win_lin/article/details/14109209#L1" rel"#L1" style"color: rgb(102, 102, 102); t…

ubuntu16.04下 pcie接口4G模块驱动适配

4G PCIE适配 0.准备工作1.安装驱动2.Linux系统下测试AT指令或设置模块相关参数3.联网测试GOBINET4.联网测试QMI_WWAN 0.准备工作 1&#xff0c;联系供应商获取如下图安装包或更高版本包。 第一个是Linux USB驱动,QMI也是驱动&#xff0c;二选一安装就行&#xff1b; 第二个拨…

记一次ruoyi中使用Quartz实现定时任务

一、首先了解一下Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目&#xff0c;它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个&#xff0c;百个&#xff0c;甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标…

基于VUE的音乐qq网站设计与实现(Java+spring boot+MySQL+VUE)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于VUE的音乐qq网站设计与实现&#xff08;Javaspring bootMySQLVUE&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java springboot框架 my…

win10的剪贴板在哪里?

剪贴板(ClipBoard)是内存中的一块区域,是Windows内置的一个非常有用的工具, 使得在各种应用程序之间,传递和共享信息成为可能。然而美中不足的是, 剪贴板只能保留一份数据,每当新的数据传入,旧的便会被覆盖。一般情况下&#xff0c;剪贴板是隐藏着的&#xff0c;因为我们目的不…
最新文章