ホームページ > ウェブフロントエンド > jsチュートリアル > インターネットはどのように機能するのでしょうか?パート 1

インターネットはどのように機能するのでしょうか?パート 1

Linda Hamilton
リリース: 2024-10-05 22:18:02
オリジナル
261 人が閲覧しました

有沒有想過點擊連結時會發生什麼事? ? 《互聯網如何運作》將帶您深入數位世界的幕後,將複雜的技術分解為簡單的見解。從資料包到伺服器等,探索為您的線上體驗提供動力的魔力! (在 AI 的幫助下寫的 Hook,因為我不會:D)

當您造訪 google.com 時會發生什麼?

按下“g”鍵

讓我解釋一下實體鍵盤操作和作業系統中斷。當您按下“g”鍵時,瀏覽器會註冊該事件,觸發自動完成功能。根據您的瀏覽器演算法以及您處於常規模式還是私人/隱身模式,URL 欄下方的下拉式選單中會顯示各種建議。

這些建議通常會根據您的搜尋記錄、書籤、cookie 和流行的網路搜尋等因素進行優先排序和排序。當您繼續輸入“google.com”時,許多進程會在背景運行,並建議會隨著每次按鍵而完善。在您完成輸入之前,瀏覽器甚至可能會預測「google.com」。

How does the internet work? Part 1
瀏覽自動完成序列

「輸入」鍵觸底

為了建立一個起點,讓我們考慮一下鍵盤上的 Enter 鍵到達其行程範圍底部時的情況。此時,專用於 Enter 鍵的電路閉合(機械地或電容式地),允許小電流流入鍵盤的邏輯電路。此電路掃描每個按鍵開關的狀態,濾除開關快速閉合(去抖)產生的電噪聲,並將操作轉換為鍵碼(在本例中為整數 13)。然後鍵盤控制器對該鍵碼進行編碼以進行傳輸到電腦。如今,這幾乎總是透過通用序列匯流排 (USB) 或藍牙連接完成,儘管舊系統使用 PS/2 或 ADB。

如果是 USB 鍵盤

  • 鍵盤由透過電腦 USB 主控制器的接腳 1 提供的 5V 電源供電。
  • 按鍵產生的鍵碼儲存在稱為「端點」的內部暫存器中。
  • USB 主機控制器大約每 10 毫秒(鍵盤設定的最小間隔)輪詢該“端點”,檢索儲存的鍵碼。
  • 金鑰代碼被傳送到 USB 串列介面引擎 (SIE),並根據 USB 協定將其轉換為一個或多個 USB 封包。
  • 這些資料包透過 D 線和 D- 線(中間的兩個引腳)以最大 1.5 Mb/s 的速率傳輸,因為鍵盤被歸類為「低速裝置」(根據 USB 2.0 標準)。
  • 電腦的主機 USB 控制器解碼此串列訊號,而人機介面裝置 (HID) 驅動程式則解釋按鍵。最後,按鍵事件被傳遞到作業系統的硬體抽象層。 How does the internet work? Part 1 序列圖

如果是虛擬鍵盤(例如在觸控螢幕裝置上)

  • 當使用者觸摸電容式觸控螢幕時,少量電流會傳送到他們的手指。這種相互作用會擾亂螢幕導電層的靜電場,從而在接觸點產生電壓降。
  • 螢幕控制器偵測到這一點並觸發中斷,報告觸控的座標。
  • 然後,作業系統會向目前活動的應用程式發出警報,告知其圖形介面內發生了按下事件,通常是在虛擬鍵盤按鈕上。
  • 虛擬鍵盤應用程式引發軟體中斷,通知作業系統「按鍵按下」事件。
  • 聚焦的應用程式接收此通知並相應地處理按鍵。 How does the internet work? Part 1 描述相同內容的序列圖

中斷觸發 [不適用於 USB 鍵盤]

對於非 USB 鍵盤,例如使用傳統連接(例如 PS/2)的鍵盤,鍵盤透過其中斷請求線 (IRQ) 發出中斷訊號。此 IRQ 由系統的中斷控制器對應到中斷向量(整數)。 CPU 查閱中斷描述符表 (IDT),該表將每個中斷向量連結到由作業系統核心提供的對應函數(稱為中斷處理程序)。

인터럽트가 트리거되면 CPU는 인터럽트 벡터를 사용하여 IDT를 색인화하고 적절한 인터럽트 핸들러를 실행합니다. 이 프로세스를 통해 CPU가 커널 모드로 전환되어 운영 체제가 키 누르기 이벤트를 관리할 수 있습니다.

WM_KEYDOWN 메시지가 앱으로 전송됩니다(Windows의 경우).

