3000字讲讲TCP协议,握手挥手不是你想的那么简单

深入理解MySql.pdf 非常经典的mysql书籍,进一步了解mysql非常有帮助,不可多得的好书 立即下载

TCP 报文段结构

一谈到 TCP 协议,大家最先想到的词就是「面向连接」和「可靠」。没错,TCP 协议的设计就是为了能够在客户端和服务器之间建立起一个可靠连接。

在讲连接过程之前,我们先来看看 TCP 的报文段结构,通过这个结构,我们可以知道 TCP 能够提供什么信息:

这里有几点是需要注意的:

  • TCP 协议需要一个四元组(源IP,源端口,目的IP,目的端口)来确定连接,这要和 UDP 协议区分开。多说一句,IP 地址位于 IP 报文段,TCP 报文段是不含 IP 地址信息的。
  • 基本 TCP 头部的长度是 20 字节,但是由于「选项」的长度是不确定的,所以需要「首部长度」字段明确给出头部长度。这里要注意的是,首部长度字段的单位是 32bit,也就是 4 字节,所以该字段的最小值是 5。
  • 标橙色的字段(确认序号,接收窗口大小,ECE,ACK)用于「回复」对方,举个例子,服务器收到对方的数据包后,不单独发一个数据包来回应,而是稍微等一下,把确认信息附在下一个发往客户端的数据帧上,也就是捎带技术。
  • 窗口大小是一个 16 位无符号数,也就是说窗口被限制在了 65535 字节,也就限制了 TCP 的吞吐量性能,这对一些高速以及高延迟的网络不太友好(可以想想为什么)。所幸 TCP 额外提供了窗口缩放(Window Scale)选项,允许对这个值进行缩放。

下面是 8 个标志位的含义,有的协议比较旧,可能没有前两个标志位:

标志位虽然很多,但是如果放到具体场景里来看的话,就很容易理解他们的作用了。

三次握手

三次握手就是为了在客户端和服务器间建立连接,这个过程并不复杂,但里面有很多细节需要注意。

这张图就是握手的过程,可以看到客户端与服务器之间一共传递了三次消息,这三次握手其实就是两台机器之间互相确认状态,我们来一点一点看。

第一次握手

首先是客户端发起连接,第一个数据包将 SYN 置位(也就是 SYN = 1),表明这个数据包是 SYN 报文段(也被称为段 1)。这一次发送的目的是告诉服务器,自己的初始序列号是 client_isn ,还有一个隐含的信息在图里没有表现出来,那就是告知服务端自己想连接的端口号。除了这些,客户端还会发送一些选项,不过这跟三次握手没多大关系,暂且按下不表。

段 1 里最需要注意的就是这个client_isn ,也就是初始序列号。「RFC0793^1」指出:

When new connections are created, an initial sequence number (ISN) generator is employed which selects a new 32 bit ISN. The generator is bound to a (possibly fictitious) 32 bit clock whose low order bit is incremented roughly every 4 microseconds. Thus, the ISN cycles approximately every 4.55 hours.

翻译过来就是,初始序列号是一个 32 位的(虚拟)计数器,而且这个计数器每 4 微秒加 1,也就是说,ISN 的值每 4.55 小时循环一次。这个举措是为了防止序列号重叠。

但即使这样还是会有安全隐患——因为初始 ISN 仍然是可预测的,恶意程序可能会分析 ISN ,然后根据先前使用的 ISN 预测后续 TCP 连接的 ISN,然后进行攻击,一个著名的例子就是「The Mitnick attack^2」 。这里摘一段原文:

Mitnick sent SYN request to X-Terminal and received SYN/ACK response. Then he sent RESET response to keep the X-Terminal from being filled up. He repeated this for twenty times. He found there is a pattern between two successive TCP sequence numbers. It turned out that the numbers were not random at all. The latter number was greater than the previous one by 128000.

所以为了让初始序列号更难预测,现代系统常常使用半随机的方法选择初始序列号,详细的方法就不在这里展开了。

第二次握手

当服务器接收到客户端的连接请求后,就会向客户端发送 ACK 表示自己收到了连接请求,而且,服务器还得把自己的初始序列号告诉客户端,这其实是两个步骤,但是发送一个数据包就可以完成,用的就是前面说的捎带技术。图里的 ACK = client_isn + 1 是指确认号字段的值,要注意和 ACK 标志位区分开。

