TCP报文解析

TCP报文解析TCP 报文解析源端口和目的端口字段 TCP 源端口 SourcePort 源计算机上的应用程序的端口号 占 16 位 TCP 目的端口 DestinationP 目标计算机的应用程序端口号 占 16 位 序列号字段 CP 序列号 SequenceNumb 占 32 位 它表示本报文段所发送数据的第一个字节的编号 在 TCP 连接中 所传送的字节流的每一个字节都会按顺序编号 当 SYN 标记不为 1 时 这是当前数据分段第一个字母的序列号 如果 SYN 的值是 1 时 这个字段的值就是初始序列


TCP报文解析

在这里插入图片描述


使用wireshark进行捕获,设置TCP过滤条件:

在这里插入图片描述

图一

图二

在这里插入图片描述

TCP序列号和确认号详解

在网络分析中,读懂TCP序列号和确认号在的变化趋势,可以帮助我们 学习TCP协议以及排查通讯故障,如通过查看序列号和确认号可以确定数据传输是否乱序。但我在查阅了当前很多资料后发现,它们大多只简单介绍了TCP通讯 的过程,并没有对序列号和确认号进行详细介绍,结合实例的讲解就更没有了。近段时间由于工作的原因,需要对TCP的序列号和确认号进行深入学习,下面便是 我学习后的一些知识点总结,希望对TCP序列号和确认号感兴趣的朋友有一定帮助。

  1. 序列号和确认号的简介及作用

TCP 协议工作在OSI的传输层,是一种可靠的面向连接的数据流协议,TCP之所以可靠,是因为它保证了传送数据包的顺序。顺序是用一个序列号来保证的。响应包 内也包括一个序列号,表示接收方准备好这个序列号的包。在TCP传送一个数据包时,它会把这个数据包放入重发队列中,同时启动计时器,如果收到了关于这个 包的确认信息,便将此数据包从队列中删除,如果在计时器超时的时候仍然没有收到确认信息,则需要重新发送该数据包。另外,TCP通过数据分段中的序列号来 保证所有传输的数据可以按照正常的顺序进行重组,从而保障数据传输的完整。

  1. TCP的通讯过程

在TCP通讯中主要有连接的建立、数据的传输、连接的关闭三个过程!每个过程完成不同的工作,而且序列号和确认号在每个过程中的变化都是不同的。

2.1 TCP建立连接

TCP建立连接,也就是我们常说的三次握手,它需要三步完成。在TCP的三次握手中,发送第一个SYN的一端执行的是主动打开。而接收这个SYN并发回下一个SYN的另一端执行的是被动打开。

这里以客户端向服务器发起连接来说明。

  1. 第1步 :客户端向服务器发送一个同步数据包请求建立连接,该数据包中,初始序列号(ISN)是客户端随机产生的一个值,确认号是0;
  2. 第2步 :服务器收到这个同步请求数据包后,会对客户端进行一个同步确认。这个数据包中,序列号(ISN)是服务器随机产生的一个值,确认号是客户端的初始序列号+1;
  3. 第3步 :客户端收到这个同步确认数据包后,再对服务器进行一个确认。该数据包中,序列号是上一个同步请求数据包中的确认号值,确认号是服务器的初始序列号+1。

注意 :因为一个SYN将占用一个序号,所以要加1。

初始序列号(ISN)随时间而变化的,而且不同的操作系统也会有不同的实现方式,所以每个连接的初始序列号是不同的。TCP连接两端会在建立连接时,交互一些信息,如窗口大小、MSS等,以便为接着的数据传输做准备。

RFC793指出ISN可以看作是一个32bit的计数器,每4ms加1,这样选择序号的目的在于防止在网络中被延迟的分组在以后被重复传输,而导致某个连接的一端对它作错误的判断。

2.2 TCP传输数据

传输数据的简要过程如下:

  1. 发送数据 :服务器向客户端发送一个带有数据的数据包,该数据包中的序列号和确认号与建立连接第三步的数据包中的序列号和确认号相同;
  2. 确认收到 :客户端收到该数据包,向服务器发送一个确认数据包,该数据包中,序列号是为上一个数据包中的确认号值,而确认号为服务器发送的上一个数据包中的序列号+所该数据包中所带数据的大小。
    数据分段中的序列号可以保证所有传输的数据按照正常的次序进行重组,而且通过确认保证数据传输的完整性。

2.3 TCP关闭连接

