【linux tcp抓包之三次握手】

2023-05-16

【linux tcp抓包之三次握手】

  • 写在前面
    • 三次握手
    • tcpdump
      • 参数说明
      • 返回值说明
        • IP 127.0.0.1.42004 > 127.0.0.1.5051
        • Flags [S]
        • win 43690, options [mss 65495,sackOK,TS val 251419064 ecr 0,nop,wscale 7], length 0
          • mss 65495
          • sackOK
          • TS val 251419064 ecr 0,nop
          • length 0
        • 协议头和包内容

写在前面

这一篇章我们先简单说一下,linux下面的抓包。这样也方便我们后面去抓取nginx的包取进行分析。,同时也简单的说一下

这边我们是使用了tcpdump和Wireshark相结合的方法去分析,主要就是在tcpdump下面可以把包给写到文件中去,然后在Wireshark中去进行分析。

三次握手

我们先看一下抓取的tcp三次握手的包,如下图:
在这里插入图片描述

tcpdump

然后我们先简单说一下tcpdump的命令,当然我们也可以同man tcpdump来看详细的说明。
tcpduml -i 指定需要监听的网卡。我们可以通过tcpdump -D,看我们当前可以查看的网卡。
在这里插入图片描述

参数说明

-n 对地址以数字方式显式,否则显式为主机名,也就是说-n选项不做主机名解析;
-nn 除了-n的作用外,还把端口显示为数值,否则显示端口服务名。
-X 输出包的头部数据,会以16进制和ASCII两种方式同时输出。
-tttt 就是显示当前的时间戳,后面分别是年月日,时分秒 微妙

然后tcpdump这个参数是比较多的,大家可以man tcpdump去看看参数的说明。

然后 可以增加过滤比如指定host,port,proto等。
然后看一下我们这边的 tcpdump -i any -nn -n port -X 5051 。-i 指定所有的网卡,然后-nn 和-n 就是和上面说的一样,直接显示主机名和端口。
然后-X是说的是输出包的头部数据。然后port 5051就是指定了端口,因为我们的端口监听的这个端口。

返回值说明

然后我们说一下接下来的内容。就以第一个为主
2022-03-19 21:11:22.370405
这个是比较好理解的,就是当前的年月日,时分秒,然后最后一个是微妙数。

IP 127.0.0.1.42004 > 127.0.0.1.5051

然后这个说明用的是IP协议,然后首先是三次握手,是客户端主动链接,这里客户端启用了42004的临时端口去和服务进行链接。

Flags [S]

这个是一个标志位,在写在了tcp的header头中的。
然后我们先看看tcp header
在这里插入图片描述

然后看一下第四行的C,E,U,A,P,R,S,F,都代表着
在这里插入图片描述
SYN是这里面的同步位。
这里需要主要的是下面的Flags [S.]和 Flags [.],后面的.都是代表ACK的意思,这只这里省去了。
所以Flags [S.] 就是 SYN+ACK
Flags [.] 就是 ACK

win 43690, options [mss 65495,sackOK,TS val 251419064 ecr 0,nop,wscale 7], length 0

这个seq就是序号的意思,因为tcp规定,在三次握手中,即使没有发送数据,,也会消耗序号,观看我们的tcp header,这个seq就是 sequence number,占据16个位,所以最大是65535
win 就是窗口的大小,在tcp 头中就是 window size,可以看到是16个比特,单位是字节,因此字节的最大是2**16-1 = 65535 字节,但是在现在的带宽下,这会成为带宽的瓶颈,因为有一个窗口扩大因子。因此在本案例中,窗口真正的大小是 43690 * (2 ** 7) = 43690 * 128= 5592320。
窗口夸大因此在tcp的 扩展字段中,如图
在这里插入图片描述
在这里插入图片描述
其中kind=3是窗口扩大因子选项。
需要注意的是,在tcp中,往往会受到拥塞窗口的限制,所以真正的大小是窗口的真正的大小和拥塞窗口的最小值。
同时窗口扩大因子是在三次握手就固定的,后期不能修改

mss 65495

MSS(Maximum Segment Size,最大报文段大小)的概念是指TCP层所能够接收的最大段大小,该值只包括TCP段的数据部分,tcp头部和ip头部。可能很多人和MTU弄混,MTU是一个网络包的最大长度,以太网中一般为 1500 字节,这里我们用网上的一张图做介绍就一目了然

在这里插入图片描述
所以这里我们的tcp数据段最大是65495。

sackOK

发送端支持并同意使用SACK选。其实就是选择确认算法,当发生丢包的时候,只会重发丢弃的包也不会全部重发。

TS val 251419064 ecr 0,nop

TS就是Timpstamps ,时间错的意思,含义见下图
TS 和 ecr都是 tcp的扩展字段中的值,ecr在接收方会对发送放的TS进行计算并且返回给对端。

在这里插入图片描述

length 0

就是数据的长度,因为我们这次是三次握手,没有数据段的内容,所以数据段的长度是0。

协议头和包内容

其实就是让人迷惑的,这些是16进制和ASCII的形式显示,如下图所示
在这里插入图片描述
其实这些就是IP头+TCP头+包的内容,因为我们这个抓的是三次握手,没有内容。
首先我们来看一下IP头的部分,为了理解这个我们先看一下IP协议头
在这里插入图片描述
所以第一个4,就是代表了ipv4
第二个5 就是首部长度,单位是4字节,说明ip首部长度是5 * 4 =20字节。
所以接下来一直到第二行的7f 00 00 01都是说的ip首部。
然后接下来的都是tcp的协议头。
当然这些我们把tcddump -w out.cap.之后放到了WireShark中会更加直观,如图:
在这里插入图片描述

感兴趣的读者可以看一下wireshark抓包分析——TCP/IP协议

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【linux tcp抓包之三次握手】 的相关文章

  • 如何在Linux上用C/C++编写Web服务器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在考虑在 Linux 平台上开发一个小型 阅读 初级 Web 服务器 但我不知道从哪里开始 我希望它能够做的是 监听特定端口 接受
  • 如何在C(Linux utf8终端)中打印“盒子抽屉”Unicode字符?

    我正在尝试显示 方框图范围 2500 257F 中的 Unicode 字符 它应该是标准 utf8 Unicode 标准 版本 6 2 我根本做不到 我首先尝试使用旧的 ASCII 字符 但 Linux 终端以 utf8 显示 并且没有显示
  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • 如何从 Bash 命令行在后台 Vim 打开另一个文件?

    我正在从使用 Gvim 过渡到使用控制台 Vim 我在 Vim 中打开一个文件 然后暂停 Vim 在命令行上运行一些命令 然后想返回到 Vim Ctrl Z 在正常模式下 暂停 Vim 并返回到控制台 fg可用于将焦点返回到 Vim job
  • 为什么 OS X 和 Linux 之间的 UTF-8 文本排序顺序不同?

    我有一个包含 UTF 8 编码文本行的文本文件 mac os x cat unsorted txt foo foo 津 如果它有助于重现问题 这里是文件中确切字节的校验和和转储 以及如何自己生成文件 在 Linux 上 使用base64 d
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • 正则表达式删除块注释也删除 * 选择器

    我正在尝试使用 bash 从 css 文件中删除所有块注释 我有以下 sed 命令的正则表达式 sed r s w s w d 这可以很好地去除块注释 例如 This is a comment this is another comment
  • LINUX:如何锁定内存中进程的页面

    我有一个 LINUX 服务器 运行一个具有大量内存占用的进程 某种数据库引擎 该进程分配的内存太大 需要将其中一部分换出 换出 我想做的是将所有其他进程 或正在运行的进程的子集 的内存页面锁定在内存中 以便只有数据库进程的页面被换出 例如
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • 对卡在 CLOSE_WAIT 状态的连接进行故障排除

    我有一个在 Windows 上的 WebLogic 11g 中运行的 Java 应用程序 几天后它变得没有响应 我注意到的一个可疑症状是大量连接 大约 3000 个 出现在netstat即使服务器空闲 也具有 CLOSE WAIT 状态 由

