首页 > 其他分享 >0227-TCP 请求报文

0227-TCP 请求报文

时间:2024-08-14 14:04:42浏览次数:7  
标签:字节 get 报文 tun0 packet 0227 length TCP println

环境

  • 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
RFC 793

目标

了解 TCP 协议头中的字段,其也是基于 IP 协议的。

配置 TUN

IP 地址不要和主机的网卡地址在一个段,以便选择这个网卡进行路由。

root@jiangbo12490:~# ip tuntap add tun0 mode tun
root@jiangbo12490:~# ip addr add 192.168.44.144/24 dev tun0
root@jiangbo12490:~# ip link set up dev tun0
root@jiangbo12490:~# ip add show dev tun0
7: tun0: <NO-CARRIER,POINTOPOINT,MULTICAST,NOARP,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 500
    link/none
    inet 192.168.44.144/24 scope global tun0
       valid_lft forever preferred_lft forever

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();

        // 2 字节的源端口
        println!("source {}", packet.get_source());
        // 2 字节的目的端口
        println!("destination {}", packet.get_destination());
        // 4 字节的序列号号
        println!("sequence {}", packet.get_sequence());
        // 4 字节的确认号
        println!("acknowledgement {}", packet.get_acknowledgement());
        // 4 位 TCP 首部长度,单位是 4 字节,最长 60 字节
        println!("data_offset {}", packet.get_data_offset());
        // 3 位的保留位
        println!("reserved {}", packet.get_reserved());
        // 9 位的控制位,标志位
        println!("flags {}", packet.get_flags());
        // 2 字节的窗口大小
        println!("window {}", packet.get_window());
        // 2 字节的校验和
        println!("checksum {}", packet.get_checksum());
        // 2 字节的紧急指针
        println!("urgent_ptr {}", packet.get_urgent_ptr());
        // TCP 20 字节的首部,可以加上最长 40 个字节的选项
        println!("options {:?}", packet.get_options());

        println!("length: {}, {:?}", size, &buffer[..size]);
    }
}

发送 TCP 请求

当想建立连接时,会发起握手请求,发送第一个 TCP 数据包。

root@jiangbo12490:~# nc 192.168.44.244 4444

程序输出

source 35788
destination 4444
sequence 3640119208
acknowledgement 0
data_offset 10
reserved 0
flags 2
window 64240
checksum 41834
urgent_ptr 0
options [TcpOption { number: TcpOptionNumber(2), length: [4], data: [5, 180] }, TcpOption { number: TcpOptionNumber(4), length: [2], data: [] }, TcpOption { number: TcpOptionNumber(8), length: [10], data: [188, 204, 204, 53, 0, 0, 0, 0] }, TcpOption { number: TcpOptionNumber(1), length: [], data: [] }, TcpOption { number: TcpOptionNumber(3), length: [3], data: [7] }]
length: 60, [69, 0, 0, 60, 99, 220, 64, 0, 64, 6, 252, 10, 192, 168, 44, 144, 192, 168, 44, 244, 139, 208, 17, 92, 216, 247, 207, 168, 0, 0, 0, 0, 160, 2, 250, 240, 163, 106, 0, 0, 2, 4, 5, 180, 4, 2, 8, 10, 188, 204, 204, 53, 0, 0, 0, 0, 1, 3, 3, 7]

tcpdump 抓包

root@jiangbo12490:~# tcpdump -A -n -i tun0
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes

20:22:54.371126 IP 192.168.44.144.35788 > 192.168.44.244.4444: Flags [S], seq 3383309069, win 64240, options [mss 1460,sackOK,TS val 3167330987 ecr 0,nop,wscale 7], length 0
E..<q.@[email protected]..,...,....\..3.........x..........
............

其中的 flags 和 options 字段,之后再看。

Wireshark

TCP协议

总结

了解了 TCP 协议的字段,该协议基于 IP 协议。

附录

标签:字节,get,报文,tun0,packet,0227,length,TCP,println
From: https://www.cnblogs.com/jiangbo4444/p/18358863

相关文章

  • 在K8S中,你用的flannel是哪个工作模式及fannel的底层原理如何实现数据报文转发的?
    在Kubernetes(K8S)中,Flannel是一个广泛使用的容器网络接口(CNI)插件,它提供了一种简单而有效的方法来为集群中的每个容器分配网络,并确保它们可以互相通信。Flannel支持多种工作模式来实现数据报文的转发,其中最常见的是VXLAN、UDP和HOST-GW三种模式。1.Flannel的工作模式VXLAN模式:......
  • Modbus Tcp数据通讯实测
    ModbusTCP数据帧ModbusTCP的数据帧可分为两部分:MBAP+PDU。报文头MBAPMBAP为报文头,长度为7字节,组成如下:  帧结构PDUPDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。功能码Modbus的操作对象有四种:线圈、离散输入、保持寄存器、输入寄存器。 ......
  • 0225-ping 请求报文
    环境Time2022-11-20WSL-Ubuntu22.04Rust1.65.0pnet0.31.0tun-tap0.1.3前言说明参考:https://docs.rs/pnet/latest/pnet/index.htmlRFC792目标查看ping请求报文的格式,ping基于IP报文。ping命令ping-Itun0172.24.49.106root@jiangbo12490:~#ping-I......
  • 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协议
       协议规定了双方互相沟通时遵守的规则:一方是否主动握手,鞠躬多深,谁先从门口走过,在路的哪一侧行驶,等等。虽然有些协议是法律强制规定的,比如在路的哪一边行驶,但生活中的大多数协议都不太正式。与之形成鲜明对比的是,网络协议是非常精确地进行规范的。   互联网有很多......
  • 三报文握手经典例题详解
    如图,有如下TCP连接。主机V通过三次握手与主机U建立一个TCP连接1.有三个TCP段(标号为A、B、C) 被传送,请在下面括号中填入各段的SYN标志位、序号(seq)、确认号(ack)段A:  SYN=(  1 ),seq=500段B:  SYN=(  1 ),seq=600,ack=(  501    )段C:  ......
  • 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云游戏服接口未响应请求报文导致,具体......
  • UDP/TCP网络调试助手 NetAssist【调试工具】下载
    链接:https://pan.baidu.com/s/1QgL4XZdKNW39nFe18feBbw?pwd=1122提取码:1122–来自百度网盘超级会员V3的分享接收设置ASCII:以ASCII格式显示接收到的数据。ASCII是一种字符编码标准,用于表示文本数据。HEX:以十六进制格式显示接收到的数据。十六进制显示更适合查看和调试......
  • 【计算机网络】彻底搞懂TCP 的三次握手和四次挥手(超详细,带案例,带图解,带面试题)
    在计算机网络中,TCP(传输控制协议)是一种可靠、有序的数据传输协议。TCP使用三次握手建立连接,四次挥手关闭连接。理解这两个过程对于网络编程和网络协议非常重要。本文将通过详细的文字解析和生动的图示,帮助你彻底搞懂TCP的三次握手和四次挥手。......