前提:

  • 1. linux环境
  • 2. 可正常使用tcpdump
  • 使用(node)serve -p 10005 启动一个前端
  • 前端存放一个静态1.txt文件,内容为test

模拟:在linux环境中启动一个应用,端口10005(目前是使用node 的 serve,创建1.txt文件,serve -p 10005 发布出来,通过 curl http://ip:10005/1.txt访问)

tcpdump测试命令:

tcpdump -i any host **.***.**.** and port 10005 -S

解释:使用tcptump时,默认在第三次握手时,会使用相对序列号,加上 -S,即可禁用相对序列号

新开窗口,执行

curl http://**.***.**.***:10005/1.txt

命令返回结果:

dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
15:26:32.268914 IP 主机名.34206 > 主机名.目标服务名: Flags [S], seq 4218104573, win 65495, options [mss 65495,sackOK,TS val 1712344938 ecr 0,nop,wscale 7], length 0
15:26:32.268924 IP 主机名.目标服务名 > 主机名.34206: Flags [S.], seq 3712382854, ack 4218104574, win 65483, options [mss 65495,sackOK,TS val 1712344938 ecr 1712344938,nop,wscale 7], length 0
15:26:32.268930 IP 主机名.34206 > 主机名.目标服务名: Flags [.], ack 3712382855, win 512, options [nop,nop,TS val 1712344938 ecr 1712344938], length 0
15:26:32.268954 IP 主机名.34206 > 主机名.目标服务名: Flags [P.], seq 4218104574:4218104662, ack 3712382855, win 512, options [nop,nop,TS val 1712344938 ecr 1712344938], length 88
15:26:32.270232 IP 主机名.目标服务名 > 主机名.34206: Flags [P.], seq 3712382855:3712383164, ack 4218104662, win 512, options [nop,nop,TS val 1712344939 ecr 1712344938], length 309
15:26:32.270239 IP 主机名.34206 > 主机名.目标服务名: Flags [.], ack 3712383164, win 510, options [nop,nop,TS val 1712344939 ecr 1712344939], length 0
15:26:32.270284 IP 主机名.34206 > 主机名.目标服务名: Flags [F.], seq 4218104662, ack 3712383164, win 512, options [nop,nop,TS val 1712344939 ecr 1712344939], length 0
15:26:32.270504 IP 主机名.目标服务名 > 主机名.34206: Flags [F.], seq 3712383164, ack 4218104663, win 512, options [nop,nop,TS val 1712344939 ecr 1712344939], length 0
15:26:32.270512 IP 主机名.34206 > 主机名.目标服务名: Flags [.], ack 3712383165, win 512, options [nop,nop,TS val 1712344939 ecr 1712344939], length 0

前三行可忽略

dropped privs to tcpdump:权限降级(从 root 权限降级到tcpdump 用户权限,减少安全风险,即使 tcpdump 被攻击,攻击者也只能获得有限权限)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode:提示当前 tcpdump 只显示基本信息以提高性能,并未输出详细信息,使用-v,-vv可输出完整信息
listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes:监听所有网络接口,链路类型为 Linux cooked v1 格式,每个数据包捕获的最大字节数(256KB)(262144/1024 = 256) 

第四行开始,三次握手开始:

Client端   Server端
SYN标志位,seq=4218104573 ->  
  <- SYN标志位,ACK标志位,seq=3712382854, ack =Client.seq+1=4218104574 
ACK标志位,ack=Server.seq+1=3712382855 ->  

中间是发送数据

Client端   Server端 
 PUSH标志位,ACK标志位,seq:4218104574:4218104662,88字节
(请求信息)
->   
   <-  PUSH标志位,ACK标志位,seq:3712382855:3712383164,309字节
(回复信息)
ACK标志位,ack=3712383164
(确认信息,已收到服务器发送的所有数据)
->  

Client端向Server端发送数据,TCP载荷部分(88字节):

GET /1.txt HTTP/1.1\r\n     (21 bytes)
Host: **.***.**.***:10005\r\n (29 bytes)
User-Agent: curl/7.61.1\r\n (25 bytes)
Accept: */*\r\n (13 bytes)

Server端回复数据,TCP载荷部分(309字节):

HTTP/1.1 200 OK\r\n										(17 bytes)
Content-Length: 4\r\n (19 bytes)
Content-Disposition: inline; filename="1.txt"\r\n (47 bytes)
Accept-Ranges: bytes\r\n (22 bytes)
ETag: "efd2d032d82a6f34d448f5124fbe835d598f3b5b"\r\n (50 bytes)
Content-Type: text/plain; charset=utf-8\r\n (41 bytes)
Vary: Accept-Encoding\r\n (23 bytes)
Date: Tue, 19 Aug 2025 02:42:03 GMT\r\n (37 bytes)
Connection: keep-alive\r\n (24 bytes)
Keep-Alive: timeout=5\r\n (23 bytes)
\r\n (2 bytes)
test (4 bytes)

第10行开始,四次挥手开始(TCP协议的优化机制,合并挥手)

Client端   Server端
 FIN标志位,ACK标志位,seq=4218104662, ack=3712383164
第一次挥手 - 客户端主动发起关闭连接请求
【TCP FIN包通常会包含ACK标志来确认对方的数据】)
->  
  <-  FIN标志位,ACK标志位,seq=3712383164,ack=Client.seq +1=4218104663
第二次和第三次挥手的合并 - 服务器确认客户端的关闭请求,同时发起自己的关闭请求)
 ACK标志位,ack=3712383165
第四次挥手 - 客户端确认服务器的关闭请求
<-  

详细说明示例如下:

15:26:32.268914 IP 主机名.34206 > 主机名.目标服务名: Flags [S], seq 4218104573, win 65495, options [mss 65495,sackOK,TS val 1712344938 ecr 0,nop,wscale 7], length 0

数据包捕获的时间(小时:分钟:秒.微秒) 网络协议类型(IPv4) 源主机和端口 从源到目标 目标主机和端口 SYN 标志位(TCP 连接请求【三次握手的第一步】) TCP 序列号(标识数据包在数据流中的位置【0-4294967295(32位)】) 接收窗口大小 65495字节 TCP选项 [Maximum Segment Size(最大段大小)65495 字节 Selective Acknowledgment OK(选择性确认允许)【支持选择性确认机制,提高重传效率】 Timestamp Value(时间戳值) Echo Reply(回显应答)0【因为此时是第一次client->server,所以没有server回复的时间戳值,此时为默认值0】 No Operation(无操作)【填充字段,用于对齐选项,无意义】 Window Scale(窗口缩放因子)7(表示窗口大小乘以 2^7 = 128)【扩展窗口大小,支持更大的接收窗口】 ]

标志 全称 含义 十六进制值 作用
S SYN Synchronize 0x02 建立连接(三次握手开始)
F FIN Finish 0x01 释放连接(正常关闭)
R RST Reset 0x04 强制断开连接(异常关闭)
P PSH Push 0x08 推送数据(立即传送)
. ACK Acknowledge 0x10 确认收到数据
U URG Urgent 0x20 紧急指针有效

                       

标志组合 含义 典型场景
[S] SYN 连接请求(第一次握手)
[S.] SYN-ACK 连接确认(第二次握手)
[.] ACK 确认包(第三次握手完成)
[P.] PSH-ACK 推送数据包
[F.] FIN-ACK 连接终止请求
[R] RST 连接重置
[R.] RST-ACK 带确认的连接重置
注意:
1. 第三次握手时,与网上一些博客不一样(第一次是seq=x,第二次seq=y,第三次是seq=x+1)原因是因为,在第三次握手时,客户端发送的是一个纯 ACK 包,不携带任何数据,因此它的序列号不会递增 
2. 第一次挥手时,与网上一些博客不一样(第一次挥手发送FIN),当发送FIN包时,必须同时确认之前接收到的数据,(TCP协议的规范要求),确保连接状态的一致性。即使之前已经发送过ACK,FIN包中仍需要包含最新的确认信息
3. 目标服务名:使用10005端口启动的应用,在tcpdump中默认显示的不是端口,是服务名,比如其为***,那么如何根据***找到其对应的端口?
getent services ***

4. 34206端口:临时端口(Linux系统通常将 32768-60999 或 32768-65535 范围内的端口作为临时端口),当客户端发起TCP连接时,操作系统会自动分配一个未被使用的临时端口,标识客户端的特定连接。每个新的TCP连接都会分配不同的临时端口

 

tcpdump linux 抓包 - 三次握手 四次挥手的更多相关文章

  1. [转]Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解

    一.Linux服务器上11种网络连接状态: 图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1.TCP三次握手;2.数据传送;3.TCP四次挥手. 注:以下说明最好能结合”图:T ...

  2. [na]TCP的三次握手四次挥手/SYN泛洪

    1.TCP报文格式 上图中有几个字段需要重点介绍下: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记. (2)确认序号:Ack序号,占32位, ...

  3. 在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP

    如果对网络工程基础不牢,建议通读<细说OSI七层协议模型及OSI参考模型中的数据封装过程?> 下面就是TCP/IP(Transmission Control Protoco/Interne ...

  4. 救救孩子吧,到现在还搞不懂TCP的三次握手四次挥手

    本文在个人技术博客同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩...   前几天发了一个朋友圈,发现暗恋已久的女生给我点了个赞,于是我当晚辗转反侧.彻 ...

  5. TCP/IP三次握手四次挥手

    本文通过图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道.如图所示,给出了TCP通信过程的示意图. TCP 三次握手四次挥手 主要包括三部 ...

  6. 网络 TCP三次握手,四次挥手详解

    三次握手,四次挥手可以说是炙手可热的面试题了,来看看它究竟长什么样子吧! 我们先把流程图贴上来 : 为什么这么复杂? 因为TCP是可靠性传输. 确认可靠传输的前提:  TCP连接管理机制 用TCP首部 ...

  7. TCP/IP协议 | TCP协议 | UDP协议 | 三次握手四次挥手

    TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP.SMTP.TCP.UDP.IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP ...

  8. tcp,udp tcp三次握手四次挥手,基于套接字进行简单通信

    1.应用层: 应用层功能:规定应用程序的数据格式. 例:TCP协议可以为各种各样的程序传递数据,比如Email.WWW.FTP等等.那么,必须有不同协议规定电子邮件.网页.FTP数据的格式,这些应用程 ...

  9. TCP协议—三次握手四次挥手的原理<转>

    三次握手四次挥手的原理   TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.在TCP/IP协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的.三 ...

  10. python摸爬滚打之----tcp协议的三次握手四次挥手

    TCP协议的三次握手, 四次挥手 三次握手过程 1, 服务器时刻准备接受客户端进程的连接请求, 此时服务器就进入了LISTEN(监听)状态; 2, 客户端进程然后向服务器发出连接请求报文, 之后客户端 ...

随机推荐

  1. 面试题-Thread.sleep(0)的作用是什么

      就是线程等待的意思.由于Java采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到CPU控制权的情况,为了让某些优先级比较低的线程也能获取到CPU控制权,可以使用Thread.sleep( ...

  2. REVM移植小记

      之前做过的一些部署移植的工作,基本都是用C++语言写的,在后来我学了一些Rust,并且慢慢熟悉了Rust的工具链,最近也在尝试部署一些Rust的开源项目到OpenEuler RISC-V操作系统上 ...

  3. AtCoder Beginner Contest 341-F

    AtCoder Beginner Contest 341-F F - Breakdown Problem 给你一个由 \(N\) 个顶点和 \(M\) 条边组成的简单无向图.每个顶点拥有权重\(W_i ...

  4. 布局控件:Grid和StackPanel

    布局控件:Grid和StackPanel 本文同时为b站WPF课程的笔记,相关示例代码 一个窗口顶上的部分叫做非客户区,下面的部分叫做客户区域.非客户区域主要就是一个Title和三个窗口样式按钮.我们 ...

  5. 【语义分割专栏】3:Segnet实战篇(附上完整可运行的代码pytorch)

    目录 前言 Segnet全流程代码 模型搭建(model) 数据处理(dataloader) 评价指标(metric) 训练流程(train) 模型测试(test) 效果图 结语 前言 Segnet原 ...

  6. PVE折腾笔记 (2) 挂载之前在QNAP里使用的硬盘

    前言 在上一篇文章中,我们已经完成了 PVE 系统的安装 接下来做的就是在 PVE 里读取之前 QNAP 使用的硬盘里的数据 去除 RAID 标记(可选) 我没有启用 QNAP 的 RAID 功能,是 ...

  7. 零基础学习CAE——Hypermesh的使用技巧

    Hypermesh是一款强大的有限元前后处理软件,用于建模.网格划分.后处理和优化分析.以下是一些Hypermesh使用技巧: 1. 界面布局:在开始使用Hypermesh之前,可以调整界面布局以适应 ...

  8. 在centos7等旧版linux上用国内源下载源码编译安装gcc并配置环境变量

    原文永久链接:https://forum.piwind.com/d/23-zai-centos7deng-jiu-ban-linuxshang-yong-guo-nei-yuan-xia-zai-yu ...

  9. 长亭雷池WAF(safeline)社区版安装教程

    雷池WAF的技术文档,并不包含 Docker 和 Docker Compose V2 安装文档,更新记录一下,共同学习,共同进步 配置需求 操作系统:Linux 指令架构:x86_64 软件依赖:Do ...

  10. C# winform 打开设计时,也会执行编写的代码,

    if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv")//判断是否为设计时 { re ...