ACK 字段其实也有不少需要注意的点,不过这个跟滑动窗口一块讲比较直观,这里就先不提了。

这里重点强调一下,当一个 SYN 报文段到达的时候,服务器会检查处于 SYN_RCVD 状态的连接数目是否超过了 tcp_max_syn_backlog 这个参数,如果超过了,服务器就会拒绝连接。当然,这个也会被黑客所利用,「SYN Flood」就是个很好的例子。因为服务器在回复 SYN-ACK 后,会等待客户端的 ACK ,如果一定时间内没有收到,认为是丢包了,就重发 SYN-ACK,重复几次后才会断开这个连接,linux 可能要一分钟才会断开,所以攻击者如果制造一大批 SYN 请求而不回复,服务器的 SYN 队列很快就被耗尽,这一段时间里,正常的连接也会得不到响应。

服务器的这种状态称为静默(muted)。为了抵御 SYN Flood 攻击,服务器可以采用「SYN cookies」,这种思想是,当 SYN 到达时,并不直接为其分配内存,而是把这条连接的信息编码并保存在 SYN-ACK 报文段的序列号字段,如果客户端回复了,服务器再从 ACK 字段里解算出 SYN 报文的重要信息(有点黑魔法的感觉了),验证成功后才为该连接分配内存。这样,服务器不会响应攻击者的请求,正常连接则不会受到影响。

但 SYN cookies 本身有一些限制,并不适合作为默认选项,有兴趣可以自行 Google。

第三次握手

这是建立 TCP 连接的最后一步,经过前两次握手,客户端(服务器)已经知道对方的滑动窗口大小,初始序列号等信息了,这不就完了吗?为什么还要第三次握手?

这是因为服务器虽然把数据包发出去了,但他还不知道客户端是否收到了这个包,所以服务器需要等待客户端返回一个 ACK,表明客户端收到了数据,至此,连接完成。

连接建立后,进入传输数据的阶段,这里就涉及到很多很多技术,我会另写文章。

四次挥手

有了三次握手的基础,四次挥手就比较容易理解了:

四次挥手的过程其实很简单,就是服务器和客户端互相发送 FIN 和 ACK 报文段,告知对方要断开连接。

四次挥手里值得关注的一点就是 TIME_WAIT 状态,也就是说主动关闭连接的一方,即使收到了对方的 FIN 报文,也还要等待 2MSL 的时间才会彻底关闭这条连接。(这里面的 MSL 指的是最大段生成期,指的是报文段在网络中被允许存在的最长时间。)可为什么不直接关闭连接呢?

一个原因是,第四次挥手的 ACK 报文段不一定到达了服务器,为了不让服务器一直处于 LAST_ACK 状态(服务器会重发 FIN,直到收到 ACK),客户端还得等一会儿,看看是否需要重发。假如真的丢包了,服务器发送 FIN ,这个 FIN 报文到达客户端时不会超过 2MSL(一来一回最多 2MSL),这时候客户端这边的 TCP 还没关掉,还能重发 ACK。

另一个原因是,经过 2MSL 之后,网络中与该连接相关的包都已经消失了,不会干扰新连接。我们来看一个例子:假如客户端向服务器建立了新的连接,旧连接中某些延迟的数据坚持到了新连接建立完毕,而且序列号刚好还在滑动窗口内,服务器就误把它当成新连接的数据包接收,如下图所示:

2MSL 机制就避免了这种情况。

关于 TIME_WAIT 还有很多有意思的地方,我觉得可以单独再写一篇文章了,这里就不再多说。

感觉写的有点点乱,因为 TCP 的知识确实是有点多,没能组织好,希望各位读者不要介意。

深入理解MYSQL完整版.rar 《深入理解MySQL》深入源代码,剖析了MySQL数据库系统的架构,并提供了分析、集成和修改MySQL源代码的专家级建议。《深入理解MySQL》分三个部分:部分介绍开发和修改开源系统的概念,提供探讨更数据库概念所需的工具和资源;第二部分讨论MySQL系统,阐明如何修改MySQL源码,如何将MySQL系统作为嵌入式数据库系统;第三部分更深入地探讨了MySQL系统,讲述数据库工作的内部机理。   《深入理解MySQL》面向MySQL数据库开发人员。 立即下载

