首页 > 其他分享 >0228-TCP 的标记和选项

0228-TCP 的标记和选项

时间:2024-08-14 14:20:08浏览次数:14  
标签:0228 选项 get packet length TCP TcpOptionNumber data options

环境

  • 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标志

总结

了解了 TCP 协议中的 flags 字段和 options 字段常见的值的意思。

附录

标签:0228,选项,get,packet,length,TCP,TcpOptionNumber,data,options
From: https://www.cnblogs.com/jiangbo4444/p/18358867

相关文章

  • 0230-TCP 发送和接收
    环境Time2022-11-25WSL-Ubuntu22.04Rust1.65.0前言说明参考:https://doc.rust-lang.org/std/net/struct.TcpListener.html目标之前认识了TCP报文头,这里去除报文头的细节,直接通信。main.rsTCP由标准库直接支持,可以直接使用。连接上去后,服务器返回一个hello。us......
  • 0227-TCP 请求报文
    环境Time2022-11-24WSL-Ubuntu22.04Rust1.65.0pnet0.31.0tun-tap0.1.3前言说明参考:https://docs.rs/pnet/latest/pnet/index.htmlRFC793目标了解TCP协议头中的字段,其也是基于IP协议的。配置TUNIP地址不要和主机的网卡地址在一个段,以便选择这个网卡进行......
  • 编写一个程序,打开和读取一个文本文件,并统计文件中每个单词出现的次数。用改进的二叉查
    /编写一个程序,打开和读取一个文本文件,并统计文件中每个单词出现的次数。用改进的二叉查找树存储单词及其出现的次数。程序在读入文件后会提供一个有三个选项菜单。第一个选项是列出所有的单词和出现的次数。第二个选项是让用户输入一个单词,程序报告该单词在文件中出现的次数。......
  • Modbus Tcp数据通讯实测
    ModbusTCP数据帧ModbusTCP的数据帧可分为两部分:MBAP+PDU。报文头MBAPMBAP为报文头,长度为7字节,组成如下:  帧结构PDUPDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。功能码Modbus的操作对象有四种:线圈、离散输入、保持寄存器、输入寄存器。 ......
  • springboot集成integration-ip搭建TCP Client
    1、创建客户端属性类tcp:client:host:127.0.0.1port:5001@Data@ConfigurationProperties("tcp.client")publicclassTcpClientProperties{privateStringhost;privateIntegerport;}2、集成integration-ip配置@Slf4j@Configuration@......
  • 带你全新理解TCP/IP协议
       协议规定了双方互相沟通时遵守的规则:一方是否主动握手,鞠躬多深,谁先从门口走过,在路的哪一侧行驶,等等。虽然有些协议是法律强制规定的,比如在路的哪一边行驶,但生活中的大多数协议都不太正式。与之形成鲜明对比的是,网络协议是非常精确地进行规范的。   互联网有很多......
  • docker之pull失败。error pulling image configuration: download failed after attem
    一、问题描述docker部署完成后,想pull项目,但是就是报错:errorpullingimageconfiguration:downloadfailedafterattempts=6:dialtcp108.160.170.26:443:connect:connectionrefused, 更奇葩的是执行dockersearchhello-world是可以的。二、解决问题1)问题分析:看报......
  • 记一次TCP请求游戏服接口偶发超时问题处理:Linux内核网络参数调优
    记一次TCP请求游戏服接口偶发超时问题处理:Linux内核网络参数调优原创 国文 三七互娱技术团队  2024年07月08日18:00 广东 听全文01问题现象A云主机公网访问B云游戏服的一个接口出现偶发超时的问题。02问题原因经抓包定位到B云游戏服接口未响应请求报文导致,具体......
  • (111)vivado综合选项--->(11)Vivado综合策略十一
    1目录(a)IC简介(b)数字IC设计流程(c)Verilog简介(d)Vivado综合策略十一(e)结束1IC简介(a)在IC设计中,设计师使用电路设计工具(如EDA软件)来设计和模拟各种电路,例如逻辑电路、模拟电路、数字信号处理电路等。然后,根据设计电路的规格要求,进行布局设计和布线,确定各个电路元件的位置和连......
  • (112)vivado综合选项--->(12)Vivado综合策略十二
    1目录(a)IC简介(b)数字IC设计流程(c)Verilog简介(d)Vivado综合策略十二(e)结束1IC简介(a)在IC设计中,设计师使用电路设计工具(如EDA软件)来设计和模拟各种电路,例如逻辑电路、模拟电路、数字信号处理电路等。然后,根据设计电路的规格要求,进行布局设计和布线,确定各个电路元件的位置和连......