note-網絡是怎樣連接的6 請求到達服務器,響應返回瀏覽器

助記提要
  1. 服務器程序的結構
  2. 套接字的指代方式
  3. MAC模塊的接收過程
  4. IP模塊的接收過程
  5. TCP模塊處理連接包
  6. TCP模塊處理數據包
  7. TCP模塊的斷開操作
  8. URI轉換為實際文件路徑
  9. URI調用程序
  10. Web服務器訪問控制
  11. 響應內容的類型

6章 請求到達服務器,響應返回瀏覽器

1 服務器概覽

在數據收發層面,不需要區分客戶端和服務器。連接操作上需要區分:發起連接的是客戶端,等待連接的是服務器。
服務器和客戶端的網絡相關的組件是相同的,但用法不同。
服務器可以與多臺客戶端通信,它的程序結構和客戶端也不同。

1.1 服務器程序結構

服務器程序分為等待連接模塊和與客戶端通信的模塊。程序啟動并完成初始化后,就運行等待連接模塊,創建套接字后進入等待連接的暫停狀態。
客戶端發起連接時,該模塊恢復運行,并接受連接,啟動客戶端通信模塊,并移交完成連接的套接字。
客戶端通信模塊使用已連接的套接字和客戶端進行通信。通信結束后,通信模塊會退出。

每次有新的客戶端發起連接,都會啟動一個新的客戶端通信模塊,與客戶端是一對一的關系。

1.2 服務器程序調用socket庫的通信操作
客戶端通信模塊
等待連接模塊
和客戶端不同的地方
轉移控制
斷開 close()
發送數據 write(...)
接收數據 read(...)
創建套接字 socket(...)
接受連接 accept(...)
等待連接 listen(...)
綁定端口 bind(...)

accept接受到客戶端的包時,協議棧會給等待連接的套接字復制一個副本,并把連接對象等控制信息寫到新的套接字中。這時等待連接模塊會啟動客戶端通信模塊,并將套接字副本會轉交給客戶端通信模塊。

1.3 多個套接字副本的端口號

復制出套接字副本后,原先的套接字仍然處于等待連接狀態。新的客戶端的包到達時,它又會執行接受連接操作,再次復制一個套接字副本。

  • 套接字的指代方式
    新創建的套接字副本和原來等待連接的套接字具有一樣的的端口號,以讓客戶端判斷收到的包是正確的程序發來的,比如http的連接套接字都使用80端口號。但是當客戶端的包到達時,服務器僅憑接收方端口號無法判斷該把包交給哪一個套接字。
    服務器的套接字可能有相同的端口號,但是客戶端的套接字都是對應不同的端口號的。因此能通過客戶端的端口號確定服務器上的某個套接字。
    在有多個客戶端時,不同客戶端的端口號可能是重復的,所以必須再加上客戶端的IP地址才能判斷。

IP頭部和TCP頭部包含了4項信息:接收方IP、接收方端口號、發送方IP、發送方端口號。通過這4項信息就能確定某個套接字。

  • 描述符指代套接字
    描述符也用來指代套接字。因為在等待連接的時候,沒有客戶端IP和端口號。而且描述符僅使用一種信息,表示起來比4種信息簡單。

2 服務器的接收操作

2.1 網卡把信號還原為數字信息
  1. 從報頭讀取識別時鐘信號,按相同的周期延長時鐘信號;
  2. 在每個時鐘周期位置檢測信號的變化方向,根據信號變化方向還原出0和1;
  3. 根據校驗公式計算數字信息,與包尾的幀校驗序列比較;如果不一致,說明數據錯誤,包會被丟棄(TCP檢測到丟包后會自動處理)。
  4. 校驗成功后,就檢查MAC頭部的接收方MAC地址,確認這個包是發給自己的。
  5. 都確認無誤后,把數字信息保存在網卡的緩沖區中。
  6. 網卡通過中斷,告知CPU有網絡包到達;
  7. CPU切換到網卡驅動程序,從網卡緩沖區讀取包,根據MAC頭部的以太類型字段判斷協議種類,然后交給相應的協議棧。
