ホームページ バックエンド開発 PHPチュートリアル PHP の自己構築 IP ヘッダーを使用するにはどうすればよいですか?

PHP の自己構築 IP ヘッダーを使用するにはどうすればよいですか?

Jun 13, 2016 pm 01:21 PM
dns ip quot socket udp

PHP に独自に構築された IP ヘッダーの使用方法を教えてください

PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><?php
//数据
$dns_id = "\x80\xc1";
$dns_flags = "\x01\x00";
$dns_count_queries = "\x00\x01";
$dns_count_answers = "\x00\x00";
$dns_count_auth_rr = "\x00\x00";
$dns_count_add_rr = "\x00\x00";
$dns_qry_name = "\x02\x69\x70\x02\x63\x6e\x00";
$dns_qry_type = "\x00\x01";
$dns_qry_class = "\x00\x01";
$dns = $dns_id . $dns_flags . $dns_count_queries . $dns_count_answers . $dns_count_auth_rr . $dns_count_add_rr . $dns_qry_name . $dns_qry_type . $dns_qry_class;

//IP头
$ip_version = "\x45"; //4位版本
$ip_hdr_len = ""; // 4位首部长度
$ip_dsfield = "\x00"; //8位服务类型
$ip_len = pack('n*',28 + strlen($dns)); //16位总长度
$ip_id = "\x55\xf0"; //16位标识
$ip_flags = "\x00"; //3位标识
$ip_frag_offset = "\x00"; // 13位偏移
$ip_ttl = "\x80"; //8位生存时间
$ip_proto = "\x11"; //8位协议
$ip_src = ipto16("192.168.1.100"); //32位源IP
$ip_dst = ipto16("8.8.4.4"); //32位目的IP
$ip_checksum = ipchecksum($ip_version,$ip_hdr_len,$ip_dsfield,$ip_len,$ip_id,$ip_flags,$ip_frag_offset,$ip_ttl,$ip_proto,$ip_src,$ip_dst); //16位首部效验和
$ip_header = $ip_version . $ip_hdr_len . $ip_dsfield . $ip_len . $ip_id . $ip_flags . $ip_frag_offset . $ip_ttl . $ip_proto . $ip_checksum . $ip_src . $ip_dst;


//UDP头
$udp_srcport = "\xfc\x39"; //16位源端口
$udp_dstport = "\x00\x35"; //16位目的端口
$udp_length = pack('n*',8 + strlen($dns)); //16位UDP长度
$udp_checksum = udpchecksum($ip_src,$ip_dst,$ip_proto,$udp_length,$udp_srcport,$udp_dstport,$dns); //16位UDP效验和
$udp = $udp_srcport . $udp_dstport . $udp_length . $udp_checksum;


//$buf = $ip_header . $udp . $dns;
$buf = $udp . $dns;

function send($host,$port,$buf,$dns_flags)
{
//    $socket = socket_create(AF_INET, SOCK_PACKET, getprotobyname("ip"));
    $socket = socket_create(AF_INET, SOCK_RAM,1);
    $timeout = array('sec'=>1,'usec'=>500000);
//    socket_set_option($socket,IPPROTO_IP,IP_HDRINCL,SO_RCVTIMEO,$timeout);
    socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,$timeout);
//    while(1)
        socket_sendto($socket, $buf, strlen($buf), 0, $host, $port);
}

function udpchecksum($ip_src,$ip_dst,$ip_proto,$udp_length,$udp_srcport,$udp_dstport,$dns)
{
    $data = $ip_src . $ip_dst . "\x00" . $ip_proto . $udp_length . $udp_srcport . $udp_dstport . $udp_length . "\x00\x00" . $dns;
    if (strlen($data)%2)
    $data .= "\x00";
    $bit = unpack('n*', $data);
    $sum = array_sum($bit);
    while ($sum >> 16)
        $sum = ($sum >> 16) + ($sum & 0xffff);
    return pack('n*', ~$sum);
}

function ipchecksum($ip_version,$ip_hdr_len,$ip_dsfield,$ip_len,$ip_id,$ip_flags,$ip_frag_offset,$ip_ttl,$ip_proto,$ip_src,$ip_dst)
{
    $data = $ip_version . $ip_hdr_len . $ip_dsfield . $ip_len . $ip_id . $ip_flags . $ip_frag_offset . $ip_ttl . $ip_proto . "\x00\x00" . $ip_src . $ip_dst;
    $bit = unpack('n*', $data);
    $sum = array_sum($bit);
    while ($sum >> 16)
        $sum = ($sum >> 16) + ($sum & 0xffff);
    return pack('n*', ~$sum);
}