Enter 키를 누르면 HID(휴먼 인터페이스 장치) 전송이 키 다운 이벤트를 KBDHID.sys 드라이버에 전달하여 HID 사용 데이터를 스캔 코드로 변환합니다. 이 경우 스캔 코드는 VK_RETURN(0x0D)이며 Enter 키를 나타냅니다. 그런 다음 KBDHID.sys 드라이버는 모든 키보드 입력을 안전하게 관리하는 KBDCLASS.sys 드라이버(키보드 클래스 드라이버)와 통신합니다. 계속하기 전에 신호는 시스템에 설치된 타사 키보드 필터를 통과할 수 있지만 이는 커널 모드에서도 발생합니다.

다음으로 Win32K.sys가 작동하여 GetForegroundWindow() API를 호출하여 현재 활성화된 창이 무엇인지 확인합니다. 이 함수는 브라우저의 주소 표시줄과 같은 활성 애플리케이션의 창 핸들(hWnd)을 검색합니다. 이 시점에서 Windows "메시지 펌프"는 SendMessage(hWnd, WM_KEYDOWN, VK_RETURN, lParam)를 호출합니다. lParam 매개변수에는 다음을 포함하여 키 누르기에 대한 추가 정보를 제공하는 비트마스크가 포함되어 있습니다.

  • 반복 횟수(이 경우 0),
  • 스캔 코드(OEM별로 다를 수 있지만 일반적으로 VK_RETURN의 표준),
  • 확장 키 플래그(Alt, Shift 또는 Ctrl과 같은 보조 키도 눌렸는지 여부를 나타냄).

SendMessage API는 특정 창 핸들에 대한 메시지를 대기열에 넣습니다. 나중에 창(hWnd)에 할당된 시스템의 기본 메시지 처리 기능(WindowProc라고도 함)이 대기열에 있는 메시지를 검색하고 처리합니다.

이 경우 활성 창은 편집 컨트롤이며 WindowProc 함수에는 WM_KEYDOWN 이벤트에 응답하는 메시지 핸들러가 있습니다. 핸들러는 SendMessage가 전달한 세 번째 매개변수(wParam)를 확인하고 그 값이 VK_RETURN임을 인식하여 사용자가 Enter 키를 눌렀다고 판단합니다. 그러면 애플리케이션에 대한 적절한 응답이 시작됩니다.

KeyDown NSEvent가 앱으로 전송됩니다(OS X의 경우).

OS X에서 키를 누르면 인터럽트 신호가 I/O 키트 키보드 드라이버(커널 확장 또는 "kext")에서 이벤트를 트리거합니다. 이 드라이버는 하드웨어 신호를 키 코드로 변환합니다. 그런 다음 키 코드는 그래픽 사용자 인터페이스를 관리하는 WindowServer로 전달됩니다.

WindowServer는 이벤트에 배치되는 Mach 포트를 통해 키 누르기 이벤트를 적절한 애플리케이션(예: 활성 애플리케이션 또는 청취 애플리케이션)에 전달합니다. 대기줄. 적절한 권한이 있는 애플리케이션은 mach_ipc_dispatch 함수를 호출하여 이 이벤트 큐에 액세스할 수 있습니다.

대부분의 애플리케이션은 사용자 입력 처리를 담당하는 NSApplication 메인 이벤트 루프를 통해 이 프로세스를 처리합니다. 이벤트가 키 누르기인 경우 NSEventTypeKeyDown 유형의 NSEvent로 표시됩니다. 그런 다음 애플리케이션은 이 이벤트를 읽고 그에 따라 응답하여 수신된 키 코드를 기반으로 키 누르기 작업과 관련된 모든 코드를 트리거합니다.

Xorg 서버는 키코드를 수신합니다(GNU/Linux에서)

X 서버를 사용하는 그래픽 환경에서 키를 누르면 X 서버는 evdev(이벤트 장치) 드라이버를 사용하여 키 누르기 이벤트를 캡처합니다. 그런 다음 실제 키보드의 키코드는 X 서버별 키맵과 규칙을 사용하여 스캔코드로 다시 매핑됩니다.

매핑이 완료되면 X 서버는 결과 스캔코드창 관리자(예: DWM, Metacity, i3 등)로 전달합니다. 그러면 창 관리자는 현재 초점이 맞춰진 창에 ​​문자나 키 이벤트를 보냅니다. 초점이 맞춰진 창의 그래픽 API는 이 이벤트를 처리하고 누른 키에 따라 올바른 글꼴을 사용하여 해당 필드에 해당 기호를 표시합니다.

이 흐름을 통해 활성 애플리케이션의 인터페이스에서 문자가 올바르게 렌더링되어 하드웨어에서 그래픽 출력까지 키 누름 상호 작용이 완료됩니다.

URL 구문 분석

브라우저는 URL(Uniform Resource Locator)을 구문 분석할 때 다음 구성 요소를 추출합니다.

  • 프로토콜: "http" 브라우저는 이것이 하이퍼 텍스트 전송 프로토콜을 사용하여 서버와 통신한다는 것을 이해합니다.
  • 리소스: "/" 이는 / 경로가 일반적으로 서버의 루트 또는 홈 페이지를 참조하므로 브라우저가 웹사이트의 기본(인덱스) 페이지를 검색해야 함을 나타냅니다.

