網絡是怎樣鏈接的-委託協議棧發送消息

1.4 委託協議棧發送消息

1.4.1 數據收發操做概覽

得到 IP 地址後,就能夠委託操做系統內部的協議棧向這個目標 IP地址,也就是咱們要訪問的 Web 服務器發送消息。git

要發送給 Web 服務器的 HTTP 消息是一種數字信息(digital data),所以也能夠說是委託協議棧來發送數字信息。瀏覽器

這一操做的過程也不只適用於Web,而是適用於任何網絡應用程序。和向 DNS 服務器查詢 IP 地址的操做同樣,這裏也須要使用 Socket 庫中的程序組件。服務器

向操做系統內部的協議棧發出委託時,須要按照指定的順序來調用 Socket 庫中的程序組件。網絡

收發數據操做的總體思路

使用 Socket 庫來收發數據的操做過程以下圖所示 。圖中展現的是用 TCP 協議來收發數據的過程,還有另一種名爲UDP的協議socket

簡單來講,收發數據的兩臺計算機之間鏈接了一條數據通道,數據沿着這條通道流動,最終到達目的地。spa

 

在進行收發數據操做以前,雙方須要先創建起這條管道才行。操作系統

創建管道的關鍵在於管道兩端的數據出入口,這些出入口稱爲套接字。設計

咱們須要先建立套接字,而後再將套接字鏈接起來造成管道。對象

創建鏈接的具體流程blog

首先,服務器一方先建立套接字,而後等待客戶端向該套接字鏈接管道。當服務器進入等待狀態時,客戶端就能夠鏈接管道了。

客戶端也會先建立一個套接字,而後從該套接字延伸出管道,最後管道鏈接到服務器端的套接字上。

當雙方的套接字鏈接起來以後,通訊準備就完成了。接下來只要將數據送入套接字就能夠收發數據。

收發數據操做結束時的情形

當數據所有發送完畢以後,鏈接的管道將會被斷開。

管道在鏈接時是由客戶端發起的,但在斷開時能夠由客戶端或服務器任意一方發起。

其中一方斷開後,另外一方也會隨之斷開,當管道斷開後,套接字也會被刪除。

到此爲止,通訊操做就結束了。

收發數據操做總結

綜上所述,收發數據的操做分爲若干個階段,能夠大體總結爲如下 4 個。

(1)建立套接字(建立套接字階段)

(2)將管道鏈接到服務器端的套接字上(鏈接階段)

(3)收發數據(通訊階段)

(4)斷開管道並刪除套接字(斷開階段)

在每一個階段,Socket 庫中的程序組件都會被調用來執行相關的數據收發操做。

前面這4個操做都是由操做系統中的協議棧來執行的,瀏覽器等應用程序並不會本身去作鏈接管道、放入數據這些工做,而是委託協議棧來代勞。

本章將要介紹的只是這個「委託」的操做。關於協議棧收到委託以後具體是如何鏈接管道和放入數據的,咱們將在第 2 章介紹。

這些委託的操做都是經過調用 Socket 庫中的程序組件來執行的,但這些數據通訊用的程序組件其實僅僅充當了一個橋樑的角色,並不執行任何實質性的操做,應用程序的委託內容最終會被原本來本地傳遞給協議棧。

所以,後文將會採用 將 Socket 庫和協議棧當作一個總體的講法,讓人更容易理解。不要忘記Socket 庫這一橋樑的存在。

1.4.2 建立套接字階段

應用程序委託收發數據的過程

須要按照必定的順序調用若干個程序組件,過程以下圖所示。

套接字建立階段

客戶端建立套接字的操做很是簡單,只要調用 Socket 庫中的 socket 程序組件就能夠了(圖 1.18 ①)。

調用 socket 以後,控制流程會轉移到 socket 內部並執行建立套接字的操做,完成以後控制流程又會被移交回應用程序。

第2章會細講解這部分。只要知道調用 socket 後套接字就建立好了就能夠了。

協議棧返回給應用程序描述符

套接字建立完成後,協議棧會返回一個描述符應用程序會將收到的描述符存放在內存中。

描述符是用來識別不一樣的套接字的。

當建立套接字後,咱們就可使用這個套接字來執行收發數據的操做了。

這時,只要咱們出示描述符,議棧就可以判斷出咱們但願用哪個套接字來鏈接或者收發數據了。

 

 

1.4.3 鏈接階段:把管道接上去

咱們須要委託協議棧將客戶端建立的套接字與服務器那邊的套接字鏈接起來。

應用程序經過調用 Socket 庫中的名爲 connect 的程序組件來完成這一操做。這裏的要點是當調用 connect 時,須要指定描述符、服務器 IP 地址和端口號這 3 個參數,如上圖②所示。

Connect的三個參數

描述符

是在建立套接字的時候由協議棧返回的那個描述符。

connect 會將應用程序指定的描述符告知協議棧,而後協議棧根據這個描述符來判斷到底使用哪個套接字去和服務器端的套接字進行鏈接,並執行鏈接的操做。

IP 地址