2.2 IP模塊接收步驟
  1. 檢查IP頭部格式是否符合規范;
  2. 查看接收方IP地址是不是自己;
  3. 檢查包有沒有被分片,如果是分片的包,就把包暫存在內存中,等所有分片到達后組裝為原始包。
  4. 檢查IP頭部的協議號字段,交給對應的模塊。如協議號為06交給TCP模塊,協議號為11交給UDP模塊。
2.3 TCP模塊的操作
TCP模塊處理連接包

TCP模塊發現TCP頭部控制位的SYN為1時,說明是一個發起連接的包。

  1. TCP模塊檢查包的接收方端口號,看該端口上有沒有正處于等待連接狀態的套接字。如果沒有等待連接的套接字,則像客戶端返回錯誤通知。
  2. 如果存在等待連接的套接字,就為這個套接字復制一個新的副本,將發送方IP、端口、序號初始值、窗口大小等信息寫入這個套接字,并分配用于發送緩沖區和接收緩沖區的內存空間。
  3. 生成代表確認的ACK號,和發送數據的序號初始值、接收緩沖區的窗口大小等信息生成TCP頭部,委托IP模塊發給客戶端。
  4. 客戶端收到后,返回表示確認的ACK號。ACK號到達服務器后,連接就完成了。
TCP模塊處理數據包
  1. 根據包的IP頭部的發送方IP、接收方IP,和TCP頭部的接收方端口、發送方端口找到數據包對應的套接字。
  2. 根據套接字中保存的上一個序號和數據長度計算下一個序號,檢查該序號和包的TCP頭部中的序號是否一致。一致說明包未丟失,這時TCP模塊從包中提取數據放到接收緩沖區,和之前的數據連接起來。
  3. 數據進入接收緩沖區后,TCP模塊生成確認應答的TCP頭部,根據接收包的序號和數據長度計算出ACK號,委托IP模塊發給客戶端。
  4. 應用程序調用read,TCP模塊把接收緩沖區的數據轉交給應用程序。
TCP模塊的斷開操作
  1. 服務器程序調用close時,TCP模塊生成控制位FIN為1的TCP頭部,委托IP模塊發送給客戶端;
  2. 客戶端收到后,返回一個ACK號,確認收到;
  3. 客戶端調用close,生成一個FIN為1的TCP頭部發送給服務器;
  4. 服務器返回ACK號,完成斷開操作。對應的套接字一段時間后會被刪除。

3 Web服務器程序解釋請求消息并作出響應

3.1 URI轉換為實際文件名

請求消息中包括請求方法和表示數據源的URI,服務器程序根據這些信息向客戶端返回數據。

Web服務器公開的目錄不是磁盤上的實際目錄,而是虛擬目錄。URI中寫的就是在虛擬目錄結構下的路徑名。在讀取文件時,需要先查詢虛擬目錄與實際目錄的對應關系,并將URI轉換成實際的文件名,才能讀取并返回數據。

URI中省略文件名時,服務器會讀取預先設定好的默認文件名。
可以設置文件名改寫規則,在URI中的路徑符合改寫規則時,將URI中的文件名改寫為其他文件名進行訪問。這在服務器的目錄和文件發生變化并且需要用戶通過原來的網址訪問時很有用。

3.2 CGI程序

URI指定的文件內容不一定是HTML文檔,也可能時一個程序。這時服務器會運行這個程序,然后將程序的輸出返回給客戶端。

瀏覽器將需要服務器程序處理的數據放在HTTP請求消息中發送給服務器。數據加在HTTP消息中的兩種方法,一是通過GET方法,把輸入的數據作為參數添加在URI后面;二是通過POST方法,把數據放在HTTP請求體中發送給服務器。

收到請求消息后,Web服務器檢查URI指定的文件名是不是程序。如果是程序,Web服務器會委托操作系統運行這個程序,然后從請求消息中取出數據交給該程序。

