向作業系統內部的協議棧發出委託時,需要按照指定的順序來呼叫Socket庫中的程式元件。
應用程式是通過“描述符”這一類似號碼牌的東西來識別套接字的。
描述符:應用程式用來識別套接字的機制
IP地址和埠號:客戶端和伺服器之間用來識別對方套接字的機制
資料收發操作概覽
收發數字資訊這一操作不僅限於瀏覽器,對於各種使用網路的應用程式來說是都是共通的。
收發資料的兩臺計算機之間連線了一條資料通道,資料沿著這條通道流動,最終到達目的地。可以把它想象成一條管道,資料可以從任何一端被送入管道,資料的流動是雙向的。
這條管道一開始是不存在的,在進行收發資料操作之前,雙方需要先建立起這條管道才行。建立管道的關鍵在於管道兩端的資料出入口,稱為套接字。所以收發操作過程為以下4步:
(1)創接套接字(建立套接字階段)
(2)將管道連線到伺服器端的套接字上(連線階段)
(3)收發資料(通訊階段)
這4個操作都是由作業系統中的協議棧來執行的,瀏覽器等應用程式並不會自己去做連線管道,放入資料這些操作,而是委託協議棧來代勞。
這些委託的操作都是通過呼叫Socket庫中的程式元件來執行的,但這些資料通訊用的程式元件其實僅僅充當了一個橋樑的角色, 並不執行任何實質性的操作,應用程式的委託內容最終會被原原本本地傳遞給協議棧。
創接套接字階段
客戶端建立套接字的操作非常簡單,只要呼叫Socket庫中socket程式元件就可以了。建立完之後,協議棧就會返回一個描述符,應用程式會將收到的描述符存放在記憶體中。描述符是用來識別不同的套接字的(計算機中可能會同時存在多個數據的通訊操作,就需要建立多個不同的套接字來進行區分)。
只要我們出示描述符,協議棧就能夠判斷出我們希望用哪一個套接字來連線或收發資料了。
連線階段:把管道接上去
應用程式通過呼叫Socket庫中的名為connect程式元件來完成這一操作。當呼叫connect時,需要指定描述符、伺服器IP地址和埠號這三個引數。
當同時指定IP地址和埠號時,才可以明確識別出某臺具體的計算上的某個具體的套接字。為什麼不直接利用描述符呢?因為描述符是和委託創接套接字的應用程式進行互動時使用的,並不是用來告訴網路連線的另一方的,因些,另一方並不知道這個描述符。
如果說描述符是用來在一臺計算機內部識別套接字的機制,那麼埠號就是用來讓通訊的另一方能夠識別出套接字的機制。
那我們又怎麼知道另一方的埠號呢?首先,客戶端在建立套接字時,協議棧會為這個套接字隨便分配一個埠號。接下來,當協議棧執行連線操作時,會將這個隨機分配的埠號通知給伺服器。(以後會更詳細描述)
通訊階段:傳遞訊息
只要將資料傳入套接字,資料就會被髮送到對方的套接字中。也還是要通過Socket庫委託協議棧來完成這個操作。
傳送時利用write這個程式元件,接收時利用read程式元件,會負責將接收到響應訊息放到接收快取區中。接收快取區是一塊位於應用程式內部的記憶體空間。
斷開階段:收發資料結束
呼叫Socket庫中的close程式元件即可進入斷開階段。需要注意的是,重複的連線斷開效率是很低的,因此後來人們又設計出了能夠一次連線中收多個請求和響應的方法。在HTTP1.1中可以使用這種方法。
以上就是瀏覽器與Web伺服器之間收發資訊的過程,但實際負責收發資訊的是協議棧、網絡卡驅動和網絡卡,只有這3者相互配合,資料才能夠在網路上流動起來。