相关推荐

大学生Java课程设计——挖地雷游戏设计报告源文件

在现代,高科技的飞跃发展,人们工作习惯的改变,特别是电脑的大量普及,人们生活节奏越来越快,--些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而扫雷游戏是人们最熟悉的小游戏之一-。 扫雷游戏起源于1973年的方块游戏。 1992年微软发布的Windows 3.1中加入该游戏,从此风靡全世界。 玩扫雷游戏,可以锻炼观察和推理能力,培养细心和耐心。 游戏目标是找出所有雷,触雷则输,点击表情重新开始。 由于上手简单、老少皆宜,从而家喻户晓,风靡世界。为此,我设计了一款简单的扫雷JAVA游戏程序,以便更好的满足广大电脑工作者闲暇之余的消遣,并且也让我更好地学习编程技术。在现代,高科技的飞跃发展,人们工作习惯的改变,特别是电脑的大量普及,人们生活节奏越来越快,--些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而扫雷游戏是人们最熟悉的小游戏之一-。 扫雷游戏起源于1973年的方块游戏。 1992年微软发布的Windows 3.1中加入该游戏,从此风靡全世界。 玩扫雷游戏,可以锻炼观察和推理能力,培养细 关键词:扫雷、JAVA游戏、编程  

TCP 的三次握手,四次挥手和重要的细节—干货满满,建议细读

上一次讲了 UDP 协议,从这次开始,就要讲 TCP 协议了,因为 TCP 协议涉及到的东西很多,一篇文章概括不完,所以我把 TCP 协议的内容分成好几个部分,逐个击破。 TCP 报文段结构 一谈到 TCP 协议,大家最先想到的词就是「面向连接」和「可靠」。没错,TCP 协议的设计就是为了能够在客户端和服务器之间建立起一个可靠连接。 在讲连接过程之前,我们先来看看 TCP 的报文段结构,通过这个结...

tobe98的博客 4332

MySQL主从复制的原理及配置方法(比较详细)

一、复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。 将主服务器的数据拷贝到从服务器的一个途径是使用LOAD DATA FROM MASTER语句。请注意LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的主服务器上工作。并且,该语句将获得全局读锁定。 MySQL 使用3个线程来执行复制功能,其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务

高性能Mysql主从架构的复制原理及配置详解(转)

1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接...

dw147258dw的专栏 461

《深入理解MySQL主从原理32讲》推荐篇

导读: 作者:高鹏(网名八怪),《深入理解MySQL主从原理32讲》系列文的作者。2008年开始至今一直从事Oracle/MySQL相关工作,现任易极付高级DBA,Oracle Ocm。有丰富的数据库性能调优,故障诊断经验,并且对MySQL源码有一定的研究。 《深入理解MySQL主从原理32讲》专栏包含GTID部分、Event部分、主库部分、从库部分四大块来详细讲解主从原理。希望能帮助读者朋友们解决关于主从同步中的一些疑问。八怪写作风格很是严谨,几乎每篇都是从源码入手去剖析MySQL主从复制相关的知识点。 强烈推荐大家订阅本专栏 业界大咖推荐序 从2016年开始八怪(本名高鹏)经常向我请教一

永磁同步电机高效标定技术:从理论到实践的全面解析

本文全面解析永磁同步电机高效标定技术,从MTPA标定、弱磁区优化到初始角校准,详细介绍了理论原理和实战技巧。针对新能源汽车应用场景,提供标定系统集成要点和AI辅助优化方案,帮助工程师提升电机性能标定效率与精度。

weixin_28452161的博客 505

tcp序列号为什么是随机的_3000字讲讲TCP协议,握手挥手不是你想的那么简单

专注于Java领域优质技术,欢迎关注作者: tobe 来自:tobe的呓语上一次讲了 UDP 协议,从这次开始,就要讲 TCP 协议了,因为 TCP 协议涉及到的东西很多,一篇文章概括不完,所以我把 TCP 协议的内容分成好几个部分,逐个击破。TCP 报文段结构一谈到 TCP 协议,大家最先想到的词就是「面向连接」和「可靠」。没错,TCP 协议的设计就是为了能够在客户端和服务器之间建立起一个可靠连...

weixin_39622123的博客 185

