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