从序号和确认号理解TCP三次握手
头部信息
TCP首部存储的数据和建立连接有关,具体每个字段的用途可以参考这一篇文章,其中序号和确认号决定了发送数据的内容。
- 头部中间部分"保留"和"窗口"中间是标志位,会携带一些连接的信息
- 序号(Sequence Number):当前TCP数据部分的第一个字节编号(实际是一个非常大的值,非常大的值 - 固定值 = 小的编号,同一请求有一个固定值,固定值来源于建立连接时seq=0时)
- 确认号(Acknowledgment Number):ACK=1时才有效,期望对方下一次传过来的TCP数据部分的第一个字节编号

三次握手
建立连接的时候会有三步,也就是我们所说的三次握手。
- SYN=1,ACK=0,序号 seq=x(连接之初的客户端固定值,简单来说就是0),没有发任何字节,所以数据长度为0,此时是客户端向服务器发送的建立连接请求。
- SYN=1,ACK=1,序号 seq=y(连接之初的服务器固定值,简单来说就是0),确认号 ack = x+1,数据长度为0,此时是服务器向客户端发送响应,表示希望收到客户端发送第1个字节的数据。
- SYN=0,ACK=1,序号 seq=x+1,确认号 ack=y+1,数据部分长度为0,此时客户端确认收到服务器的确认消息,建立连接完成。表示希望收到服务器第一个字节的数据。

连接时,存在一些状态的变化
- CLOSED:client处于关闭状态
- LISTEN:server处于监听状态,等待client连接
- SYN-RCVD:表示server接受到了SYN报文,当收到client的ACK报文后,它会进入到ESTABLISHED状态
- SYN-SENT:表示client已发送SYN报文,等待server的第2次握手
- ESTABLISHED:表示连接已经建立
抓包数据来看如下所示

疑问
那么可能有人会问,为什么需要三次握手,两次不就可以互相确认了吗?
三次握手的目的:防止server端一直等待,浪费资源。
如果只有两次握手,第一次发送SYN=1时因网络延迟没发送成功,那么客户端会再发送一次SYN=1的建立请求,此时发送成功,客户端和服务器之间完成通信。
过了一段时间,第一次发送的SYN=1消息才发送到服务器,此时服务器以为是新的建立连接过程,又会回复一个SYN=1,ACK=1的响应。
如果只有两次连接,服务器会以为成功建立连接,但实际上客户端的数据已经获取到,不会再发送请求了,服务器就会处于一直等待的状态。
采用三次握手就可以防止这样的情况,因为第三次请求没发送给服务器,所以它处于同步已接受状态,如果一直没有收到第三条请求则会关闭连接。
那如果第三次握手失败了呢?
此时server的状态为SYN-RCVD,若等不到client的ACK,server会重新发送SYN+ACK包。如果server多次重发SYN+ACK都等不到client的ACK,就会发送RST包,强制关闭连接。
数据传输
当获取连接后,就可以开始真正的传输数据啦
- 服务器发送第一条请求给客户端,SYN=0,ACK=1,seq=1,ack=583,len=1280,发送数据的序号从1开始,希望对方发送数据从583字节开始。
- 服务器发送第二条请求给客户端,,SYN=0,ACK=1,seq=1281,ack=583,len=2560,因为上一次请求发送了1280字节的数据,所以此条数据从1281开始,还没有收到客户端的数据,所以确认号仍然为583。
- 服务器发送第三条请求给客户端,SYN=0,ACK=1,seq=3841,ack=583,len=1280,到上一次请求的数据已经发送到了1280+2560,所以此次从3841字节的数据开始。
- 客户端回应服务器发送的请求,SYN=0,ACK=1,seq=583,ack=3841,len=0,因为服务器希望收到583字节开始的数据,所以这里序号为583,确认号为3841,希望收到对方以3841开始的数据(这里可能上一条数据还没有收到),长度为0表示只是确认收到的响应。