이러한 각 구성 요소는 브라우저가 웹에서 원하는 리소스를 해석하고 가져오는 데 도움이 됩니다.

How does the internet work? Part 1

URL ですか、それとも検索語ですか?

プロトコル (「http」など) または有効なドメイン名が指定されていない場合、ブラウザはアドレス バー内のテキストを潜在的な検索語として解釈します。ブラウザは、URL として解決しようとする代わりに、テキストをデフォルトの Web 検索エンジンに転送します。

ほとんどの場合、ブラウザは検索クエリに特別な識別子を追加し、リクエストがブラウザの URL バーからのものであることを示します。これにより、検索エンジンはこれらの検索を適切に処理して優先順位を付け、コンテキストに基づいて結果の関連性を向上させることができます。

このプロセスは、ブラウザーが Web サイトに直接移動するか、入力されたテキストに基づいて検索結果を提供するかを判断するのに役立ちます。

ホスト名の非 ASCII Unicode 文字を変換する

  • ブラウザはホスト名で ASCII 範囲外の文字、特に a ~ z、A ~ Z、0 ~ 9、-、または .. のセットに含まれない文字を調べます。
  • この場合、ホスト名は google.com であり、ASCII 文字のみが含まれているため、変換は必要ありません。ただし、ホスト名に非 ASCII 文字が含まれている場合、ブラウザは Punycode エンコードを適用してホスト名を有効な ASCII 表現に変換します。このプロセスにより、ホスト名のすべての文字がネットワーク プロトコルで正しく処理されることが保証されます。

HSTS リストを確認する

ブラウザはまず、プリロードされた HSTS (HTTP Strict Transport Security) リストをチェックします。このリストには、HTTPS 経由でのみアクセスすることを明示的に要求した Web サイトが含まれています。

リクエストされた Web サイトがこのリストにある場合、ブラウザは HTTP ではなく HTTPS を使用してリクエストを自動的に送信します。 Web サイトが HSTS リストにない場合、最初のリクエストは HTTP 経由で送信されます。

Web サイトは、プリロードされたリストに含まれていなくても HSTS を実装できることに注意することが重要です。このような場合、ユーザーが行った最初の HTTP リクエストは、以降のリクエストを HTTPS 経由でのみ送信するようブラウザに指示する応答を返します。ただし、この最初の HTTP リクエストはユーザーをダウングレード攻撃にさらす可能性があり、攻撃者がリクエストを傍受し、強制的に暗号化されないままにする可能性があります。この脆弱性のため、最新の Web ブラウザーには HSTS リストが含まれており、そもそも安全でない接続が確立されるのを防ぐことでユーザーのセキュリティを強化しています。

DNS ルックアップ

