2017-04-17 3 views
0

私は、私はここに を把握することはできません小さな問題は、私が何をやったかが存在しているの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チェックサムを無視してください)

答えて

0

これは、タップデバイスを開くときのフラグの設定に似ています。

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.txt

ちょうどあなたのインターフェイスフラグにIFF_NO_PIを追加し、デバイスドライバは、主要な4つのバイトを剥ぎ取ることはありません。

関連する問題