function ipto16($ip)
{
    $tmp = explode(".",$ip);
    $ip = "";
    foreach($tmp as $a => $b)
    {
        $tmp = dechex($b);
        if (strlen($tmp)==1)
            $tmp = "0" . $tmp;
        $ip .= $tmp;
    }
    $ip = pack("h*",$ip);
    return $ip;
}

send("8.8.4.4",53,$buf,$dns_flags);





ログイン後にコピー


これは、指定された DNS サーバーに指定されたドメイン名の IP 情報を問い合わせるプログラムですWireshark パケット キャプチャでテストできますが、ここでは独自のネットワーク層、つまり IP ヘッダーを使用しません。
put
$buf = $ip_header . $dns;
//$buf . $dns;
$buf = $udp;
に変更されました。 = $udp . $dns;
結果はまだ機能しません。send 関数の問題について、修正方法を教えてください


----- -解決策------------------ 何をしているのか分かりませんか? sock パケットの使用はユーザー レベルで行う必要があります
カプセル化された IP は次の層で行う必要があります

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

win11のDNSサーバーエラーの解決方法 win11のDNSサーバーエラーの解決方法 Jan 10, 2024 pm 09:02 PM

インターネットにアクセスするには、インターネットに接続するときに正しい DNS を使用する必要があります。同様に、間違った DNS 設定を使用すると、DNS サーバー エラーが発生しますが、このときは、ネットワーク設定で DNS を自動的に取得するように選択することで問題を解決できます。ソリューション。 win11 ネットワーク dns サーバー エラーを解決する方法. 方法 1: DNS をリセットする 1. まず、タスクバーの [スタート] をクリックして入力し、[設定] アイコン ボタンを見つけてクリックします。 2. 次に、左側の列の「ネットワークとインターネット」オプションコマンドをクリックします。 3. 次に、右側で「イーサネット」オプションを見つけ、クリックして入力します。 4. その後、DNSサーバーの割り当ての「編集」をクリックし、最後にDNSを「自動(D)」に設定します。

Web サイトは、nginx を通じてブラック/ホワイトリスト IP 制限や国および都市の IP アクセス制限をどのように設定しますか? Web サイトは、nginx を通じてブラック/ホワイトリスト IP 制限や国および都市の IP アクセス制限をどのように設定しますか? Jun 01, 2023 pm 05:27 PM

1. ブラック/ホワイト リストの IP 制限付きアクセス設定 nginx ブラック リストとホワイト リストを設定するにはいくつかの方法がありますが、ここでは一般的に使用される 2 つの方法のみを紹介します。 1. 最初の方法:allow、denydeny、およびallow命令はngx_http_access_moduleに属しており、nginxはデフォルトでこのモジュールをロードするため、直接使用できます。この方法は最も単純で直接的です。この設定はファイアウォールの iptable に似ています。使用方法: 構成ファイルに直接追加します: #Whitelist 設定の後に、アクセス可能な許可 IPlocation/{allow123.13.123.12;allow23.53.32.1/100;denyall;}#ブラックリスト設定、

Windows 10/11で1枚のLANカードに複数のIPアドレスを割り当てる方法 Windows 10/11で1枚のLANカードに複数のIPアドレスを割り当てる方法 May 30, 2023 am 11:25 AM

場合によっては、1 つの LAN カードに複数のアドレスを割り当てる必要があります。たとえば、一意の IP アドレスで複数の Web サイトを実行する必要がある場合や、アプリケーションを異なる IP アドレスにバインドする必要がある場合などです。 1 つのネットワーク インターフェイス カードまたは LAN カードに複数のアドレスを割り当てる方法を考えている場合は、この記事がそれを実現するのに役立ちます。以下の手順を最後まで実行すれば完了です。それでは始めましょう! 1 つの LAN カードに複数の IP アドレスを割り当てる ステップ 1: Windows + R キーを同時に使用して実行プロンプトを開き、「ncpa.cpl」と入力し、Enter キーを押して「ネットワーク接続」ウィンドウを開きます。ステップ 2: ネットワーク アダプタの [イーサネット] または [WiFi] オプションを右クリックし、[プロパティ] をクリックします。ステップ 3: [プロパティ] ウィンドウから

修正: Windows 11 で DNS サーバーが応答しない問題 修正: Windows 11 で DNS サーバーが応答しない問題 Jun 01, 2023 pm 04:52 PM