程序處理后,輸出結果一般會嵌入HTML中。Web服務器將其作為響應消息返回給客戶端。

3.3 Web服務器訪問控制

訪問控制可以根據預先設定的規則,允許或禁止訪問。

收到請求時,服務器根據URI判斷數據源,并檢查數據源對應的訪問控制規則,只有允許訪問時才讀取文件或運行程序。

根據IP地址控制

接受連接時就能知道客戶端的IP地址,可以檢查是否允許訪問。

根據客戶端域名控制

先根據IP地址向DNS服務器查詢客戶端域名,然后再用該域名查詢一下IP地址,看結果是否和發送方IP一致。如果一致則檢查對應的訪問控制規則。
這種方式需要和DNS服務器做多次查詢,會使Web服務器響應速度變慢。

有一種在DNS服務器上注冊假域名的攻擊方式,因此需要雙重檢查。

根據用戶名和密碼控制

收到需要用戶名和密碼的訪問時,Web服務器會向客戶端發送一條響應消息,告訴用戶需要在請求消息中放入用戶名和密碼。
瀏覽器收到該消息,會彈出輸入用戶名和密碼的窗口,用戶輸入用戶名和密碼后,瀏覽器把這些消息放入請求消息中重新發給服務器。
服務器檢查收到的用戶名和密碼,與注冊的信息一致時,才返回數據。

3.4 做出響應

Web服務器調用write,把響應消息交給協議棧,告訴協議棧這個消息對應的套接字。
協議棧會把數據拆分為多個包,加上頭部發出去。

4 瀏覽器接收響應消息并顯示內容

4.1 通過響應的數據類型判斷內容

Web可以處理很多類型的數據,每種類型的顯示方法都不同。
可以根據響應消息的頭部字段Content-Type判斷數據類型。

Content-Type: 主類型/子類型; charset=utf-8

Content-Type定義的數據類型:

主類型含義子類型
text文本數據html,HTML文檔;
plain,純文本;
image圖像數據jpeg,JPEG格式圖片;
gif,GIF格式圖片;
audio音頻數據mpeg,MP2、MP3格式的音頻;
video視頻數據mpeg,MPEG格式的視頻;
quicktime,Quicktime格式的視頻;
model對物體的形狀和動作進行建模的數據vrml,VRML格式的建模數據;
application應用程序數據pdf,PDF文檔數據;
msword,MS-WORD格式的文檔數據;
message直接存放郵件等消息時使用的類型rfc822,一般的郵件數據,包含From、Date等頭部數據;
multipart消息體中包含多個部分的數據mixed,消息體中包含不同格式的數據,其中每部分數據都有單獨定義的媒體類型;

當數據類型為文本時,需要用charset附加文本的編碼信息。utf-8表示Unicode,euc-jp表示EUC編碼,ISO-022-jp表示JIS編碼,shift_jis表示JIS編碼。

如果消息的內容是通過壓縮或編碼技術轉換過的,還需要檢查Content-Encoding字段,得知如何將消息中的數據還原為原始數據。

4.2 瀏覽器在網頁顯示內容

HTML文檔按照標簽表示文檔的布局和字體等樣式信息。瀏覽器解釋這些標簽,并按照指定的樣式顯示文檔內容。
HTML文檔中有表示圖片和視頻的標簽。瀏覽器遇到這些標簽時,會向服務器請求其中的圖片或視頻數據。Web服務器返回數據后,瀏覽器解壓該數據,然后委托操作系統顯示。
Web服務器還會返回一些應用程序的數據,瀏覽器會調用相應的程序,或者是自身的插件。不同類型的數據和不同程序的對應關系在瀏覽器中已經設置好了。

顯示操作實際上是操作系統完成的,瀏覽器負責對系統發出指令。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38800.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38800.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38800.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

昇思25天學習打卡營第03天 | 張量 Tensor

