Httpリクエストの背後にある秘密の詳細な分析(オン)

序文

私たちは長い間ブラウザを使用してきましたが、インターフェイス応答へのURLの入力の背後で何が起こったのか知っていますか?なぜwww.baidu.comにアクセスし、Baiduのアドレスを探していることがわかっているのですか?Enterキーを押した後にhttpリクエストがトリガーされることは誰もが知っていますが、httpリクエストとは何ですか?なぜデータをリクエストできるのですか?プログラマーとして、私たちが住んでいるオンラインの世界を探求し、理解しているので、それはまだ非常に良いと思います

スペースに限りがあるため、詳細を明確にすることはできませんので、普段接している内容を分析してみてください。理解する必要のないことを簡単に説明します。同時に、情報を入手するという個人の目的に応じて、まずHttpリクエストのプロセス全体を簡単に要約し、次に具体的な分析と説明を行います。みなさん、自分の時間と目的に応じて、記事全体を読む必要があるかどうか、それがあなたにとって役立つのであれば、3回続けてクリックすることを忘れないでください〜

概要概要

URLを入力するか、リンクをクリックしてから、最終的にWebサーバーから返されたメッセージを受信して​​表示するには、次のプロセスに大別されます。

  1. HTTPリクエストを解析します;
  2. HTTP接続を作成します;
  3. 送信と応答を要求します。
  4. 切断します。

各プロセスで何が起こったかの詳細な説明から始めましょう。この記事では、次の記事のステップ1、2、およびステップ3と4の分析に焦点を当てます。

説明する前に、私たちの周りの例について話しましょう。

誰かに手紙を送りたいのですが、どうすればいいのでしょうか。まず、どこに誰に送るかを知っておく必要があります。これが最も基本的な問題ですが、実際にはどうすればよいですか。私たちはこの住所を決定しますか?これがどこにあるかを誰もが知っていることを確認できますか?次に、XXX地区、XXX市、XXX州などの標準化されたアドレスが必ず必要ですが、特定のマクロの場所しかわからない場合はどうでしょうか。たとえば、XXXの会社ですが、特定の家番号がわからない場合はどうすればよいですか?次に、手紙を送るときに、Baiduの下にある特定の番地を明確にしてから書くか、住所を入力すると郵便局のスタッフが自動的にどの番地と番地を見つけるかを決定します。場所や宛先を明確にした後、我々は書くことができます手紙の内容を、その後にそれを入れ封筒、そして最後にそれを提出する郵便局この時点で、手紙の送信は終了しました。返信を待つだけです。

そんなに言っても、少し戸惑うかもしれませんが、これとネットワークリクエストの送信との間に何か関係はありますか?ゆっくり話させてください。

1つは、HTTPリクエストを解析する

この記事を書く前に、httpリクエストについて説明している記事をたくさん読みました。最初のステップは、TCP接続を確立することです。しかし、実際、私たちは原則の問題を見落としていました。私たちは道路を建設したいのです。私たちはこの道路をどこに建設したかを知らなければなりませんよね?それは私たちの目的地を明確にすることです。したがって、Httpリクエストが発生した後に最初に行うことは、リクエストリンクを解析してから、IPアドレス、アクセスするファイルパス、サーバーのポートなどの目的情報を分析することです。

HTTPリクエストリンクの解決

説明を始める前に、私たちが毎日接触しているネットワークリンクがどのようなものかを最初に理解しましょう。以下では、例としてhttpリンクを使用しています。

http://www.yoka.com/dna/222/192/index.html

上記のリンクには、主に次のコンテンツが含まれています:プロトコルタイプ、ドメイン名/ IPアドレス、ポート番号、ファイルパス。上記のリンクは次のように分割できます。

协议类型:http
域名/IP地址:www.yoka.com
端口号:web服务器默认80端口,可省略不写
文件路径:/dna/222/192/index.html

契約タイプ

ブラウザでサポートされているプロトコルには、http、https、ftp、news、mailtoなど、さまざまな種類があります。ニュースやmailtoはめったに使用されないため、ここでは説明しません。ftpプロトコルはファイル転送プロトコルであり、主にファイルのアップロードとダウンロードの際に使用され、あまり詳しく説明されていません。主にhttpとhttpsの違いについて話します。

Httpプロトコル:ハイパーテキスト転送プロトコル、要求と応答に基づくステートレスのアプリケーション層プロトコル。データを送信するためにTCP / IPプロトコルに基づくことがよくあります。インターネットで最も広く使用されているネットワークプロトコルです。すべてのWWWファイルはこれに従う必要があります。標準。現在、httpプロトコルの主流バージョンはhttp2.0であり、多重化、サーバープッシュ、ヘッダー圧縮、バイナリプロトコルなどをサポートしています。多重化とは、単一のHTTP / 2接続要求を介した複数の要求の開始を指します。メッセージ、複数のリクエストストリームがTCP接続を共有するため、複数のTCP接続の確立に依存する代わりに、複数の並列状態が実現されます。