到这里就是完整的【建立连接】,以及发送请求流程。关于【释放连接】,会在下一篇文章中描述。
以上就是关于 从序号和确认号理解TCP三次握手 的内容 , 更多有关 前端、网络协议 的内容可以参考我其它的博文,持续更新中~
从序号和确认号理解TCP三次握手的更多相关文章
- 理解TCP三次握手和四次挥手
TCP相关知识 TCP是面向连接的传输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,HTTP协议并没有明确要求必须使用TCP协 ...
- 彻彻底底地理解TCP三次握手和四次挥手的全部过程
三次握手 我们先提出一些问题,但是我们暂且不回答这些问题,下面我会尽我所能详尽地讲解TCP的三次握手过程,然后看完你可以在评论区留下你对问题的答案,我们可以一起探讨. 为什么要握手 为什么是三次而不是 ...
- 理解TCP三次握手/四次断开的必要性
1 TCP的三次握手与必要性 (1)三次握手图 (2)必要性:TCP通过三次握手建立可靠的(确保收到)的全双工通信. 1)第一次握手和第二次握手(ACK部分)建立了从客户端到服务器传送数据的可靠连接: ...
- 深入理解TCP三握四挥
面试中被问到不少次TCP的三握四挥,今天特意来做一个总结(一些资料是很久前找的,忘了参考的链接了) 一.三次握手 首先来看一张图 最初,客户机A与服务器B的TCP进程都处于 CLOSED 状态. 然后 ...
- 转 TCP中的序号和确认号
在网络分析中,读懂TCP序列号和确认号在的变化趋势,可以帮助我们学习TCP协议以及排查通讯故障,如通过查看序列号和确认号可以确定数据传输是否乱 序.但我在查阅了当前很多资料后发现,它们大多只简单介绍了 ...
- TCP 三次握手原理,你真的理解吗?
最近,阿里中间件小哥哥蛰剑碰到一个问题——client端连接服务器总是抛异常.在反复定位分析.并查阅各种资料文章搞懂后,他发现没有文章把这两个队列以及怎么观察他们的指标说清楚. 因此,蛰剑写下这篇文章 ...
- TCP三次握手形象理解
tcp三次握手就像是你用企业微信给人家发信息,首先你得确认别人在不在,你会发 在吗? 这个时候显示的是未读 对方看到之后未读会变成已读 然后他会回复你 在的 你看到这个消息后,他那边也 ...
- 谈谈你对 TCP 三次握手和四次挥手的理解
TCP三次握手: 1.客户端发送syn包到服务器,等待服务器确认接收. 2.服务器确认接收syn包并确认客户的syn,并发送回来一个syn+ack的包给客户端. 3.客户端确认接收服务器的syn+ac ...
- TCP三次握手、四次挥手理解
tcp三次握手建立连接第一次握手 客户端发送给服务器一段连接请求报文,等待服务器回应 第二次握手 服务器收到报文,并发送给客户端一个确认报文,等待客户端回应 第三次握手 客户端收到新报文 ,再发送给服 ...
- 第五章 运输层(UDP和TCP三次握手,四次挥手分析)
序言 通过这章,可以知道其实三次握手和四次挥手其实真的好简单,通过这章的学习,我相信你也会同样的认为,以后在也不需要听到别人问三次握手的过程而自己一脸懵逼了,觉得人家好屌,其实也就是他懂你不懂,仅 ...
随机推荐
- 2022-03-13:golang项目代码push到gogs上,如何自动编译、打镜像、k8s上运行?
2022-03-13:golang项目代码push到gogs上,如何自动编译.打镜像.k8s上运行? 答案2022-03-13: 2022-02-23:如何搭建k8s单机环境(用k3s),并且搭建da ...
- 2021-10-09:杨辉三角。给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。力扣118。
2021-10-09:杨辉三角.给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行.在「杨辉三角」中,每个数是它左上方和右上方的数的和.力扣118. 福大大 答案2021-10 ...
- 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)
目录 一.前言 二.偶数分频 2.1 触发器级联法 2.2 计数器法 2.3 verilog代码 2.4 Testbench 2.5 仿真结果 三.奇数分频 3.1 占空比非50%奇数分频 3.2 占 ...
- 什么是DOM和BOM?
DOM:文档对象模型,描述了处理网页内容的方法和接口.最根本对象是document 由于DOM的操作对象是文档,所以DOM和浏览器没有直接关系 BOM:浏览器对象模型,描述了与浏览器进行交互的方法和接 ...
- 蓝桥杯真题 平面切分(Set自定义去重)
题目详情 资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 平面上有 N 条直线,其中第 i 条直线是 y=Ai⋅ ...
- 未来之JavaScript做嵌入式
只听说过汇编,c做嵌入式,从不曾想JAVAScript也牛到涉入硬件领域了,原本对他的思维定格就是一个浏览器脚本.看来真应了那句话'只有想不到,没有做不到' 话不多说看看这些大佬的帖子在嵌入式设备中使 ...
- 代码随想录算法训练营Day16二叉树|104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数
代码随想录算法训练营 代码随想录算法训练营Day16二叉树|104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数 104.二叉树的最大深度 题目 ...
- 让你的代码动起来:Python进度条神器tqdm详解及应用实例
各位Python高手,今天我要给大家介绍一个好用的库,它就是:tqdm tqdm在阿拉伯语中的意思是 "进展",所以这个库也被称为 "快速进展条".不得不说,这 ...
- Galaxy Project | 一些尝试与思考
很久都没有更新推文了,脑壳羞涩,快码不出字的节奏! 最近在尝试内部 Galaxy 一些新工具的开发和 Galaxy 核心版本的升级测试,发现一些问题,简单记录和聊一下吧. 一些尝试 对于在线的 web ...
- Git使用教程(带你玩转GitHub)
Git使用教程(理论实体结合体系版) 下载安装: 按照这个博客来就好 Windows系统Git安装教程(详解Git安装过程) - 学为所用 - 博客园 (cnblogs.com) Git命令大全: G ...