前 面我们提到,建立一个连接需要3个步骤,但是关闭一个连接需要经过4个步骤。因为TCP连接是全双工的工作模式,所以每个方向上需要单独关闭。在TCP关 闭连接时,首先关闭的一方(即发送第一个终止数据包的)将执行主动关闭,而另一方(收到这个终止数据包的)再执行被动关闭。

关闭连接的4个步骤如下:

  1. 第1步 :服务器完成它的数据发送任务后,会主动向客户端发送一个终止数据包,以关闭在这个方向上的TCP连接。该数据包中,序列号为客户端发送的上一个数据包中的确认号值,而确认号为服务器发送的上一个数据包中的序列号+该数据包所带的数据的大小;
  2. 第2步 :客户端收到服务器发送的终止数据包后,将对服务器发送确认信息,以关闭该方向上的TCP连接。这时的数据包中,序列号为第1步中的确认号值,而确认号为第1步的数据包中的序列号+1;
  3. 第3步 :同理,客户端完成它的数据发送任务后,就也会向服务器发送一个终止数据包,以关闭在这个方向上的TCP连接,该数据包中,序列号为服务器发送的上一个数据包中的确认号值,而确认号为客户端发送的上一个数据包中的序列号+该数据包所带数据的大小;
  4. 第4步 :服务器收到客户端发送的终止数据包后,将对客户端发送确认信息,以关闭该方向上的TCP连接。这时在数据包中,序列号为第3步中的确认号值,而确认号为第3步数据包中的序列号+1;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227192.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午9:44
下一篇 2026年3月16日 下午9:44


相关推荐

  • 黑盒测试工具总结

    黑盒测试工具总结本文介绍一些常见的黑盒测试工具 QTPQTP 是 quicktestPro 的简称 是一种自动测试工具 使用 QTP 的目的是想用它来执行重复的手动测试 主要是用于回归测试和测试同一软件的新版本 QuickTest 工作流程 1 录制测试脚本前的准备在测试前需要确认你的应用程序及 QuickTest 是否符合测试需求 确认你已经知道如何对应用程序进行测试 如要测试哪些功能 操

    2026年3月26日
    2
  • 相对熵原理

    相对熵原理https www zhihu com question answer

    2026年3月16日
    2
  • PyCharm配置anaconda环境的步骤详解

    PyCharm配置anaconda环境的步骤详解更多编程教程请到 菜鸟教程 https www piaodoo com 友情链接 好看站 http www nrso net PyCharm 是一款很好用很流行的 python 编辑器 Anaconda 是专注于数据分析的 Python 发行版本 包含了 conda Python 等 190 多个科学包及其依赖项 Anaconda 通过管理工具包 开发环境 Python 版本 大大简化了你的工作流程 不仅可以方便地安装 更新 卸载工具包 而且安装时能自动安装相应的依赖包 同时还能使用不同的虚拟环境隔离不同

    2026年3月27日
    2
  • SD/MMC 卡读写模块—SD/MMC 卡的外部物理接口

    SD/MMC 卡读写模块—SD/MMC 卡的外部物理接口转载地址:http://www.8951.com/book/jiao1n21.htmSD/MMC   卡是一种大容量(最大可达4GB)、性价比高、体积小、访问接口简单的存储卡。SD/MMC卡大量应用于数码相机、MP3机、手机、大容量存储设备,作为这些便携式设备的存储载体,它还具有低功耗、非易失性、保存数据无需消耗能量等特点。SD卡接口向下兼容MMC(MutliMediaCard

    2022年6月8日
    51
  • Java反射机制:跟着代码学反射

    Java反射机制:跟着代码学反射微信搜索:码农StayUp主页地址:https://gozhuyinglong.github.io源码分享:https://github.com/gozhuyinglong/blog-demos1.前言在OOP的世界里,万物皆对象。也就是说,我们可以将任何东西抽象成一个对象。比如人,可以抽象成一个Person类,通过newPerson()来实例化一个对象;再比如鸭子,可以抽象成一个Duck类,也可以对其进行实例化……那么这一个个类本身是不是也可以抽象成一个类呢?Java提供了一个特殊的类..

    2022年5月20日
    37
  • kettle 教程(一):简介及入门「建议收藏」

    kettle 教程(一):简介及入门「建议收藏」kettle是纯java开发,开源的ETL工具,用于数据库间的数据迁移。可以在Linux、windows、unix中运行。有图形界面,也有命令脚本还可以二次开发。kettle的官网是https://community.hitachivantara….

    2022年5月10日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号