ブラウザは、ドメインがすでにキャッシュに存在するかどうかを確認することで、DNS ルックアップ プロセスを開始します。 (Google Chrome で DNS キャッシュを表示するには、chrome://net-internals/#dns に移動します。)

ドメインがキャッシュ内に見つからない場合、ブラウザは gethostbyname ライブラリ関数 (特定の関数はオペレーティング システムによって異なる場合があります) を呼び出して、ホスト名解決を実行します。

  1. ローカルホストファイルチェック:

    • gethostbyname 関数は、まず、オペレーティング システムによって場所が異なるローカル ホスト ファイルを参照してホスト名を解決できるかどうかを確認します。このファイルは、ホスト名を IP アドレスにマッピングする単純なテキスト ファイルであり、DNS に問い合わせることなく迅速に解決できます。
  2. DNS サーバーリクエスト:

    • ホスト名がキャッシュされておらず、hosts ファイルで見つからない場合、ブラウザはネットワーク スタックに設定されている DNS サーバーにリクエストを送信します。このサーバーは通常、ローカル ルーターまたは ISP のキャッシュ DNS サーバーで、今後のリクエストを高速化するために以前に解決された名前を保存します。
  3. DNS サーバーの ARP プロセス:

    • DNS サーバーが同じサブネット上にある場合、ネットワーク ライブラリは ARP (アドレス解決プロトコル) プロセスに従って DNS サーバーの IP アドレスを解決し、リクエストがローカル ネットワーク内で正しく送信されるようにします。
    • DNS サーバーが別のサブネット上にある場合、ネットワーク ライブラリは代わりに、デフォルト ゲートウェイ IP の ARP プロセスに従い、リクエストを適切なサブネットにルーティングする仲介者として機能します。

この体系的なアプローチにより、ブラウザはドメイン名を効率的に IP アドレスに解決し、目的の Web サイトへの接続を確立できるようになります。最初にキャッシュを確認し、ローカル ホスト ファイルを使用して、最後に DNS サーバーにクエリを実行することで、ブラウザはホスト名解決にかかる時間を最小限に抑えます。

How does the internet work? Part 1

シーケンス図

ARP 프로세스

ARP(주소 확인 프로토콜) 브로드캐스트를 전송하려면 네트워크 스택 라이브러리에 두 가지 핵심 정보가 필요합니다. 즉, 조회해야 하는 대상 IP 주소와 전송에 사용될 인터페이스의 MAC 주소입니다. ARP 방송에서 나옵니다.

ARP 캐시 확인:

먼저 ARP 캐시에서 대상 IP 주소에 해당하는 항목이 있는지 확인합니다. 항목이 있으면 라이브러리 함수는 다음 형식으로 결과를 반환합니다.
대상 IP = MAC.

항목이 ARP 캐시에 없는 경우:

대상 IP 주소에 대한 항목이 없는 경우 다음 단계를 수행합니다.

  • 대상 IP 주소가 로컬 경로 테이블에 나열된 서브넷에 있는지 확인하기 위해 경로 테이블을 참조합니다.
    • 찾으면 라이브러리는 해당 서브넷과 연결된 인터페이스를 사용합니다.
    • 그렇지 않은 경우 라이브러리는 기본적으로 기본 게이트웨이에 연결되는 인터페이스를 사용합니다.
  • 그러면 선택한 네트워크 인터페이스의 MAC 주소가 검색됩니다.

    ARP 요청 보내기:

네트워크 라이브러리는 다음 형식으로 계층 2(OSI 모델의 데이터 링크 계층) ARP 요청을 구성하고 보냅니다. ARP 요청:

  • 발신자 MAC: 인터페이스:mac:주소:여기
  • 발신자 IP: 인터페이스.ip.goes.여기
  • 대상 MAC: FF:FF:FF:FF:FF:FF(브로드캐스트)
  • 대상 IP: target.ip.goes.here

컴퓨터와 라우터 간의 하드웨어 설정에 따라 ARP 요청 동작이 달라집니다.

직접 연결:

컴퓨터가 라우터에 직접 연결된 경우 라우터는 ARP 응답으로 응답합니다(아래 참조).

바퀴통:

컴퓨터가 허브에 연결된 경우 허브는 다른 모든 포트에서 ARP 요청을 브로드캐스트합니다. 라우터가 동일한 "회선"에 연결된 경우 ARP 응답으로 응답합니다(아래 참조).

스위치:

컴퓨터가 스위치에 연결된 경우 스위치는 로컬 CAM/MAC 테이블을 확인하여 쿼리 중인 MAC 주소가 있는 포트를 식별합니다. 스위치에 MAC 주소에 대한 항목이 없으면 ARP 요청을 다른 모든 포트로 다시 브로드캐스트합니다. 스위치의 MAC/CAM 테이블에 항목이 있으면 해당 MAC 주소가 있는 포트에만 ARP 요청을 보냅니다.

  • 라우터가 동일한 "회선"에 있으면 ARP 응답으로 응답합니다(아래 참조).

ARP 응답:

ARP 응답의 형식은 다음과 같습니다.

발신자 MAC: 대상:mac:주소:여기

발신자 IP: target.ip.goes.here

대상 MAC: 인터페이스:mac:주소:여기

대상 IP: 인터페이스.ip.goes.여기

이제 네트워크 라이브러리가 DNS 서버 또는 기본 게이트웨이의 IP 주소를 얻었으므로 DNS 프로세스를 재개할 수 있습니다.

  1. DNS 클라이언트는 1023 이상의 소스 포트를 활용하여 DNS 서버의 UDP 포트 53에 대한 소켓 연결을 설정합니다.
  2. 응답 크기가 UDP 제한을 초과하는 경우 더 큰 응답을 수용하기 위해 대신 TCP가 사용됩니다.
  3. 로컬 또는 ISP DNS 서버에 요청한 정보가 없는 경우 재귀 검색을 시작하여 SOA(권한 시작)에 도달할 때까지 DNS 서버 계층 구조를 쿼리하여 응답이 반환됩니다.

소켓 열기

브라우저가 대상 서버의 IP 주소를 수신하면 이를 URL에 지정된 포트 번호와 결합합니다(HTTP의 기본값은 포트 80, HTTPS의 기본값은 443). 그런 다음 브라우저는 AF_INET 또는 AF_INET6 및 SOCK_STREAM을 사용하여 TCP 소켓 스트림을 요청하는 소켓이라는 시스템 라이브러리 함수를 호출합니다.

傳輸層處理:

  • 此請求首先由傳輸層處理,其中產生 TCP 段。目標連接埠被加入到標頭中,來源連接埠是從核心的動態連接埠範圍內選擇的(在 Linux 中由 ip_local_port_range 指定)。

網路層處理:

  • 該段隨後被送到網路層,網路層將其包裝在一個附加的 IP 標頭中。目的伺服器和目前機器的IP位址被插入形成一個資料包。

鏈結層處理:

  • 封包接下來到達連結層,在連結層新增幀頭。此標頭包括機器 NIC(網路介面卡)的 MAC 位址以及網關(本機路由器)的 MAC 位址。如果核心不知道網關的 MAC 位址,則必須廣播 ARP 查詢才能找到它。

此時,資料包已準備好透過以下方法之一傳輸:

  • 乙太網路
  • 無線網路
  • 蜂窩數據網路

對於大多數家庭或小型企業互聯網連接,資料包將從您的電腦傳遞,可能透過本地網絡,然後透過數據機(調製器/解調器)。此數據機將數位 1 和 0 轉換為適合透過電話、電纜或無線電話連接傳輸的類比訊號。在連接的另一端,另一個調製解調器將類比訊號轉換回數位數據,以供下一個網路節點處理,其中將進一步分析起始位址和目標位址。

相較之下,較大的企業和一些較新的住宅連接將使用光纖或直接乙太網路連接,從而使資料保持數位化並直接傳遞到下一個網路節點進行處理。

最終,封包將到達管理本地子網路的路由器。從那裡,它將繼續前往自治系統 (AS) 的邊界路由器,遍歷其他 AS,最後到達目標伺服器。沿途的每個路由器從 IP 標頭中提取目標位址,並將其路由到適當的下一跳。對於每個處理它的路由器,IP 標頭中的生存時間 (TTL) 欄位會減一。如果 TTL 欄位達到零或目前路由器佇列中沒有空間(這可能是由於網路擁塞而發生),則封包將被丟棄。
此傳送和接收程序依照 TCP 連線流程發生多次:

  1. 客戶端選擇一個初始序號(ISN)並向伺服器發送資料包,其中設定了 SYN 位元以指示它正在設定 ISN。
  2. 伺服器接收SYN,如果同意,則執行下列操作:
    • 選擇自己的初始序號。
    • 設定 SYN 位元以指示它正在選擇其 ISN。
  3. 將(客戶端 ISN 1)複製到其 ACK 欄位並新增 ACK 標誌以指示它正在確認收到第一個資料包。

  4. 客戶端透過傳送以下資料包來確認連線:

    • 增加自己的序號。
    • 增加接收者確認數量。
    • 設定 ACK 欄位。
  5. 資料傳輸:資料傳輸如下:

    • 當一側發送 N 個資料位元組時,它會將其序號 (SEQ) 增加該數字。
    • 當另一方確認收到該封包(或一串封包)時,它會傳送一個 ACK 封包,其確認 (ACK) 值等於上次從另一方收到的序列。
  6. 關閉連線:關閉連線:

    • 發起關閉的一方發送FIN資料包。
    • 對方確認FIN資料包並發送自己的FIN。
    • 發起者透過 ACK 確認對方的 FIN。

How does the internet work? Part 1

開啟套接字:序列圖

TLS 握手

  • 客戶端電腦向伺服器發送 ClientHello 訊息,其中包括其傳輸層安全性 (TLS) 版本、可用密碼演算法清單和壓縮方法。
  • 作為回應,伺服器回覆 ServerHello 訊息,該訊息指定 TLS 版本、所選密碼、所選壓縮方法以及由憑證授權單位 (CA) 簽署的伺服器公共憑證。該憑證包含一個公鑰,客戶端將使用該公鑰來加密握手的其餘部分,直到對稱金鑰達成協議。
  • 客戶端根據其受信任的 CA 清單驗證伺服器的數位憑證。如果可以基於 CA 建立信任,則用戶端會產生一串偽隨機字節,並使用伺服器的公鑰對該字串進行加密。這些隨機位元組將用於確定對稱密鑰。
  • 伺服器使用其私鑰解密隨機位元組,並利用這些位元組產生自己的對稱主金鑰副本。
  • 客戶端向伺服器發送 Finished 訊息,並使用對稱金鑰對迄今為止發生的傳輸的雜湊值進行加密。
  • 伺服器產生自己的雜湊值,然後解密客戶端發送的雜湊值以驗證其是否匹配。如果雜湊值匹配,伺服器會將自己的 Finished 訊息傳回客戶端,該訊息也使用對稱金鑰加密。
  • 從現在開始,TLS 會話將傳輸使用商定的對稱金鑰加密的應用程式 (HTTP) 資料。

此握手程序在客戶端和伺服器之間建立安全連接,確保透過連接傳輸的資料不會被竊聽和篡改。

如果資料包遺失

有時,由於網路擁塞或不穩定的硬體連接,TLS 封包可能會在到達最終目的地之前被丟棄。在這種情況下,發送者必須決定如何反應。管理此回應的演算法稱為 TCP 擁塞控制。具體實作可能因發送者而異,最常見的演算法是較新作業系統上的 Cubic 和許多其他作業系統上的 New Reno。

  • 客戶端依照連線的最大段大小(MSS)選擇擁塞視窗。
  • 對於每個確認的資料包,擁塞視窗的大小都會加倍,直到達到「慢啟動閾值」。在某些實作中,此閾值是自適應的,可以根據網路條件進行變更。
  • 一旦達到慢啟動閾值,對於每個確認的資料包,視窗都會增加。如果一個資料包被丟棄,視窗會呈指數減小,直到另一個資料包被確認。

這種擁塞控制機制有助於優化網路效能和穩定性,確保資料能夠高效傳輸,同時最大限度地減少丟包的影響。

HTTP協定

如果使用的網頁瀏覽器是由 Google 開發的,它可能會嘗試與伺服器協商從 HTTP 到 SPDY 協定的“升級”,而不是發送標準 HTTP 請求來檢索頁面。

如果客戶端使用的是HTTP協定且不支援SPDY,則會依照下列格式向伺服器傳送請求:


GET / HTTP/1.1
Host: google.com
Connection: close
[other headers]


ログイン後にコピー

這裡,[其他標頭]指的是一系列以冒號分隔的鍵值對,這些鍵值對按照 HTTP 規範格式化,並以單一換行符分隔。這假設 Web 瀏覽器不存在違反 HTTP 規範的錯誤,而且它正在使用 HTTP/1.1。如果它使用不同的版本,例如 HTTP/1.0HTTP/0.9,它可能不會在請求中包含 Host 標頭。

HTTP/1.1 為發送方定義了「關閉」連線選項,以表示回應完成後將關閉連線。例如:


Connection: close



ログイン後にコピー

不支援持久連線的 HTTP/1.1 應用程式必須在每個訊息中包含「關閉」連線選項。

發送請求和標頭後,Web 瀏覽器會向伺服器發送空白換行符,表示請求內容已完成。

伺服器隨後使用表示請求狀態的回應代碼進行回應,其結構如下:


200 OK
[response headers]


ログイン後にコピー

後面跟著一個換行符,然後是包含 www.google.com 的 HTML 內容的有效負載。伺服器可以關閉連接,或者,如果客戶端發送的標頭請求,則保持連接開啟以便在進一步的請求中重複使用。

If the HTTP headers sent by the web browser contained sufficient information for the web server to determine whether the version of the file cached by the web browser has been unmodified since the last retrieval (for example, if the web browser included an ETagheader), the server may instead respond with:


304 Not Modified
[response headers]


ログイン後にコピー

This response will have no payload, and the web browser will retrieve the HTML from its cache.

After parsing the HTML, the web browser (and server) repeats this process for every resource (image, CSS, favicon.ico, etc.) referenced in the HTML page. In these cases, instead of GET / HTTP/1.1, the request will be structured as:


GET /$(URL relative to www.google.com) HTTP/1.1



ログイン後にコピー

If the HTML references a resource on a different domain than www.google.com, the web browser returns to the steps involved in resolving the other domain, following all steps up to this point for that domain. The Host header in the request will be set to the appropriate server name instead of google.com.

HTTP Server Request Handling

The HTTPD (HTTP Daemon) server is responsible for handling requests and responses on the server side. The most common HTTPD servers include Apache and Nginx for Linux, as well as IIS for Windows.

  1. Receiving the Request: The HTTPD server receives the incoming request from the client.
  2. Breaking Down the Request: The server analyzes the request and extracts the following parameters:
    • HTTP Request Method: This could be one of several methods, including GET, HEAD, POST, PUT, PATCH, DELETE, CONNECT, OPTIONS, or TRACE. In the case of a URL entered directly into the address bar, the method will typically be GET.
    • Domain: In this case, the domain is google.com.
    • Requested Path/Page: Here, the requested path is /, indicating that no specific page was requested; thus, / is treated as the default path.
  3. Verifying the Virtual Host: The server checks whether a Virtual Host is configured for google.com.
  4. Method Verification: The server verifies that google.com can accept GET requests.
  5. Client Permission Check: The server checks if the client is allowed to use this method based on criteria such as IP address, authentication, etc.
  6. Request Rewriting: If the server has a rewrite module installed (such as mod_rewrite for Apache or URL Rewrite for IIS), it attempts to match the request against any configured rules. If a matching rule is found, the server rewrites the request according to that rule.
  7. Content Retrieval: The server retrieves the content that corresponds to the request. In this case, it will typically default to the index file since the request path is /. While there are cases that can override this behavior, using the index file is the most common method.
  8. File Parsing and Processing: The server parses the index file according to the designated handler. If Google is using PHP, for example, the server will utilize PHP to interpret the index file and stream the output back to the client.

By following these steps, the HTTPD server efficiently processes incoming requests and returns the appropriate responses to the client.

Browser

The primary functionality of a browser is to present the web resources you choose by requesting them from a server and displaying them in the browser window. The resource is typically an HTML document but may also include PDFs, images, or other types of content. The location of the resource is specified by the user using a URI (Uniform Resource Identifier).

The way a browser interprets and displays HTML files is defined by the HTML and CSS specifications, which are maintained by the W3C (World Wide Web Consortium), the standards organization for the web.

Browser user interfaces share many common features, including:

  • An address bar for entering a URI
  • Back and forward buttons for navigation
  • Bookmarking options for saving favorite pages
  • Refresh and stop buttons for refreshing or halting the loading of current documents
  • A home button that takes you to your home page

Browser High-Level Structure

The components of a browser can be broken down as follows:

  • 使用者介面:這包括網址列、後退/前進按鈕、書籤選單以及瀏覽器顯示的任何其他部分(顯示請求頁面的視窗除外)。
  • 瀏覽器引擎:瀏覽器引擎充當使用者介面和渲染引擎之間的橋樑,管理操作和互動。
  • 渲染引擎: 負責顯示要求的內容,渲染引擎解析 HTML 和 CSS,將解析後的內容轉換為螢幕上的視覺表示。
  • 網路:該元件處理網路調用,例如 HTTP 請求,並利用為各種平台定制的不同實現,同時提供獨立於平台的介面。
  • UI 後端: UI 後端負責繪製基本的小部件,如組合框和視窗。它公開了一個不特定於任何平台並依賴作業系統的使用者介面方法的通用介面。
  • JavaScript 引擎: 引擎解析並執行 JavaScript 程式碼,允許網頁內的動態內容和互動性。
  • 資料儲存:這充當持久層,使瀏覽器能夠在本地保存各種類型的數據,例如cookie。瀏覽器也支援 localStorage、IndexedDB、WebSQL 和 FileSystem 等儲存機制。

每個元件協同工作以創建無縫的瀏覽體驗,使用戶能夠有效地存取網路資源並與之互動。

HTML解析

渲染引擎開始從網路層檢索所請求文件的內容,通常以 8 kB 區塊的形式檢索。 HTML 解析器的主要職責是將 HTML 標記轉換為稱為解析樹的結構化表示。

輸出樹,稱為“解析樹”,由 DOM(文檔物件模型)元素和屬性節點的層次結構組成。 DOM 用作 HTML 文件的物件表示,為 HTML 元素提供與外部腳本(例如 JavaScript)互動的介面。這棵樹的根是「Document」對象,在任何腳本操作之前,DOM 與原始標記保持幾乎一一對應。

解析演算法

由於多種因素,使用傳統的自上而下或自下而上的解析器無法有效地解析 HTML:

  • 語言的寬容本質: HTML 的設計對語法錯誤較寬容,即使標記結構不完美,瀏覽器也可以顯示內容。
  • 瀏覽器容錯能力:瀏覽器旨在處理無效 HTML 的常見情況,確保使用者獲得功能體驗。
  • 解析過程的重入:在其他程式語言中,解析過程中來源保持不變。然而,在 HTML 中,動態元素(例如包含 document.write() 呼叫的 <script> 標籤)可以在解析期間修改輸入,這需要不同的方法。 由於這些挑戰,瀏覽器採用了專為 HTML 客製化的自訂解析器。解析演算法在 HTML5 規範中有詳細描述,由兩個主要階段組成:標記化和樹建構。 </script>

解析完成時的操作

解析完成後,瀏覽器將繼續取得連結到頁面的外部資源,例如 CSS 樣式表、圖片和 JavaScript 檔案。此時,瀏覽器將文件標記為互動式,並開始解析處於「延遲」模式的腳本,這表示這些腳本將在文件完全解析後執行。然後文檔狀態設定為“完成”,並觸發“載入”事件。

重要的是,瀏覽器不會為 HTML 頁面產生「無效語法」錯誤。相反,它們會自動更正任何無效內容並繼續處理文檔,確保使用者可以在最小幹擾的情況下查看網頁。

CSS解釋

CSS解釋的過程涉及幾個關鍵步驟:

  • **解析CSS文件:**瀏覽器解析外部CSS文件,
  • 建立 StyleSheet 物件: 每個解析的 CSS 檔案都會轉換為 StyleSheet 物件。每個StyleSheet物件都封裝了CSS規則,包括選擇器和對應的CSS聲明。這種結構化表示允許有效存取和操作樣式。
  • 解析技術: CSS 解析器可以利用自上而下或自下而上的解析技術,這取決於所使用的特定解析器產生器。這些技術決定了解析器如何讀取和處理CSS規則,影響解析過程的效率和準確性。 How does the internet work? Part 1

透過這種解釋,瀏覽器可以全面了解如何將樣式應用於 DOM 中的 HTML 元素,從而促進網頁呈現出預期的視覺呈現效果。

頁面渲染

網頁的渲染過程涉及幾個結構化步驟:

  • フレーム ツリーの作成: レンダリング エンジンは、DOM ノードを走査し、各ノードの計算された CSS スタイルを計算することによって、「フレーム ツリー」または「レンダー ツリー」を構築します。このツリーはページの視覚的な構造を表します。
  • 優先幅の計算: フレーム ツリー内の各ノードの優先幅はボトムアップ方式で計算されます。これには、子ノードの推奨幅と、ノードの水平方向のマージン、境界線、およびパディングを合計することが含まれます。
  • 実際の幅の計算: 各ノードの実際の幅は、ニーズに基づいて子ノードに利用可能な幅を分配することにより、トップダウンのアプローチで決定されます。
  • 高さの計算: 各ノードの高さは、テキストの折り返しを適用し、子ノードの高さをノードのマージン、境界線、およびパディングとともに合計することによってボトムアップで計算されます。
  • ノード座標の決定: 各ノードの座標は、前の手順で収集した幅と高さの情報を使用して計算されます。
  • 複雑な要素の処理: フローティング要素、絶対的または相対的に配置された要素、またはその他の複雑な機能を使用する要素に対しては、より複雑な計算が実行されます。詳細については、CSS2 の CSS 仕様と現在の CSS の作業を参照してください。
  • レイヤーの作成: レイヤーは、再ラスタライズを必要とせずにページのどの部分を一緒にアニメーション化できるかを記述するために作成されます。各フレーム/レンダー オブジェクトは特定のレイヤーに割り当てられます。
  • テクスチャの割り当て: レンダリング パフォーマンスを最適化するために、テクスチャはページの各レイヤーに割り当てられます。
  • 描画コマンドの実行: 各レイヤーのフレーム/レンダー オブジェクトが走査され、それぞれのレイヤーに対して描画コマンドが実行されます。このレンダリングは CPU で処理することも、D2D (Direct2D) や SkiaGL などのテクノロジーを使用して GPU で直接描画することもできます。
  • *計算値の再利用: * レンダリング プロセスでは、Web ページの前回のレンダリングで計算された値を利用できるため、計算作業が少なく、より効率的な増分変更が可能になります。
  • レイヤーの合成: 最終的なページ レイヤーは合成プロセスに送信され、そこでブラウザーの Chrome、iframe、アドオン パネルなどの他の表示コンテンツと結合されます。
  • レンダリング コマンドの最終処理: 最終的なレイヤー位置が計算され、Direct3D や OpenGL などのグラフィックス API を介して複合コマンドが発行されます。 GPU コマンド バッファは非同期レンダリングのために GPU にフラッシュされ、完成したフレームは表示のためにウィンドウ サーバーに送信されます。 How does the internet work? Part 1

GPUレンダリング

  • レンダリング プロセス中、グラフィック コンピューティング タスクは汎用 CPU または専用グラフィック プロセッサ GPU を利用できます。
  • グラフィック レンダリングの計算に GPU を利用する場合、グラフィック ソフトウェア レイヤーはワークロードを複数の小さなタスクに分割します。このアプローチにより、GPU の大規模並列処理を最大限に活用することができ、レンダリング プロセスで必要な浮動小数点計算に特に効果的です。
  • GPU は多数の操作を同時に処理することに優れており、複雑なビジュアル コンテンツを効率的かつ迅速にレンダリングするのに適しています。この並列処理機能により、特に高解像度のグラフィックス、アニメーション、リアルタイム レンダリングを含むアプリケーションのパフォーマンスが大幅に向上します。
  • その結果、GPU を使用すると、レンダリング プロセスが高速化されるだけでなく、最新の Web アプリケーションやグラフィックスを多用するソフトウェアにおいて、より洗練された視覚効果とよりスムーズなユーザー エクスペリエンスが可能になります。

How does the internet work? Part 1

この画像も GPU によってレンダリングされます

レンダリング後の実行とユーザーによる実行

レンダリング プロセスが完了すると、ブラウザは、タイミング メカニズム (Google Doodle アニメーションなど) やユーザー インタラクション (検索ボックスにクエリを入力して候補を受け取るなど) などのさまざまなイベントによってトリガーされる JavaScript コードを実行します。

  • プラグイン: さらに、Flash や Java などのプラグインも実行される可能性がありますが、通常、この時点では Google ホームページでは実行されません。
  • ネットワーク リクエスト: JavaScript スクリプトは、必要に応じて追加のリソースやデータを取得して、さらなるネットワーク リクエストを開始できます。
  • DOM の変更: これらのスクリプトには、既存のページまたはそのレイアウトを変更する機能があり、これによりページのレンダリングとペイントが再度行われる可能性があります。この動的な機能により、ユーザーのアクションやその他の条件に基づいてコンテンツがリアルタイムで変化するインタラクティブなエクスペリエンスが可能になり、Web アプリケーションの全体的な機能と応答性が向上します。 JavaScript の実行とレンダリング エンジンの間の対話は、リッチで魅力的な Web エクスペリエンスを作成し、開発者がユーザー入力やコンテキストの変化に直感的に応答するアプリケーションを構築するために非常に重要です。

以上がインターネットはどのように機能するのでしょうか?パート 1の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート