0228-TCP 的标记和选项
环境
- Time 2022-11-24
- WSL-Ubuntu 22.04
- Rust 1.65.0
- pnet 0.31.0
- tun-tap 0.1.3
前言
说明
参考:https://docs.rs/pnet/latest/pnet/index.html
参考:https://www.cnblogs.com/lshs/p/6038494.html
目标
了解 TCP 协议头中的 flags 和 options 字段的含义。
main.rs
use pnet::packet::ip::IpNextHeaderProtocols;
use pnet::packet::{ipv4::Ipv4Packet, tcp::TcpPacket};
use tun_tap::{Iface, Mode};
fn main() -> std::io::Result<()> {
let iface = Iface::without_packet_info("tun0", Mode::Tun)?;
let mut buffer = vec![0; 1500];
loop {
let _size = iface.recv(&mut buffer)?;
let packet = Ipv4Packet::new(&buffer).unwrap();
if packet.get_version() == 6 {
println!("IPv6 packet, continue");
continue;
}
if packet.get_next_level_protocol() != IpNextHeaderProtocols::Tcp {
println!("not tcp packet, continue");
continue;
}
// 因为头部长度的单位是 4 字节
let length = packet.get_header_length() as usize * 4;
let packet = TcpPacket::new(&buffer[length..]).unwrap();
// 000000010,从右往左算常见的标志
// 第 1 位 FIN,断开连接请求
// 第 2 位 SYN,请求握手,当前请求就是 SYN 连接建立请求
// 第 3 位 RST,拒绝连接
// 第 5 位 ACK,确认报文
println!("flags {:09b}", packet.get_flags());
// 2 字节的窗口大小
println!("window {}", packet.get_window());
for option in packet.get_options() {
// 2 代表 MSS,最大段长度,4 表示,总共 4 字节,后面的表示 1460
// TcpOptionNumber(2), length: [4], data: [5, 180]
// 4 代表可选确认允许,可以从参考资料获取详情
// TcpOptionNumber(4), length: [2], data: []
// timestamp 字段,可以从参考资料获取详情
// TcpOptionNumber(8), length: [10], data: [189, 18, 113, 31, 0, 0, 0, 0]
// 填充
// TcpOptionNumber(1), length: [], data: []
// 3 表示窗口扩大,7 表示将窗口左移 7 位,即乘以 128
// TcpOptionNumber(3), length: [3], data: [7]
println!("options {:?}", option);
}
}
}
程序输出
flags 000000010
window 64240
options TcpOption { number: TcpOptionNumber(2), length: [4], data: [5, 180] }
options TcpOption { number: TcpOptionNumber(4), length: [2], data: [] }
options TcpOption { number: TcpOptionNumber(8), length: [10], data: [189, 18, 113, 31, 0, 0, 0, 0] }
options TcpOption { number: TcpOptionNumber(1), length: [], data: [] }
options TcpOption { number: TcpOptionNumber(3), length: [3], data: [7] }
Wireshark
总结
了解了 TCP 协议中的 flags 字段和 options 字段常见的值的意思。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2020-08-14 【JavaScript】Object 实例方法