昇思25天學習打卡營第03天 | 張量 Tensor 文章目錄 昇思25天學習打卡營第03天 | 張量 Tensor張量張量的創建張量的屬性Tensor與NumPy轉換稀疏張量CSRTensorCOOTensor 總結打卡 張量 張量(Tensor)是一種類似于數組和矩陣的特殊數據結構,是神經…

MATLAB|更改繪圖窗口的大小和位置

MATLAB繪圖 plot、plot3、cdfplot都適用 效果 如下圖,運行程序后可以直接得到這兩個繪圖窗口。 右上角的Figure1是原始圖片,右下角的Figure2是調整了位置和大小后的繪圖窗口。 完整源代碼 % 繪圖大小和位置調整 % Evand©2024 % 2024-7-1/Ver1…

Transformer模型原理細節解析

基本原理: Transformer 的核心概念是 自注意力機制(Self-Attention Mechanism),它允許模型在處理每個輸入時“關注”輸入序列的不同部分。這種機制讓模型能夠理解每個單詞或符號與其他單詞或符號之間的關系,而不是逐個地線性處理輸入。 Transformer 主要由兩個部分組成:…

手把手教你搭建PyTorch環境:MindStudio中PyTorch模型開發實戰

本次實驗的視頻鏈接如下:?https://www.bilibili.com/video/BV1iA4y1f7o1/ 本次實驗在MindStudio上進行,請先按照 教程 配置環境,安裝MindStudio。 ? MindStudio的是一套基于華為自研昇騰AI處理器開發的AI全棧開發工具平臺,該IDE上功能很多…

Boost 智能指針