OPNET卫星节点仿真避坑指南:为什么你的STK轨道文件导入后位置不对?

本文深入解析OPNET卫星节点仿真中STK轨道文件导入后位置异常的常见问题,揭示坐标系差异(ECI与ECF)、时间基准不匹配等关键因素。通过修改.SA文件头标识、统一时间基准等解决方案,帮助工程师避免仿真失真,提升卫星通信系统仿真的准确性。特别适用于STK与OPNET协同工作的卫星网络仿真场景。

weixin_30335575的博客 602

TCP的“可靠性”(上)

整个网络中,就可能存在,某个路由器/交换机,某个时刻,突然负载量很高,短时间内可能有大量的数据包要几个这个设备转发。这个时候,如果瞬间的高负载超出了这个设备能转发的数据量的极限,多出来的部分,就无了,就被设备丢包了。上述谈到的,ack,重传,保证顺序,自动去重,都是 TCP 内置的。这个说法是很不准确的,因为三次握手四次挥手只有初次建立连接的时候才会,但是可靠性是整个过程都可靠,那靠的什么呢?此处可靠性,只能“退而求其次”,只要尽可能的去进行发送了,发送方能够指定对方是否收到,就认为是可靠传输了。

t1750982356的博客 1995

四旋翼无人机数学模型推导

本周开始进行四旋翼无人机的学习工作,首先来进行四旋翼无人机的数学模型推导工作。。 四旋翼动力学数学模型 坐标变换 介绍四旋翼数学模型之前,首先引入坐标变换的概念,定义两个坐标系惯性坐标系{E},以及机体坐标系{B},惯性坐标系就相当于在地面建立的、静止不动的坐标系,也是我们操纵无人机所在的空间,而机体坐标系是建立于四旋翼机体之上,随着四旋翼姿态变换而变化,所以建立一种地面上的惯性坐标系与四旋翼机体坐标系之间的转换关系,就有这个必要。 对于惯性坐标系{E},以及机体坐标系{B},它们之间的转换关系

BiuBiuSun的博客 1万+

第二次 PX4仿真环境搭建过程全记录

参考链接 https://blog.youkuaiyun.com/yanwumuxi/article/details/80097294 https://www.ncnynl.com/archives/201709/2013.html 一、安装依赖项 我们使用Debian / Ubuntu LTS 作为Linux的标准支持版本,但是也支持Cent OS 和 Arch Linux的发行版本。 权限设置 警告:永远...

移步换景的博客 2263

用UDP就一定比TCP快吗?

从一次"改成UDP后反而更慢了"的性能优化翻车出发,深度剖析UDP和TCP的性能差异。通过丢包重传、拥塞控制、以及应用层实现可靠性的代价分析,揭秘为什么UDP不一定比TCP快、什么场景UDP确实快、以及QUIC协议如何兼顾UDP的速度和TCP的可靠性。配合抓包图展示协议开销,给出视频直播、游戏、文件传输等场景的协议选型建议。

比较是偷走幸福的小偷 4448

基于51单片机的智能花盆灌溉系统设计与实现

本文详细介绍了基于51单片机的智能花盆灌溉系统设计与实现,通过DS18B20温度传感器、土壤湿度传感器和LCD1602显示屏等硬件模块,结合精确的算法控制,实现自动监测与灌溉。系统解决了传统灌溉依赖定时器、缺乏可视化界面的问题,适合上班族、园艺爱好者和植物园工作人员使用,有效提升植物养护效率。

honey的博客 1016

通用后端面试题收集(持续中)

B+树索引就是mysql结合B树和索引顺序升级开发的一种平衡搜索树。实际底层实现跟B树没有关系。特点是非叶子节点只存储索引,而叶子结点存储实际的数据。所有叶子结点都是由一个双向链表管理和连接的,数据都是排好序的。因为这些特点,索引B+树适合进行范围查询。答:回表就是使用非聚簇索引搜索时,索引字段不包含搜索所需的字段,那么就要通过主键去查找完整数据的过程。往往会带来随机I/O操作,使得查询慢。

weixin_40453090的博客 413

【Cadence】Virtuoso@LayoutXL 差分电路版图同步修改

