前提:
- 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 | -> | | | | |
中间是发送数据
Client端 | | Server端 | PUSH标志位,ACK标志位,seq:4218104574:4218104662,88字节
(请求信息) | -> | | | | | 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标志来确认对方的数据】) | -> | | | server,所以没有server回复的时间戳值,此时为默认值0】 No Operation(无操作)【填充字段,用于对齐选项,无意义】 Window Scale(窗口缩放因子)7(表示窗口大小乘以 2^7 = 128)【扩展窗口大小,支持更大的接收窗口】 ]</p>
[table][tr]标志全称含义十六进制值作用[/tr] | 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中默认显示的不是端口,是服务名,比如其为***,那么如何根据***找到其对应的端口?- 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
复制代码 4. 34206端口:临时端口(Linux系统通常将 32768-60999 或 32768-65535 范围内的端口作为临时端口),当客户端发起TCP连接时,操作系统会自动分配一个未被使用的临时端口,标识客户端的特定连接。每个新的TCP连接都会分配不同的临时端口
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除 |