就是經過 DNS 服務器查詢獲得的要訪問的服務器的 IP 地址。

端口號

描述符是和委託建立套接字的應用程序進行交互時使用的,並非用來告訴網絡鏈接的另外一方的,所以另外一方並不知道這個描述符。

咱們須要另一個對客戶端也一樣適用的機制,而這個機制就是端口號。

若是說描述符是用來在一臺計算機內部識別套接字的機制,那麼端口號就是用來讓通訊的另外一方可以識別出套接字的機制 。

端口號的運行機制

只要指定了事先規定好的端口號,就能夠鏈接到相應的服務器程序的套接字。

也就是說,瀏覽器訪問 Web 服務器時使用 80 號端口,這是已經規定好的。

客戶端在建立套接字時,協議棧會爲這個套接字隨便分配一個端口號。

當協議棧執行鏈接操做時,會將這個隨便分配的端口號通知給服務器。

描述符

應用程序用來識別套接字的機制

IP 地址和端口號

客戶端和服務器之間用來識別對方套接字的機制

總結

調用 connect 時,協議棧就會執行鏈接操做。

當鏈接成功後,協議棧會將對方的 IP 地址和端口號等信息保存在套接字中,這樣咱們就能夠開始收發數據了。

 

1.4.4 通訊階段:傳遞消息

將數據送入套接字,數據就會被髮送到對方的套接字中應用程序沒法直接控制套接字,所以仍是要經過 Socket 庫委託協議棧來完成這個操做。

write組件指定描述符和要發送的數據

這個操做須要使用 write 這個程序組件,具體過程以下。

①應用程序須要在內存中準備好要發送的數據。根據用戶輸入的網址生成的 HTTP 請求消息就是咱們要發送的數據。

②當調用 write時,須要指定描述符和發送數據,如上圖③所示。

③協議棧將數據發送到服務器。

因爲套接字中已經保存了已鏈接的通訊對象的相關信息,

因此只要經過描述符指定套接字,就能夠識別出通訊對象,並向其發送數據。

服務器接收後向客戶端返回響應消息

④發送數據會經過網絡到達咱們要訪問的服務器。

⑤服務器執行接收操做,解析收到的數據內容並執行相應的操做,向客戶端返回響應消息。

當消息返回後,須要執行的是接收消息的操做。

客戶端接收消息調用read組件

接收消息的操做是經過 Socket 庫中的 read 程序組件委託協議棧來完成的,如上圖③所示。

調用read 時須要指定用於存放接收到的響應消息的內存地址,這一內存地址稱爲接收緩衝區。

⑥當服務器返回響應消息時,read 就會負責將接收到的響應消息存放到接收緩衝區中。

因爲接收緩衝區是一塊位於應用程序內部的內存空間,所以當消息被存放到接收緩衝區中時,就至關於已經轉交給了應用程序。

 

1.4.5 斷開階段:收發數據結束

當瀏覽器收到數據以後,收發數據的過程就結束了。接下來,咱們須要調用 Socket 庫的 close 程序組件進入斷開階段如上圖 ④。

最終,鏈接在套接字之間的管道會被斷開,套接字自己也會被刪除。

斷開的過程

Web 使用的 HTTP 協議規定,當 Web 服務器發送完響應消息以後,應該主動執行斷開操做

Web 服務器會首先調用close 來斷開鏈接。

斷開操做傳達到客戶端以後,客戶端的套接字也會進入斷開階段。

當瀏覽器調用 read 執行接收數據操做時,read 會告知瀏覽器收發數據操做已結束,鏈接已經斷開。瀏覽器得知後,也會調用close 進入斷開階段。

註釋

根據應用種類不一樣,客戶端和服務器哪一方先執行 close 都有可能。

有些應用中是客戶端先執行 close,而另一些應用中則是服務器先執行 close。

圖片等文件的請求過程

HTTP 協議將 HTML 文檔和圖片都做爲單獨的對象來處理,每獲取一次數據,就要執行一次鏈接、發送請求消息、接收響應消息、斷開的過程。

所以後來人們又設計出了可以在一次鏈接中收發多個請求和響應的方法。

在 HTTP 版本 1.1 中就可使用這種方法,在這種狀況下,當全部數據都請求完成後,瀏覽器會主動觸發斷開鏈接的操做。

 

第一章小測驗

1. http://www.nikkeibp.co.jp/ 中的 http 表明什麼意思?

http是網絡協議名稱

2. 下面兩個網址有什麼不一樣?

a. http://www.nikkeibp.co.jp/sample

b. http://www.nikkeibp.co.jp/sample/

a可能訪問的是sample目錄以及其下的默認主頁,也多是名爲sample的文件。而b就是訪問域名下sample目錄下的默認主頁

3. 用來識別鏈接在互聯網上的計算機和服務器的地址叫什麼?

IP地址

4. 根據Web服務器的域名來查詢IP地址時所使用的服務器叫什麼?

DNS服務器

5. 向 DNS 服務器發送請求消息的程序叫什麼?

解析器

相關文章
相關標籤/搜索