2

うまく説明できない問題に直面しています。

36 バイトの「通知」パケットを送信し、36 バイトの「確認」パケットを予期するシステムへのインターフェイスを構築しています。

36 バイトのペイロードは 16 進数の文字列 (72 文字) で、これを使用して「解凍」しbin2hex()、解析して、変更が必要な値を特定し、 を使用して再パックしpack()ます。

を使用するsocket_sendto()と、送信パケットの UDP チェックサムが不正であることが tcpdump に示されます。

これが私が使用しているコードのサンプルです。これは、最初のパケットのペイロードを 16 進文字列に変換するだけです。

<?php

    $socket      = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    $local_host  = '<source ip>';
    $local_port  = '5858';
    $remote_host = '';
    $remote_port = '';

    socket_bind($socket, $local_host, $local_port) or die('Could not bind to address');

    echo "running...\n";

    while(true)
    {
        socket_recvfrom($socket, $input_buffer, 64, 0, $remote_host, $remote_port);

        $hex_string = bin2hex($input_buffer);

        // assume that I'd parse and modify $hex_string here.
        // for this post, I'm just going to repack the same string.

        $new_packet = pack("H*", $hex_string);
        if($input_buffer === $new_packet) { echo "inbound/outbound contents match\n"; }

        $socket2 = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
        socket_sendto($socket2, $new_packet, strlen($new_packet), 0, $remote_host, $local_port);
        echo "sent\n\n";
    }

そして、tcpdump出力で得ているのは...

(remote ip).1144 > (local ip).5858: [udp sum ok] UDP, length 36
(local ip).35572 > (remote ip).5858: [bad udp cksum 0x37a1 -> 0xaf02!] UDP, length 36

なぜこれが起こっているのか、誰かが光を当てることができますか?

4

1 に答える 1

0

これは、TCP/UDP チェックサムが NIC にオフロードされているために発生します。詳細については、このページを参照してください。また、エラーを抑制するこのオプションを無効にするために使用できるコマンドも参照してください。

于 2013-06-19T22:06:36.967 に答える