scoped_ptr 不能被復制或賦值給其他 scoped_ptr 對象,不能與其他指針比較 (除了 nullptr) scoped_ptr 用例 template <typename T> class scoped_ptr {public:// 構造函數:初始化 scoped_ptr 并接管指針的所有權explicit scoped_ptr(T* ptr = nullptr) : ptr_(ptr) …

Flink CDC的使用

MySQL數據準備 create database if not exists test; use test; drop table if exists stu; create table stu (id int primary key auto_increment, name varchar(100), age int); insert into stu(name, age) values("張三",18); insert into stu(name, age) valu…

ESOP 系統助力電子設備公司的管理模式升級

在科技飛速發展的時代&#xff0c;電子設備行業競爭愈發激烈&#xff0c;企業要想在市場中立足并持續發展&#xff0c;不斷升級管理模式成為關鍵。ESOP系統的引入&#xff0c;為電子設備公司帶來了全新的機遇&#xff0c;有力地推動了管理模式的升級。 ESOP 系統首先為電子設備…

element el-table表格切換分頁保留分頁數據+限制多選數量

el-table表格并沒有相關的方法來禁用表頭里面的多選按鈕 那么我們可以另辟蹊徑&#xff0c;來實現相同的多選切換分頁&#xff08;保留分頁數據&#xff09; 限制多選數量的效果 <el-table:data"tableData"style"width: 100%">// 不使用el-talbe自帶…

農村程序員陳隨易2024年中總結

今天是 2024年7月1日&#xff0c;時間如白駒過隙&#xff0c;今年已去其一半。 總結一下今年上半年的情況&#xff0c;給大家提供一些參考和建議。 希望大家關注一下公眾號 陳隨易&#xff0c;有些內容只在公眾號發表。 先看看我的年初計劃&#xff0c;這個在今年年初的時候&…

泛微E9開發 限制明細表列的值重復

限制明細表列的值重復 1、需求說明2、實現方法3、擴展知識點3.1 修改單個字段值&#xff08;不支持附件類型&#xff09;3.1.1 格式3.1.2 參數3.1.3 案例 3.2 獲取明細行所有行標示3.2.1 格式3.2.2 參數說明 1、需求說明 限制明細表的“類型”字段&#xff0c;在同一個流程表單…

【全網首發】雙字重疊語序驗證碼識別

【省流&#xff1a;打算直接測試效果的可以訪問這個網址】 http://decaptcha.ai?project_namenetease_zh_overlap 【實現方案】 如圖所示&#xff0c;我們能看到&#xff0c;比起以往的“單個字”語序點選&#xff0c;這個驗證碼的難點在于“重疊漢字“&#xff0c;我們知道…

【Python機器學習】模型評估與改進——簡單的網格搜索

為了提升模型的泛化性能&#xff0c;我們可以通過調參來實現。 在嘗試調參之前&#xff0c;重要的是理解參數的含義&#xff0c;找到一個模型的重要參數&#xff08;提供最佳泛化性能的參數&#xff09;的取值是一項棘手的任務&#xff0c;但對于幾乎所有模型和數據集來說都是…

API-Window對象

學習目標&#xff1a; 掌握Window對象 學習內容&#xff1a; BOM&#xff08;瀏覽器對象模型&#xff09;定時器-延時函數JS執行機制location對象navigation對象history對象 BOM&#xff08;瀏覽器對象模型&#xff09;&#xff1a; BOM是瀏覽器對象模型。 window對象是一個全…

Windows 11的市場份額越來越大了,推薦你升級!

7月1日&#xff0c;系統之家發布最新數據&#xff0c;顯示Windows 11操作系統的市場份額正在穩步上升。自2021年10月Windows 11發布以來&#xff0c;Windows 10一直占據著市場主導地位&#xff0c;當時其市場份額高達81.44%。然而&#xff0c;隨著時間的推移&#xff0c;Window…

鴻蒙學習1:ArkTS基礎入門

1 變量和常量 1.1 變量 常見的基礎數據類型&#xff1a; string 字符串、number 數字、boolean布爾 判斷。 變量&#xff1a;專門用來存儲數據的容器。 語法&#xff1a;let 變量名: 數據類型 值。例如&#xff1a;let name: 張三;let price:number 12.4; let isSuccess …

【triton-inference-server】 官方python_backend 文檔及例子

https://github.com/triton-inference-server/python_backend#building-from-source 一。 從源碼構建python_backend root@ubuntu-server:/home/ubuntu/hzh# sudo apt-get install rapidjson-dev libarchive-dev zlib1g-dev Reading package lists... Done Building dependency…

vue3中的自定義指令

全局自定義指令 假設我們要創建一個全局指令v-highlight&#xff0c;用于高亮顯示元素。這個指令將接受一個顏色參數&#xff0c;并有一個可選的修飾符bold來決定是否加粗文本。 首先&#xff0c;在創建Vue應用時定義這個指令&#xff1a;&#xff08;這里可以將指令抽離成單…

昂科燒錄器支持BPS晶豐明源半導體的多相Buck控制器BPD93004E

芯片燒錄行業領導者-昂科技術近日發布最新的燒錄軟件更新及新增支持的芯片型號列表&#xff0c;其中BPS晶豐明源半導體的多相Buck控制器BPD93004E已經被昂科的通用燒錄平臺AP8000所支持。 BPD93004E是一款多相Buck控制器&#xff0c;支持原生1~4相&#xff0c;數字方式控制&am…

科普文:一文搞懂jvm原理(二)類加載器

概敘 科普文&#xff1a;一文搞懂jvm(一)jvm概敘-CSDN博客 前面我們介紹了jvm&#xff0c;jvm主要包括兩個子系統和兩個組件&#xff1a; Class loader(類裝載器) 子系統&#xff0c;Execution engine(執行引擎) 子系統&#xff1b;Runtime data area (運行時數據區域)組件&am…

Cambrian-1: A Fully Open, Vision-Centric Exploration of Multimodal LLMs

摘要 https://arxiv.org/pdf/2406.16860v1 我們介紹了Cambrian-1&#xff0c;這是一系列以視覺為中心的多模態大型語言模型&#xff08;MLLMs&#xff09;。盡管更強大的語言模型可以增強多模態能力&#xff0c;但視覺組件的設計選擇往往沒有得到充分的探索&#xff0c;并且與…