序列号SYN+确认号ACK

2024-09-07 11:38
文章标签 确认 序列号 ack syn

本文主要是介绍序列号SYN+确认号ACK,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

处于对于wireshark中的SYN和ACK如何计算出来的疑惑 找的这篇译文!

From:  http://blog.csdn.net/a19881029/article/details/38091243

原文见:http://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/

 

如果你正在读这篇文章,很可能你对TCP“非著名”的“三次握手”或者说“SYN,SYN/ACK,ACK”已经很熟悉了。不幸的是,对很多人来说,对TCP的学习就仅限于此了。尽管年代久远,TCP仍是一个相当复杂并且值得研究的协议。这篇文章的目的是让你能够更加熟练的检查Wireshark中的TCP序列号和确认号

在我们开始之前,确保在Wireshark中打开示例(请到作者原文中下载)并亲自实践一下

示例中仅包含一个单独的HTTP请求,请求的流程是:web浏览器向web服务器请求一个单独的图片文件,服务器返回一个成功的响应(HTTP/1.1200 OK),响应中包含请求的文件。右键示例文件中任意一个TCP包并且选择Follow TCP Stream就可在单独的窗口查看原始的TCP流

客户端请求使用红色显示,服务端响应使用蓝色显示

TCP三次握手(参见:http://blog.csdn.net/a19881029/article/details/30241561)

TCP在其协议头中使用大量的标志位或者说1位(bit)布尔域来控制连接状态,我们最感兴趣的3个标志位如下:

SYN - 创建一个连接

FIN -  终结一个连接

ACK - 确认接收到的数据

就像我们看见的那样,一个包中有可以设置多个标志位

选择Wireshark中的“包”1并且展开中间面板的TCP层解析,然后展开TCP头中的标志位域,这里我们可以看见所有解析出来的TCP标志位,需要注意的是,“包1”设置了SYN标志位

使用同样的方式操作“包2”。可以看到"包2"设置了2个标志位:ACK - 用来确认收到客户端的SYN包,SYN - 用来表明服务端也希望建立TCP连接

从客户端发来的“包3”只设置了ACK标志位。这3个包完成了最初的TCP3次握手

序列号和确认号

TCP会话的每一端都包含一个32位(bit)的序列号,该序列号被用来跟踪该端发送的数据量。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收

当某个主机开启一个TCP会话时,他的初始序列号是随机的,可能是0和4,294,967,295之间的任意值,然而,像Wireshark这种工具,通常显示的都是相对序列号/确认号,而不是实际序列号/确认号,相对序列号/确认号是和TCP会话的初始序列号相关联的。这是很方便的,因为比起真实序列号/确认号,跟踪更小的相对序列号/确认号会相对容易一些

比如,在“包1”中,最初的相对序列号的值是0,但是最下方面板中的ASCII码显示真实序列号的值是0xf61c6cbe,转化为10进制为4129057982

如果想要关闭相对序列号/确认号,可以选择Wireshark菜单栏中的 Edit -> Preferences ->protocols ->TCP,去掉Relative sequence number后面勾选框中的√即可

需要注意的是,文章接下来的部分依然使用相对序列号/确认号

为了更好的理解在整个TCP会话期间,TCP序列号和确认号是如何工作的,我们可以使用Wireshark内置的绘制流功能,选择菜单栏中的 Statistics ->Flow Graph...->TCP flow ->OK

Wireshark会自动创建一个TCP流的图形摘要

每行代表一个单独的TCP包,左边列显示时间,中间列显示包的方向、TCP端口、段长度和设置的标志位,右边列以10进制的方式显示相关序列号/确认号,在这里选中任意行会高亮主窗口中该行所关联的包

我们可以利用这个流图更好的理解序列号和确认号是如何工作的

包1

TCP会话的每一端的序列号都从0开始,同样的,确认号也从0开始,因为此时通话还未开始,没有通话的另一端需要确认(我使用的Wireshark版本和原作者不同,Wireshark1.10.2中,包1不显示确认号)

包2

服务端响应客户端的请求,响应中附带序列号0(由于这是服务端在该次TCP会话中发送的第一个包,所以序列号为0)和相对确认号1(表明服务端收到了客户端发送的包1中的SYN)

需要注意的是,尽管客户端没有发送任何有效数据,确认号还是被加1,这是因为接收的包中包含SYN或FIN标志位(并不会对有效数据的计数产生影响,因为含有SYN或FIN标志位的包并不携带有效数据)

包3

和包2中一样,客户端使用确认号1响应服务端的序列号0,同时响应中也包含了客户端自己的序列号(由于服务端发送的包中确认收到了客户端发送的SYN,故客户端的序列号由0变为1)

此时,通信的两端的序列号都为1,通信两端的序列号增1发生在所有TCP会话的建立过程中

包4

这是流中第一个携带有效数据的包(确切的说,是客户端发送的HTTP请求),序列号依然为1,因为到上个包为止,还没有发送任何数据,确认号也保持1不变,因为客户端没有从服务端接收到任何数据

需要注意的是,包中有效数据的长度为725字节

包5

当上层处理HTTP请求时,服务端发送该包来确认客户端在包4中发来的数据,需要注意的是,确认号的值增加了725(725是包4中有效数据长度),变为726,简单来说,服务端以此来告知客户端端,目前为止,我总共收到了726字节的数据,服务端的序列号保持为1不变

包6

这个包标志着服务端返回HTTP响应的开始,序列号依然为1,因为服务端在该包之前返回的包中都不带有有效数据,该包带有1448字节的有效数据

包7

由于上个数据包的发送,TCP客户端的序列号增长至726,从服务端接收了1448字节的数据,客户端的确认号由1增长至1449

在抓包文件的主体部分,我们可以看到上述过程的不断的重复,客户端的序列号一直是726,因为客户端除了最初的725字节数据没有再向服务端发送数据,服务端的序列号则与此相反,由于服务端不断的发送HTTP响应,故其序列号一直在增长

序列号为当前端成功发送的数据位数,确认号为当前端成功接收的数据位数,SYN标志位和FIN标志位也要占1位

关闭连接

包38

在确认了服务端发送过来的最后一个数据段之后,客户端将处理整个HTTP响应并决定不需要进一步通信了。此时客户端发送设置了FIN标志位的包38,其确认号和之前的包37一样

包39

服务端通过将确认号加1的方式回应客户端期望关闭连接的请求(这里和包2中确认SYN标志位时所作的操作是一样的),同时设置当前包的FIN标志位

包40

客户端发送最终序列号727,通过将确认号加1的方式确认服务端的FIN包

此时,通信双方都终结了会话并且可以释放用于维持会话所占用的资源

 

这篇关于序列号SYN+确认号ACK的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144956

相关文章

企业网银登录提示请确认您已插入工商银行U盾证书的解决方法

昨天受人之托帮小企业财务解决上网银的问题 因为不是专业做这个的,所以只能安装“常识”行事,但结果实在是令人意想不到。 排错的步骤: 同一台电脑上尝试不同浏览器,发现360浏览器的接受度相当普遍;给U盾换不同的连接线;在不同的电脑上安装银行的插件,再重复上面的步骤1和步骤2;最终的结果,在一台电脑上可以走到下一步,但时好时坏,无法解决问题;到知乎上找答案,在一篇说明里有提到定制的qq浏览器,最后

单片机软件工程师确认硬件

文章目录 简介流程确认能连接usb和调试器确认芯片信息确认芯片存储是否正常确认屏幕是否能点亮确认其他硬件 方式方法 简介 硬件工程师给出板子后,后面就是软件工程师的事儿了。 通常来说并不会很顺利。 流程 确认能连接usb和调试器 也是在“计算机管理”中 或者 在keil 调试那里能发现你连的板子。 确认芯片信息 1,直接用眼看上面的封装信息 2,使用相关命令确认一下

如何开启事务、确认提交事务、事务回滚、自动提交和禁止自动提交?

在数据库操作中,事务的开启、提交、回滚、自动提交和禁止自动提交是确保数据一致性和完整性的关键步骤。以下是这些操作的详细说明: 1. 开启事务 事务的开启方式通常取决于所使用的数据库访问技术或框架。以下是一些常见的情况: JDBC:在使用JDBC时,可以通过调用Connection对象的setAutoCommit(false)方法来禁用自动提交,从而开始一个新的事务。Spring框架:在Spr

新路程------sil9135 hi3516a gpio功能确认

首先确认SCDT管脚 数据手册解释: 也就是hi3516端应该配置为in,这个pin用来表示有video进来,那么进来前后,pin的状态是如何变化的呢? 还有编程手册里 有寄存器可以读取这个SCDT的值,那么还要这个pin干什么呢?不太理解,以后解释 接下来是int pin,中断好配, hi3516a这边是gpio11_2,先看是否配成gpio /usr #

Java Swing中几种常见对话框(文件对话框、消息对话框、输入对话框、确认对话框、颜色对话框)

1、Dialog类主要方法        JDialog类和JFrame都是Windows的子类,二者的实例都是底层容器,但二者有相似之处也有不同的地方,主要区别是JDialog类创建的对话框必须要依靠于某个窗口。        创建对话框与创建窗口类似,通过建立JDialog的子类来建立一个对话框类,然后这个类的一个实例就是一个对话框。对话框是一个容器,它的默认布局是BorderLayout

Java中syn锁状态

原因:Monitor实现的锁属于重量级锁,里边涉及到了用户态和内核态的切换,进程的上下文切换,成本较高,性能差。 记录锁状态的位置:在 Java 对象头里,有一块结构,叫Mark Word,里面会记录锁的状态。Mark Word 会记录对象自身的运行数据,如哈希码、GC 分代年龄、锁状态标志、偏向时间戳(Epoch) 等。 锁有四种状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态 偏向

RabbitMQ未确认消息处理

需要注意的是,两个回调处理的均为当前该回调的处理范围,成功的处理成功的,失败的处理失败的。实际如何用,可参考尚硅谷P37尚硅谷2021新版RabbitMQ教程丨快速掌握MQ消息中间件_哔哩哔哩_bilibili  SortedSet<Long> confirmSet = Collections.synchronizedSortedSet(new TreeSet<Long>());  channe

【传输层协议】TCP协议(上) {TCP协议段格式;确认应答机制;超时重传机制;连接管理机制:三次握手、四次挥手}

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议,用于在网络上可靠地传输数据。TCP是互联网协议套件(TCP/IP)中的一个主要协议,它在IP(Internet Protocol)的基础之上提供了可靠的数据传输服务。 TCP协议具有以下特点和功能: 面向连接:在通信双方进行数据传输之前,需要建立TCP连接,包括三次握手和四次

第三方软件测评中心分享:软件确认测试、验收测试的区别和联系

在现代软件开发过程中,确保软件质量和性能是成功的关键。为了达到这个目标,软件产品经过开发之后必须进行测试工作,软件确认测试和验收测试同为测试流程中必不可少的关键环节,它们分别是什么?又有什么区别和联系呢? 一、什么是软件确认测试?   软件确认测试,主要用于验证软件的功能是否符合需求规格说明书的要求。这一阶段的测试确保每一个功能模块在设计的条件下能够正常工作。卓码软件测评在执行软件确认测试时,通

vue手机端 搜索框调起带搜索键盘,点击确认自动关闭

效果如下图 步骤: 1.html,所需配置参数都在下图 <el-form :inline="true" :mode="serchFormf" class="searchForm" action="javascript:return true;"><el-form-item label="" ><el-inputsize="small"type="search"clearableref="