【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抓包之三次握手】 的相关文章

  • 是否可以找到哪个用户位于 localhost TCP 连接的另一端?

    这是一个编程问题 但它是 Linux Unix 特定的 如果我从本地主机获得 TCP 连接 是否有一种简单的方法可以告诉哪个用户在 C 程序内建立了连接而无需 shell 我知道这对于 Unix 域套接字来说并不太难 我已经知道远程 IP
  • 为什么使用Python的os模块方法而不是直接执行shell命令?

    我试图了解使用Python的库函数执行特定于操作系统的任务 例如创建文件 目录 更改文件属性等 背后的动机是什么 而不是仅仅通过执行这些命令os system or subprocess call 例如 我为什么要使用os chmod而不是
  • 无法为 Python 3.4 创建工作虚拟环境

    I 安装Python 3 4 2 https docs python org 3 using unix html building python和我的 Linux Mint 17 1 中的 Virtualenv 12 0 5 然后我尝试创建
  • 我在哪里可以学习如何使 C++ 程序与操作系统 (Linux) 交互

    我是一个 C 初学者 我想创建与操作系统交互的小程序 使用 Kubuntu Linux 到目前为止 我还没有找到任何教程或手册来让 C 与操作系统交互 在 PHP 中 我可以使用命令 exec 或反引号运算符来启动通常在控制台中执行的命令
  • /proc/PID 文件格式

    我想从中检索一些流程信息 proc目录 我的问题如下 中的文件是否有标准格式 proc PID 例如 有这个proc PID status文件与Name t ProcName在第一行 我可以在其他地方用空格代替这个文件吗 t或者类似的东西
  • 是否有可能通过 mmap 匿名内存“打孔”?

    考虑一个使用大量大致页面大小的内存区域 例如 64 kB 左右 的程序 每个内存区域的寿命都相当短暂 在我的特定情况下 这些是绿色线程的替代堆栈 如何最好地分配这些区域 以便一旦该区域不再使用 它 们的页面可以返回到内核 天真的解决方案显然
  • 简单的跨平台 TCP IP API?

    我不打算使用像 QT 或 wxWidgets 的 API 这样的大东西 我只想要可以在 Android iOS Windows Mac Linux 上运行的简单套接字 我正在制作一个事件驱动的纸牌游戏 所以 TCP 是最好的 本质上 我只想
  • 如何在两个不同帐户之间设置无密码身份验证

    我们可以在两台机器的两种不同用途之间设置无密码身份验证吗 例如 计算机A有用户A 计算机B有用户B 我们可以设置密码 ssh 以便计算机 A 上的用户 A 使用其用户帐户 A 登录计算机 B 谢谢你 如果我理解你的问题 你能设置一下吗ssh
  • Linux 文本文件操作

    我有一个格式的文件 a href a href a href a href 我需要选择 之后但 之前的文本 并将其打印在行尾 添加后 例如 a href http www wowhead com search Su a a a a a
  • 是否有可能在linux中找到包含特定文本的文件?

    考虑这种情况 我在文件夹 Example 下有很多文件 如果我需要找到一个包含特定短语 如 Class Example 的文件 我该如何使用 Linux shell 来做到这一点 linux中有类似 定位 的函数可以做到这一点吗 Thank
  • Gradle 1.3:build.gradle 不构建类

    这里有一个新问题 我有一个 build gradle 文件apply plugin java在其中 并与 java 项目 包关联 当我跑步时gradle build从命令行我得到 compileJava UP TO DATE process
  • 为什么 ld 无法从 /etc/ld.so.conf 中的路径找到库?

    我想添加 opt vertica lib64进入系统库路径 所以我执行以下步骤 1 添加 opt vertica lib64 into etc ld so conf 然后运行ldconfig 2 检查 bash ldconfig p gre
  • 为什么 UDP 服务器中只有一个套接字?

    我正在准备考试 发现了这个问题 典型的 UDP 服务器可以使用单个套接字来实现 解释一下为什么 对于 TCP 驱动的服务器 我发现创建了两个套接字 一个用于所有客户端访问服务器 另一个用于每个客户端的特定 套接字 用于服务器和客户端之间的进
  • 无关的库链接

    我有一个可能有点愚蠢的问题 因为我很确定我可能已经知道答案了 假设你有静态库A 动态共享库B和你的linux下的程序C 假设库 A 调用库 B 中的函数 并且您的程序调用库 A 中的函数 现在假设 C 在 A 中调用的所有函数都不使用 B
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • CentOS目录结构是树形的吗?

    CentOS 上有相当于树的东西吗 如果你的 Centos 系统上没有安装 tree 无论如何我通常建议服务器设置使用最小安装磁盘 你应该在命令行中输入以下内容 yum install tree y 如果没有安装 那是因为您没有正确的存储库
  • 如何在 Linux 主机上的 docker 容器中挂载目录 [重复]

    这个问题在这里已经有答案了 我想将一个目录从 docker 容器挂载到本地文件系统 该目录是网站根目录 我需要能够使用任何编辑器在本地计算机上编辑它 我知道我可以跑docker run v local path container path
  • Linux 上的 Python 3.6 tkinter 窗口图标错误

    我正在从 Python GUI 编程手册 学习 Python GUI 某项任务要求我通过将以下代码添加到我的配方中来更改窗口图标 Change the main windows icon win iconbitmap r C Python3
  • 如何从linux命令行运行.exe可执行文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Windows 中有一个 abc exe 可执行文件 我可以使用 DOS 命令提示来执行此应用程序 并为其提供一些运行时变量 我想从
  • Scrapy FakeUserAgentError:获取浏览器时发生错误

    我使用 Scrapy FakeUserAgent 并在我的 Linux 服务器上不断收到此错误 Traceback most recent call last File usr local lib64 python2 7 site pack

随机推荐

  • 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