私は、私はここに を把握することはできません小さな問題は、私が何をやったかが存在しているのlinuxのTUN/TAPデバイスを勉強しています。get、tapデバイスを作成し、名前を「TAP1」です:生のバイトデータをタップデバイスに送信するときに先頭の4バイトのデータが欠落するのはなぜですか?
1ファイル記述子:
2 tapfd:
3 [2048] BUF::のような、十分に大きなアレイを作製し、それがIP(UDP)パケット、74bytesの合計である内部、BUFにイーサネットフレームを書き込みます。
// 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:同様に、不器用な方法でそれを行う(書き込みを呼び出す)、[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 [email protected]
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
合計= 56bytesの+ 12bytesのMAC SRC & DST + 2バイトETHタイプ= 70バイトなので、先頭の4バイトはどこですか?
最初に、先頭の4バイトが「プリアンブル&フレームデリミタの開始」であるべきだと思っていましたが、wikiのようにプリアンブルは7オクテットで、フレームデリミタの開始は1オクテットでした。
6:その後、私は今、bufが似ている、私の[BUF]に4つのバイトを挿入します。
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ダンプは、それが法的なイーサネットフレームである私に言いました!
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チェックサムを無視してください)