Windows ユーザーは、システム上のブラウザで Web ページを参照したり読み込んだりできない場合、この問題を引き起こす可能性のあるすべての要因を思いつきます。多くの Windows ユーザーはシステム上でこの問題を解決していますが、「DNS サーバーが応答していません」というエラー メッセージが表示され、安定したインターネット接続を使用するためにこの問題を解決する方法がわかりません。この記事では、この問題を確実に解決する解決策を考え出しました。ただし、事前にこれらの解決策を試してください。ルーターを再起動して、これが問題の原因であるかどうかを確認してください。ブラウザのアプリケーションを変更します。ただし、Microsoft Edge ブラウザを使用している場合は、それを閉じて Google を開きます。

e からの NameResolutionError(self.host, self, e) の理由とその解決方法 e からの NameResolutionError(self.host, self, e) の理由とその解決方法 Mar 01, 2024 pm 01:20 PM

エラーの理由は、urllib3 ライブラリの例外タイプである NameResolutionError(self.host,self,e)frome です。このエラーの理由は、DNS 解決が失敗したこと、つまり、ホスト名または IP アドレスが試みられたことです。解決できるものが見つかりません。これは、入力された URL アドレスが間違っているか、DNS サーバーが一時的に利用できないことが原因である可能性があります。このエラーを解決する方法 このエラーを解決するにはいくつかの方法があります。 入力された URL アドレスが正しいかどうかを確認し、アクセス可能であることを確認します。 DNS サーバーが利用可能であることを確認します。コマンド ラインで「ping」コマンドを使用してみてください。 DNS サーバーが利用可能かどうかをテストします。プロキシの背後にある場合は、ホスト名の代わりに IP アドレスを使用して Web サイトにアクセスしてみてください。

PHP および UDP プロトコルを使用して非同期通信を実装する方法 PHP および UDP プロトコルを使用して非同期通信を実装する方法 Jul 30, 2023 pm 07:31 PM

PHP および UDP プロトコルを使用して非同期通信を実装する方法 最新のインターネット アプリケーションでは、非同期通信は非常に重要な方法となっています。非同期通信を使用すると、メインスレッドをブロックすることなくユーザーリクエストを同時に処理できるため、システムのパフォーマンスと応答速度が向上します。人気のバックエンド プログラミング言語である PHP は、UDP プロトコルを使用して非同期通信を実現する方法を教えてください。この記事では、PHP で UDP プロトコルを使用して簡単な非同期通信を実装する方法を、具体的なコード例を添付して紹介します。 1. UDP プロトコルの概要 U

Linux で DNS キャッシュを表示および更新する方法 Linux で DNS キャッシュを表示および更新する方法 Mar 07, 2024 am 08:43 AM

DNS (DomainNameSystem) は、ドメイン名を対応する IP アドレスに変換するためにインターネットで使用されるシステムです。 Linux システムでは、DNS キャッシュはドメイン名と IP アドレス間のマッピング関係をローカルに保存するメカニズムです。これにより、ドメイン名解決の速度が向上し、DNS サーバーの負担が軽減されます。 DNS キャッシュを使用すると、システムはその後同じドメイン名にアクセスするときに、毎回 DNS サーバーにクエリ要求を発行する必要がなく、IP アドレスを迅速に取得できるため、ネットワークのパフォーマンスと効率が向上します。この記事では、Linux で DNS キャッシュを表示および更新する方法、関連する詳細およびサンプル コードについて説明します。 DNS キャッシュの重要性 Linux システムでは、DNS キャッシュが重要な役割を果たします。その存在

Win11 暗号化 DNS の詳細なチュートリアル Win11 暗号化 DNS の詳細なチュートリアル Dec 25, 2023 am 10:13 AM

Microsoft は以前、win11 用の DNS 暗号化サービスを提供していましたが、多くのユーザーは win11 の暗号化された DNS の使用方法を知りません。実際には、ネットワーク設定で DNS 設定を開くだけで済みます。 win11 暗号化 DNS に関する詳細なチュートリアル: 1. まずディスクに入り、暗号化するフォルダーを見つけます。 2. 次に、右側の「イーサネット」を開きます。 3. 次に、下の DNS サーバーの割り当てを見つけて、「編集」をクリックします。 4. 「自動 (DHCP)」を「手動」に変更した後、下の「IPv4」を開きます。 5. オンにしたら、優先 DNS に「8.8.8.8」と入力します。 6. 次に、優先 DNS 暗号化を「暗号化のみ (HTTPS 経由の DNS)」に変更します。 7. 変更が完了したら、「保存」をクリックすると、

See all articles