Httpsプロトコル:HTTPSは、コンピューターネットワークを介した安全な通信のための伝送プロトコルであり、HTTPを介して通信し、SSL / TLSを使用してデータパケットを暗号化するための完全なチャネルを確立します。着信コンテンツは暗号化され、混合暗号化技術が使用されます。仲介者はプレーンテキストコンテンツを直接表示できません。同時に、サーバーのIDの検証をサポートします。クライアントは証明書を介して認証され、独自のサーバーにアクセスできます。また、データの整合性を効果的に保証します。
参照:HTTPおよびHTTPSプロトコル、1つの記事を読むだけ

ドメイン名/ IPアドレスとDNS

通常の状況では、ほとんどのWebリンクはドメイン名でアクセスされます。これは、ドメイン名が次のような対応するWebサイトの特性を表すことができるためです。www.baidu.comまた、IPアドレスを使用して表示する場合、数字の文字列はそうではありません。覚えておくのは不便ですが、特別な機能はありません。ただし、ドメイン名からWebサーバーのアドレスを正しく見つけることができないため、DNS(ドメインネームサービスシステム)を使用する必要があります

私たち全員が、コンピュータ上に、略してリゾルバと呼ばれるDNSクライアントを持っていますドメイン名に対応するIPアドレスの照会は、ドメイン名解決のプロセスです。httpリクエストを開始すると、最終的な接続処理が実際にオペレーティングシステムによって実行されます。この時点で、オペレーティングシステムはリゾルバーを介してDNSサーバーへのドメイン名解決リクエストを開始し、DNSサーバーは対応するドメイン名解決リクエストを返します。ドメイン名を分析した後のIPアドレス。リゾルバーはIPアドレスを取り出し、ブラウザーで指定されたメモリアドレスに書き込みます。しかし、Webサーバーにアクセスするには、そのIPアドレスを知る必要があります。DNSサーバーのIPアドレスをどのように知るのでしょうか。これは、実際には次のようにコンピュータ自体で一致します。

ここに画像の説明を挿入します
この時点で、WebサーバーのIPアドレスを正常に取得できます。しかし、なぜIPアドレスは対応するサーバーアドレスを見つけることができるのでしょうか?これもIPアドレスを理解する必要があります。すべてのコンピューターにはIPアドレスが割り当てられており、IPアドレスは主にネットワーク番号とホスト番号の2つの部分で構成されています。ネットワーク番号は、ホストが配置されているネットワークのサブネット番号であり、ホスト番号はコンピューターに対応しています。AN IPアドレスが8ビットを4つのグループに分け、次いでドットで分割され、32ビットの数字の列であるので、IPアドレスのホスト番号およびネットワーク番号の割合は、固定されていないサブネットマスクを必要とされる識別するために。詳細は次のとおりです。

  1. IPアドレスサブジェクト識別方法
10.11.12.13
  1. IPアドレスと同じ形式でサブネットマスクを識別する方法
//后者为子网掩码,子网掩码为1的部分(十进制转比特)标识网络号,为0标识主机号
//所以下面的ip地址,网络号为10.11.12,主机号为13
10.11.12.13/255.255.255.0   

ホストの後ろの部分のビットがすべて0であるか、すべて1が2つの特別な意味を意味し、0がサブネット内の特定のデバイスではなくサブネット全体を意味し、1がすべてのサブネットを意味することは言及する価値があります。パケット、つまりブロードキャスト。

この時点で、ドメイン名に対応するIPアドレスを取得しました。また、今回はリクエストの宛先もわかっています。残りは、水を橋渡しし、送信者とサーバーの間に通信可能な接続を作成することです。

2つ目は、HTTP接続を作成する

サーバーのIPアドレスがすでにわかっている場合、最終的な要求は実際にはオペレーティングシステムの最下層によって実現されますここでは、オペレーティングシステム内のプロトコルスタックが使用されます。ネットワーク要求を処理するとき、プロトコルスタックは主に2つに分割されます。手順:ソケットを作成し、サーバーに接続しますここでは、最初に大まかなオペレーティングシステムの通信階層図を示します。
ここに画像の説明を挿入します

ソケットを作成する

接続パイプラインを作成します。最も重要なのは、パイプラインの両端でのデータの入力と終了です。これらの開始と終了はソケットと呼ばれます。ブラウザは、Socketライブラリのソケットプログラムを呼び出してソケットを作成します。ソケットの後作成されると、パイプを接続できます。具体的なプロセスは次のとおりです。

  1. サーバーは起動してソケットを作成し、待機状態に入り、クライアントがパイプラインに接続するのを待ちます。
  2. クライアントはソケットを作成し、次にパイプを延長し、最後にパイプをサーバー側のソケットに接続します。
  3. データを送受信します。
  4. クライアントまたはサーバーが切断され、両方の当事者がソケットを削除します。

ソケットとは正確には何ですか?これらは、オペレーティングシステムのメモリスペースに存在するデータ情報の文字列にすぎないことが理解できます。ソケットが作成されると、システムは一定期間メモリスペースを開き、の初期状態を書き込みます。ソケット(この時点で接続されていることに注意してください。情報IPアドレス、ポート番号などはソケットに渡されておらず、単に初期状態が作成されています)、異なるソケットを区別するために記述子が各ソケットに割り当てられます。この情報は、主にIPアドレス、ポート番号、通信パートナーの通信操作のステータスなど、通信操作制御するために使用されます。制御情報は2つのカテゴリに分類できます。1つは、接続要求が作成されると、これらの制御情報が接続情報のヘッダー(TCPヘッダー)に配置され、各要求がこの制御情報を持ってくる必要があることです。詳細は次のとおりです。上記で知っておく必要のある主な事項は次のとおりです
ここに画像の説明を挿入します

  • 32ビット確認応答番号(ACK番号):受信者はバイト数を使用して、すべてのデータが受信されたことを送信者に通知します。
  • 32ビットシリアル番号:送信者は、ネットワークパケットによって送信されたデータが、すべてのデータの最初の数バイトに相当することを受信者に通知します。
  • ACK:受信したデータシーケンス番号フィールドが有効であることを識別します。これは通常、受信者によって受け入れられたことを示します。
  • SYN:送信者と受信者が相互にシリアル番号を確認し、接続動作を示します。
  • FIN:切断を示します。
    実際に送信する場合、実際には次のようになります。
    ここに画像の説明を挿入します

プロトコルスタックの動作を制御するために、ソケットに格納される別のタイプの情報があります。
プロトコルスタックが接続を作成するとき、これらの制御情報に基づいて動作する必要があります。ウィンドウシステムでは、コマンドを使用してソケットの内容を実際に表示できます。具体的なコマンドは次のとおりです。netstat -ano

サーバーに接続します

ソケットが作成された後、ブラウザはソケットライブラリ内の接続アプリケーションを呼び出してローカルソケットとサーバーソケットを接続します。connectを呼び出すと、サーバーのIPアドレスとポート番号が一緒に送信されます。詳細は次のとおりです。

connect(<描述符>, <服务器的端口和ip>,...)

接続は主に次のことを行うためのものです。

  1. サーバーのIPアドレスとポート番号をプロトコルスタックに伝えます。
  2. クライアントは、サーバーとの通信を開始する要求を伝達します。
  3. 送受信されたデータを一時的に保存するためのメモリスペースとバッファを作成します。

その中で、クライアントは、上記の表の内容であるTCPモジュールで接続制御情報を表すヘッダーを作成することにより、最初にサーバーとの通信を開始する要求を伝達します。TCPヘッダー情報を介して、送信者と受信者のポート番号を見つけ、それらをIPモジュールに渡すことができます。要求の前にIPヘッダー情報を追加し、ネットワークパケットの戻り操作を実行します。最後に、ネットワークレポートは次のようになります。ネットワークを介してサーバーに到達するために、サーバーはIPモジュールとTCPモジュールをレイヤーごとに分析し、対応するソケット情報を見つけてから、サーバーで待機状態のソケットを照合して同じポート番号を見つけます。この時点でネットワーク通信で一般的に参照される3ウェイハンドシェイクの最初のハンドシェイクが開始されます。残りの2つのハンドシェイクについては、データ処理プロセスは最初のハンドシェイクと同様であるため、これについては詳しく説明しません。ここで簡単に言えば、サーバーは受信した応答を返します。クライアントはサーバーから返された応答を受信した後、接続に成功します。最後に、クライアントは返された応答要求に従って、受信を確認するフィードバック要求をサーバーに送信します。応答パケットがちょうど受信されたことをサーバーに通知します。ここでの接続は本当に完了です!

接続が成功したことをクライアントが知る方法については、すべてのリクエストに含めるリクエストヘッダーを使用する必要があり、制御識別子ACKやSYNなどはおおよそ次のとおりです。

ここに画像の説明を挿入します
この時点で、クライアントはサーバーに正常に接続しています。簡単な要約は次のとおりです。ブラウザは最初に、URLの内容(Isがwww.baidu.comなどのドメイン名では、DNSサーバーからドメイン名に対応するIPアドレスを取得する必要があります)オペレーティングシステムのアプリケーション(ソケットとソケットライブラリで接続)を呼び出してソケットを作成し、 passプロトコルスタックは、TCP接続を完了するためにレイヤーごとにダウンします。
ここに画像の説明を挿入します
オリジナリティは簡単ではありません、ワンクリックトリプル接続を歓迎します〜

参考資料:

「インターネットの接続方法」

TCPヘッダー形式

おすすめ

転載: blog.csdn.net/dypnlw/article/details/113525055