对于差分电路,器件和部分走线通常是对称的,只需要画一半,另一半通过镜像操作完成。因此,需要对差分电路进行同步的修改,保证电路的差分对称性和正确的连接关系。然而,通常版图会经过多次修改,修改的部分可能在镜像的时候被遗漏。左边画了金属块,右边也出现了同步出现了金属块。进入group会有同步复制的提示。

乾巽的博客 3052

深入浅出DDR系列(二)--DDR工作原理

学习完了DDR的基本组成和硬件结构原理之后,从整体上了解了DDR的特性和静态图,包括原理、管脚图等。那么本章就要从动态的角度来分析时序结构,包括read/write的整个过程到数据返回发生了什么,其中包括以下内容 DDR是如何完成Read、Write 等的操作 DDR的基本命令 DDR的时序参数 DDR的性能分析 1. DRAM基本组成 对于DRAM,其主要由行和列组成,每一个bit中都是由类似右下图的类晶体管的结构组成,对于sdram的数据,可以通过控制column和row就可以访问sd

奇小葩 3万+

四次面试:程序员越来越悲催了

作者 | 刘欣 责编 | 伍杏玲 本文经授权转载自码农翻身(ID:coderising) 静态网页时代 张大胖V1.0 毕业了, 去一家公司面试。 “会做网站吗?” “会,我会用Dreamweaver/FrontPage写HTML页面,不仅是文字,我还能在里边添加图片,JPEG、GIF的都行,比纯文字的漂亮多了。奥,不懂这些高深的技术名词啊, 没事,只要你给我提...

程序人生的博客 948

MATLAB基础应用精讲-【数模应用】游程检验(附MATLAB、R语言和python代码实现)

游程检验是一种非参数性统计假设的检验方法,它是游程总数检验和最大游程检验的总称,用于两个独立样本的比较和观测结果随机性的检验测试。​游程检验亦称“连贯检验”,是根据样本标志表现排列所形成的游程的多少进行判断的检验方法。[2]例1:设某样本n=12人的标志表现为男、女,有以下三种排列。(i) 男\男,女\女\女,男,女\女,男\男\男\男;(ii) 男\男\男\男\男\男\男,女\女\女\女\女;(iii) 男,女,男,女,男,女,男,女,男,女,男\男;连续出现男或女的区段称为游程。

qq_36130719的博客 609

五次面试,程序员的悲催轮回

前言:本文是《四次面试,程序员越来越悲催了》的修改版,第五次面试,会是怎么样呢?01静态网页时代张大胖V1.0 毕业了, 去一家公司面试。“会做网站吗?”“会,我会用Dreamweave...

码农翻身 2795

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

四次面试:程序员越来越悲催了?

作者 | 刘欣 责编 | 伍杏玲 本文经授权转载自码农翻身(ID:coderising) 静态网页时代 张大胖V1.0 毕业了, 去一家公司面试。 “会做网站吗?” “会,我会用Dreamweaver/FrontPage写HTML页面,不仅是文字,我还能在里边添加图片,JPEG、GIF的都行,比纯文字的漂亮多了。奥,不懂这些高深的技术名词啊, 没事,只要你给我提...

优快云资讯 3044

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

双非渣本小Android四年磨一剑,秋招大厂(字节、腾讯、B站)面经分享

我的面试经验分享可能不会去罗列太多的具体题目,因为我依然认为面试经验中最宝贵的不是那一个个具体的题目或者具体的答案,而是结束面试时,那一刻你的感受以及多天之后你的回味~很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含。

2401_83977689的博客 820

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

面试不只看八股文:追问与场景化设计,真正考察候选人工程能力

在技术招聘中,HashMap、线程池、Redis、MySQL等经典知识点常被当作面试题,但标准答案往往只能测出记忆,测不出真实工程能力。理解知识背后的原理,比如HashMap的树化阈值为何是8、Redis缓存穿透如何治理、分布式锁在订单系统里怎么选型,才是区分“背过”与“真懂”的分水岭。通过三层递进追问——从知识层到理解层再到应用层,配合场景化问题设计和业务约束的加入,面试官能把一道固有八股题改造成能力探测工具,候选人也能在方案对比与取舍中展现真实的问题解决能力。这套方法论不仅适用于面试,也适用于日常技术沉

weixin_30386713的博客 420
上一篇: 4000 字详解TCP超时与重传,看完没收获算我输
下一篇: 比Redis还快5倍的中间件,为啥这么快?
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值