gpt4 book ai didi

linux - 为什么在将原始字节数据发送到 TAP 设备时前导 4 字节数据丢失?

转载 作者:太空宇宙 更新时间:2023-11-04 12:30:29 25 4
gpt4 key购买 nike

我正在学习 linux 的 tun/tap 设备,有一个小问题我想不通 这是我所做的:

1:创建tap设备,名称为“tap1”,获取文件描述符:tapfd

2:准备一个足够大的数组,如:buf[2048]

3:往buf中写入一个以太网帧,里面是一个ip(udp)数据包,共74bytes。以笨拙的方式完成,例如:

    // mac dst
buf[0] = 0xbb;
buf[1] = 0xaa;
buf[2] = 0xbb;
...
// mac src
buf[6] = 0xaa;
buf[7] = 0xbb;
...
// eth type
...
// ip ver & ip hdr_len
...
...
...
// data offset=42 length=32
buf[42] = 0x61;
...
buf[73] = 0x61

4:调用write(),将上面提到的[74bytes]发送到[tapfd]

    write(fd, buf, 74);

5:使用“tcpdump -i tap1 -vv”查看,结果如下:

    18:06:40.466971 aa:bb:08:00:45:00 (oui Unknown) Unknown SSAP 0x18 > bb:aa:aa:bb:aa:bb (oui Unknown) Unknown DSAP 0x78 Information, send seq 0, rcv seq 0, Flags [Response], length 56
0x0000: 7919 0000 4011 ed95 0a00 0001 0a00 0001 y...@...........
0x0010: 5b25 5f7c 0028 1ae4 6161 6161 6161 6161 [%_|.(..aaaaaaaa
0x0020: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
0x0030: 6161 6161 6161 6161 aaaaaaaa

total = 56bytes + 12bytes mac src&dst + 2bytes eth type = 70 bytes,所以,前导4bytes在哪里?

首先,我认为前导 4 字节应该是“前导码和帧定界符开始”,但正如 wiki 所说,前导码是 7 个八位字节,帧定界符开始是 1 个八位字节。

6:然后我将 4 个字节插入我的 [buf],现在 buf 是这样的:

   buf[0] = 0xab;
buf[1] = 0xab;
buf[2] = 0xab;
buf[3] = 0xcc;
buf = buf + 4;
{ buf[0] ~ buf[73] just as before }


then retry to send 78 bytes to fd

write(fd, buf, 78)

然后再次检查,这一次,tcp dump 告诉我这是一个合法的以太网帧!

    18:13:57.676562 IP (tos 0x0, ttl 64, id 31001, offset 0, flags [none], proto UDP (17), length 60, bad cksum ed95 (->ed96)!)
localhost.23333 > localhost.24444: [bad udp cksum 0x1ae4 -> 0x1ae5!] UDP, length 32

有效!但为什么?为什么前导 4 字节丢失?(请忽略错误的 udp 校验和)

最佳答案

这看起来像是打开您的点击设备时标志配置错误。

Linux tun/tap 内核驱动程序的文档描述了以下帧格式。

3.2 Frame format:
If flag IFF_NO_PI is not set each frame format is:
Flags [2 bytes]
Proto [2 bytes]
Raw protocol(IP, IPv6, etc) frame.

您可以在此处找到更多信息:/usr/src/linux/Documentation/networking/tuntap.rst

只需将 IFF_NO_PI 添加到您的接口(interface)标志中,设备驱动程序就不会去除前 4 个字节。

关于linux - 为什么在将原始字节数据发送到 TAP 设备时前导 4 字节数据丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43449664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com