TCP协议流程详解,抓包分析

news2024/11/26 4:32:13

目录

  • TCP概念
  • TCP工作层
  • TCP协议头部解析
  • TCP抓包解析
  • TCP三次握手,数据收发,四次挥手抓包
  • TCP状态迁移

TCP概念

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义。

1、面向连接:一对一连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息;
2、可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;
3、字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统分成多个 TCP 报文,如果接收方的程序如果不知道消息的边界,是无法读出一个有效的用户消息的,因此可能造成粘包。并且 TCP 报文是有序的,当前一个TCP 报文没有收到的时候,即使它先收到了后面的 TCP 报文,那么也不能扔给应用层去处理,同时对重复的 TCP 报文会自动丢弃。

建立一个 TCP 连接需要客户端与服务端达成三个信息的共识:

1、Socket:由 IP 地址和端口号组成
2、序列号:用来解决乱序问题等
3、窗口大小:用来做流量控制

TCP 四元组可以唯一的确定一个连接:

源地址和目的地址:(32 位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。
源端口和目的端口:(16 位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程。

TCP 和 UDP 可以使用同一个端口:

当主机收到数据包后,可以在 IP 包头的协议号字段知道该数据包是 TCP/UDP,根据这个信息确定送给哪个模块(TCP/UDP)处理,送给 TCP/UDP 模块的报文根据「端口号」确定送给哪个应用程序处理。

TCP工作层

TCP工作在网络OSI的七层模型中的第四层:传输层。
在这里插入图片描述

TCP协议头部解析

在这里插入图片描述

1、源端口号:发送方端口号。
2、目标端口号:接收方端口号。
3、序号:发送序号,在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就累加一次该数据字节数的大小。用来解决网络包乱序问题。本报文段所发送的数据第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。序号是32bit的无符号数,序号到达2^32-1后从0开始。
4、确认号:接收序号,指下一次期望收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。确认号应该是上次已成功收到数据字节序号+1。只有ACK标志为1时,确认序号才有效。
5、数据偏移:表示数据开始的地方离TCP段的起始处有多远。实际上就是TCP段首部的长度。由于首部长度不固定,因此数据偏移字段是必要的。
6、窗口:TCP通过滑动窗口的概念来进行流量控制。设想:在发送端 发送数据的速度 很快,而接收端 接收速度 却很慢的情况下,为了保证数据不丢失,显然需要进行流量控制, 协调好
通信双方的工作节奏。所谓滑动窗口,可以理解成 接收端 所能提供的缓冲区大小。TCP利用一个滑动的窗口来告诉发送端对它所发送的数据能提供多大的缓冲区。窗口大小为字节数起始于确认序号字段指明的值(这个值是接收端正期望接收的字节)。窗口大小是一个16bit字段,因而窗口大小最大为65535字节。
7、校验和:消息checksum,校验和覆盖整个TCP报文,由发送端计算和存储,接收端验证。
8、只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。

控制位

ACK:该位为 1 时,‘确认号’的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1 。
RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
SYN:该位为 1 时,表示希望建立连接,并在其‘序号’字段进行序列号初始值的设定。
FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。
URG:当URG=1时,注解此报文应尽快传送,而不要按本来的列队次序来传送。与“紧急指针”字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长。
PSH:当PSH=1时,接收方应该尽快将本报文段立即传送给其应用层。

TCP抓包解析

以TCP数据发送报文为例抓包,主要看头部信息。包括物理层、数据链路层、IP层、传输层、数据负载。
在这里插入图片描述
导出十六进制ASCII码分析,报文总长度61。
1、数据链路层:第一行标红的16字节是数据链路层,前6字节是目的MAC,紧随其后的6字节是源MAC,随后2字节全0未使用(有时不占用),最后2字节是IP协议类型。
2、IP层:标绿的20字节是IP首部。
3、传输层:标橙色20字节,例如前2字节8a a6转换成十进制就是源端口号35494。
4、数据负载:标蓝色的最后5字节,转换成十进制,对照ASCII就是:hello。

在这里插入图片描述

TCP三次握手,数据收发,四次挥手抓包

可以看到序号(Seq)和确认号(Ack)的变化,发送端的Seq就是接收端的Ack,反过来一样。
三次握手和四次挥手时,数据负载长度Len=0,此时序号=原序号+1。
有数据负载时,序号=原序号+负载长度。
在这里插入图片描述

TCP状态迁移

在这里插入图片描述
三次握手

1、一开始,客户端和服务端都处于 CLOSE 状态。
2、先是服务端主动监听某个端口,处于 LISTEN 状态。
3、第一次握手:客户端会随机初始化序号,SYN 标志位置为 1,发送给服务端,之后客户端处于 SYN-SENT 状态。
4、第二次握手:服务端收到客户端的 SYN 报文,服务端也随机初始化自己的序号,把 SYN 和 ACK 标志位置为 1,发送给客户端,之后服务端处于 SYN-RCVD 状态。
5、第三次握手:客户端收到服务端报文后,向服务端回应最后一个应答报文, ACK 标志位置为 1,之后客户端处于 ESTABLISHED 状态。
6、服务端收到客户端的应答报文后,也进入 ESTABLISHED 状态。
7、之后客户端和服务端就可以相互收发数据了,前两次握手不能携带数据,第三次握手可携带数据。

四次挥手

1、双方都可以主动断开连接,以客户端主动断开连接为例。
2、客户端发送一个 TCP 首部 FIN 标志位被置为 1 的报文,之后客户端进入 FIN_WAIT_1 状态。
3、服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSE_WAIT 状态。
4、客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
5、等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
6、客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
7、服务端收到了 ACK 应答报文后,就进入了 CLOSE 状态,至此服务端已经完成连接的关闭。
8、客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,至此客户端也完成连接的关闭。

主动关闭连接的,才有 TIME_WAIT 状态。
被动关闭方,才有CLOSE_WAIT 状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis操作数据库(查询功能)

目录 一、MyBatis的概念 二、配置MyBits环境 三、 MyBatis连接数据库查询操作(示例) 创建MySQL数据库表 配置MyBatis 配置连接数据库和MyBatis xml文件 ​编辑 四、添加业务代码 实体类entity 数据持久层mapper 创建接口类 创建xml文件 服务层…

偏向锁、轻量级锁、重量级锁、自旋锁、自适应自旋锁

1. 偏向锁 偏向锁就是在运行过程中,对象的锁偏向某个线程。即在开启偏向锁机制的情况下,某个线程获得锁,当该线程下次再想要获得锁时,不需要重新申请获得锁(即忽略synchronized关键词),直接就可…

python 房价数据可视化以数据缺失处理、及回归算法

基本信息概述 房价数据为他国地区使用工具为JupyterLab、python3用到的包 绘图包:seaborn、matplotlib数据处理包:numpy、pandas统计计算包:math、scipy回归模型包:make_pipeline、 RobustScaler、ElasticNet,Lasso、KernelRidge…

设计模式(十四):行为型之策略模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

Python使用最新版pyinstaller将项目或程序打包成exe或者mac中的可执行文件

1、pyinstaller的说明: pyinstaller 能够在 Windows、Linux、Mac 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个独立文件方便传递和管理。 PyInstaller 支…

进程管道:父进程和子进程

在接下来的对pipe调用的研究中,我们将学习如何在子进程中运行一个与其父进程完全不同的另外一个程序,而不是仅仅运行一个相同程序。我们用exec调用来完成这一工作。这里的一个难点是,通过exec调用的进程需要知道应该访问哪个文件描述符。在前…

设计模式(十三):行为型之模板方法模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

S200, S1700, S5700交换机忘记密码怎么办(huawei)

目录 交换机忘记密码怎么办?如何修改或清除密码? 简介 一:修改了所有默认密码,还忘记了所有密码 二:忘记了Console口登录密码 方法一:通过STelnet/Telnet登录设备修改Console口密码 方法二&#xff1…

RV1126笔记三十六:PaddleOCR环境搭建一

若该文为原创文章,转载请注明原文出处。 在前面测试过PaddleOCR的文字识别功能,现在自己搭建训练模型并测试。 这篇主要是环境搭建,环境为win10无GPU. 1、创建环境 # 创建paddle环境 conda create -n paddle python=3.8 # 查看环境 conda env list # 切换环境 conda acti…

第三章 模型篇:模型与模型的搭建

写在前面的话 这部分只解释代码,不对线性层(全连接层),卷积层等layer的原理进行解释。 尽量写的比较全了,但是自身水平有限,不太确定是否有遗漏重要的部分。 教程参考: https://pytorch.org/tutorials/ https://githu…

RK3588平台开发系列讲解(以太网篇)SGMII和RGMII接口特性

文章目录 一、MAC 与 PHY的连接二、MAC 与 PHY 在OSI 中位置2.1、网络层2.2、数据链路层2.3、物理层三、RGMII四、SGMII沉淀、分享、成长,让自己和他人都能有所收获!😄 一、MAC 与 PHY的连接 从硬件的角度看,以太网接口电路主要由MAC控制器和物理层PHY芯片两部分组成。 以…

Redis 五大数据类型/结构

Redis 五大数据类型/结构 操作文档 官方文档: https://redis.io/commands 中文文档: http://redisdoc.com/ Redis 数据存储格式 一句话: redis 自身是一个Map,其中所有的数据都是采用key : value 的形式存储 key 是字符串,value 是数据,数…

流媒体接入服务的一般模型

0x00 背景说明 媒体接入服务用来实现媒体资源(resource)的接收和发送,在有限范围内实现不同接入协议的转换。 0x01 一般模型 媒体传输通道的建立步骤通常分为两个阶段: 握手/协商媒体传输 其中,握手/协商操作通常包含: 媒体…

【GD32F303CCT6BlueBill开箱点灯教程】

【GD32F303CCT6BlueBill开箱点灯教程】 1. 搭建环境1.1 官方资料1.2 安装Keil 51.3 安装芯片选型插件pack包 2. 编译2.1 Keil4转换为Keil5工程2.2 选择芯片型号2.3 存储器类型2.4 选择下载器2.5 内存下载设置 3. 烧录3.1 Keil内烧录3.1.1 J-Link烧录3.1.2 ST-Link烧录3.1.3 CMS…

读书笔记:《远见:如何规划职业生涯3大阶段》

《远见:如何规划职业生涯3大阶段》,作者布赖恩. 费瑟斯通豪,豆瓣链接:https://book.douban.com/subject/27609489/ 主旨:描述职业生涯中3个截然不同但相互关联的阶段,教会我们如何不断储备职场燃…

【linux指南--命令大全】

系统的学习linux常用的命令,命令很全所以篇幅很长,可以作为你查阅命令的手册。也欢迎大佬们评论区补充。 文章目录 常见目录介绍配置文件系统操作帮助命令man 帮助help 帮助info 帮助 显示当前的目录名称文件查看建立目录删除空目录复制文件移动文件删除…

Qt下面窗口嵌套,嵌套窗口中包含:QGraphicsView、QGraphicsScene、QGraphicsIte

Qt系列文章目录 文章目录 Qt系列文章目录前言一、嵌套窗口二、注意事项 前言 我们有一个主窗口mainwindow,需要向其中放入新的界面,你可以自己定义里面内容。 Qt的嵌套布局由QDockWidget完成,用Qt Creator拖界面得到的dock布置形式比较固定,…

vmware设置centos客户机和windows宿主机共享文件夹

一、安装内核 kernel-devel 包 yum install gcc yum install kernel-devel-$(uname -r) 注意,如果自己修改过内核版本,需要确保 uname -r 显示的版本和实际使用的内核版本一致。 二、安装 vmware-tools 在vmware上点击菜单:虚拟机->安…

Android kotlin 实现仿京东多个item向左自动排队(横向、动手滑动、没有首尾滑动)功能

文章目录 一、实现效果二、引入依赖三、源码实现1、适配器2、视图实现一、实现效果 二、引入依赖 在app的build.gradle在添加以下代码 1、implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6,这个里面带的适配器,直接调用就即可 BaseRecyclerViewAdapt…

【图神经网络】图神经网络(GNN)学习笔记:Graph Embedding

图神经网络(GNN)学习笔记:Graph Embedding 为什么要进行图嵌入Graph embedding?Graph Embedding使用图嵌入的优势有哪些?图嵌入的方法有哪些?节点嵌入方法(Node Embeddings)1. DeepWalk2. LINE…