随机推荐

  • ubuntu(15):对‘casadi::MX::MX(casadi::MX const&)’未定义的引用

    catkin build 编译报错 xff0c 找不到CASADI的头文件目录CASADI INCLUDE DIRS或者库文件也达不到CASADI LIBRARIES xff1b 对 casadi MX horzsplit casadi M
  • Cmake修改FetchContent_Declare为本地代码构建

    在构建代码时 xff0c 某些项目可能需要额外下载第三方库 然而 xff0c 由于网络不稳定 xff0c 克隆过程可能会出现问题 在这种情况下 xff0c 您需要手动修改项目配置 xff0c 将其指向已经下载到本地的库文件 Fetch do
  • OTA开源代码

    有许多开源项目可用于实现 OTA xff08 Over The Air xff09 更新 以下是一些流行的开源 OTA 更新项目 xff0c 您可以根据自己的需求和设备类型选择合适的项目 xff1a Mender xff08 适用于嵌入式
  • 摄像头接口标准

    UVC xff08 USB Video Class xff09 xff1a UVC是一种通用的USB摄像头接口标准 xff0c 使得摄像头设备能够与各种操作系统兼容 xff0c 实现即插即用的功能 CSI xff08 Camera Seri
  • win10安装Anaconda、cuda9.0、cudnn、tensorflow-gpu=1.12.0详细步骤

    最近刚想起写自己的博客 xff0c 每天遇到了问题都会阅览博客 xff0c 也想把自己遇到了的一些问题写成文章给博友们参考 xff0c 所以我想从最基础的配置环境开始写起 xff0c 如看到问题也请多多指教 准备工作 Anaconda下载地
  • 【SpringSecurity教程】认证 1.Basic认证

    前言 Basic 认证是在请求接口之前要输入账号密码 xff0c 是简单的Http验证模式 本章主要描述 xff1a SpringBoot如何整合Basic认证 后端Okhttp和前端Vue Axios如何请求Basic认证的接口 Spri
  • 【SpringSecurity教程】认证 2.Digest摘要认证

    前言 Digest xff08 摘要 xff09 认证是在请求接口之前要输入账号密码 xff0c 是在Basic认证传输账号密码的基础上加密 SpringBoot整合Digest pom xml span class token tag s
  • VIM3刷系统

    一 升级到最新系统 如果你的板子上已经运行的是官方发布的Ubuntu固件 xff0c 那么你可以通过如下命令升级系统到最新版本 span class token function sudo span span class token fun
  • 设置Chrome页面为黑色

    文章目录 1 设置主题2 设置页面 1 设置主题 设置 gt 外观 gt 主题背景 gt 选择一个黑色的主题 2 设置页面 输入chrome flags enable force dark将其设置为Enable即可
  • 网线每根的含义以及类别和距离传输问题

    文章目录 1 八芯线每根的含义2 传输距离限制3 双绞线的主要分类 1 八芯线每根的含义 网线采用8根线芯 xff0c 主要是为了减少电磁信号的相互干扰 xff0c 只用四根 xff0c 另外四根可做备份使用 每两根按一定的密度缠绞在一起
  • Windows快捷键

    文章目录 1 创建虚拟桌面2 虚拟桌面间切换3 虚拟桌面关闭4 锁住PC5 显示桌面6 从任务栏打开新应用7 两个应用分屏8 应用切换9 打开文件管理视窗10 打开放大镜11 截取屏幕12 打开操作中心13 进入设置14 与Cortana或
  • ubuntu(18):对‘pthread_create’未定义的引用

    报错 xff1a 对 pthread create 未定义的引用 usr local lib libbenchmark a benchmark runner cc o xff1a 在函数 benchmark internal Benchma
  • Git修改与删除commit记录

    Git修改与删除commit记录 修改commit信息删除未push的commit删除已push的commit 修改commit信息 1 修改最近一次commit的信息 git commit span class token operato
  • 电机转矩、功率、转速之间的关系及计算公式

    P 61 W T 61 FS T 61 FV T 61 F R V 61 2 RN N 转速 所以 P 61 FV 61 T R 2 RN 61 2 TN T 61 P 2 n 用千瓦 xff08 KW xff09 和转 分 xff08 r
  • 使用示波器测量串口波特率

    使用示波器测量串口波特率 波特率和bit时间计算关系基础概念基础知识 xff1a 测量结果 波特率和bit时间计算关系 基础概念 简而言之 xff0c 串口传输的波特率即为每秒钟传输二进制的位数 脱离枯燥乏味的文字描述 xff0c 我们用波
  • 雷达基本原理和组成

    雷达由天线辐射电磁波 xff0c 并通过天线接收目标反射回的电磁波 目标回波 xff0c 然后通过接收机和信号处理机从目标回波中提取信息 提取的目标信息主要包括距离 方位 俯仰和速度等 雷达系统的主要组成如图所示 xff0c 主要由发射机
  • 雷达坐标转换

    function r azimuth elevation flag AE r a etrue flag AE Truenum coordinate conversion XYZ t Angle Az Angle El 1 a 雷达直角坐标系
  • STM32F4驱动GPS(寄存器版)

    本次使用STM32F4的USART1对GPS模块进行驱动 xff0c 并且将GPS的时间 经纬度通过串口打印出来 gps模块与接线图 注意 xff1a GPS 模块需放到窗户边 阳台 xff0c 否则可能收不到 GPS 信号 1 GPS驱动
  • 宏的使用 extern

    https www cnblogs com chulin p 9389254 html
  • 【linux tcp抓包之三次握手】

    linux tcp抓包之三次握手 写在前面三次握手tcpdump参数说明返回值说明IP 127 0 0 1 42004 gt 127 0 0 1 5051Flags S win 43690 options mss 65495 sackOK