开张:SYN/ACK 博客与写作指南
为什么要写这个博客,以及本站支持的 Markdown 扩展语法——时序图、协议头位域图、提示块,一次讲清楚。
- DATE
- LEN
- 429 字
- TTL
- 1 min
- LAYER
- notes · 随笔
你好,这里是 SYN/ACK。
TCP 建立连接时,客户端先发出 SYN,服务端回应 SYN/ACK——“我收到了你的请求,同时也向你发出我的请求”。这个博客也想做同样的事:把我学习网络协议分析过程中的笔记、实验和思考发出去,也希望收到你的回应。
为什么写博客
学协议最怕“看懂了”的错觉。RFC 读一遍觉得都明白,真打开 Wireshark 面对一屏报文,还是会卡在某个字段上。写博客逼着我做三件事:
- 亲手抓包:每篇文章尽量配一次可复现的实验;
- 逐字节解释:不放过任何一个看不懂的字段;
- 说人话:如果不能用简单的话讲清楚,说明还没真正理解。
本站的 Markdown 扩展
下面这些是这个博客专门为“协议分析”准备的写法,写文章时直接用即可。
1. 报文时序图 seq
用 ```seq 代码块描述报文交互,构建时会自动渲染成 SVG,进入屏幕时还会有“逐条发包”的动画:
```seq
title: 示例:一次 HTTP 请求
Client -> Server: SYN
Server -> Client: SYN, ACK
Client -> Server: ACK
== 连接建立 ==
Client -> Server: GET /index.html
Server --> Client: HTTP/1.1 200 OK
Client -x Server: 重传前丢失的 ACK
note Server: 等待超时重传
```
效果如下:
语法规则:
| 写法 | 含义 |
|---|---|
A -> B: 文本 | 实线箭头(普通报文) |
A --> B: 文本 | 虚线箭头(响应 / 数据) |
A -x B: 文本 | 丢包(箭头中途断开) |
== 文本 == | 阶段分隔线 |
note A: 文本 | 在 A 的生命线上加注释 |
participants: A, B, C | 指定参与者顺序(可选) |
2. 协议头位域图 packet
用 ```packet 代码块画出 RFC 风格的协议头,鼠标悬停在字段上可以看到比特范围:
```packet
title: UDP Header (RFC 768)
0-15: Source Port
16-31: Destination Port
32-47: Length
48-63: Checksum
...: Data
```
012345678910111213141516171819202122232425262728293031
Source Port16
Destination Port16
Length16
Checksum16
Data
起始位-结束位: 字段名,单个比特写成位: 字段名;- 默认每行 32 bit,可以用
bits: 16修改(DNS 头部就习惯画成 16 位宽); ...: 名称表示可变长度的整行字段。
3. 提示块
> [!NOTE]
> 普通笔记
> [!TIP] 自定义标题
> 小技巧
> [!WARNING]
> 注意事项
笔记
普通笔记,适合补充背景知识。
抓包小技巧
用 tcpdump -w 保存成 pcap 文件,再拖进 Wireshark 慢慢看。
重点
重点内容。
注意
注意事项,比如“这个字段在不同 RFC 中含义不同”。
警告
警告:只在你有权限的网络和主机上做扫描、注入类实验。
4. 代码高亮
代码块写上语言名即可,右上角自带复制按钮:
from scapy.all import IP, TCP, sr1
syn = IP(dst="192.0.2.10") / TCP(dport=443, flags="S")
resp = sr1(syn, timeout=2, verbose=0)
print(resp.summary() if resp else "no response")
sudo tcpdump -i eth0 -nn -w capture.pcap 'tcp port 443'
新建文章
在项目根目录执行:
npm run new -- "文章标题"
会在 src/content/posts/ 下生成一个带好 frontmatter 的 Markdown 文件。frontmatter 字段说明:
title: 文章标题
description: 一句话摘要(显示在列表和搜索结果里)
pubDate: 2026-09-01
layer: L4 # L1~L7 / tools / notes,决定文章归到协议栈的哪一层
tags: [TCP, Wireshark]
protocol: TCP # 首页抓包列表 Protocol 列,缺省取第一个标签
draft: false # true 则不会发布
pinned: false # true 则在首页置顶
好了,连接已建立。开始传数据吧。