標籤:
第二章 Linux網路編程
2.1客戶——伺服器模型
目前大多數網路應用程式在編寫時都採用客戶—伺服器模型,假設一端是客戶,另一端是伺服器,讓伺服器提供給客戶一定的服務內容。它要求有一方(伺服器方)在啟動執行程式後(無限期地)等待其他用戶端程式與之通訊。這裡可以再分為兩種具體類型:並髮型互動與重複型互動。
(1)並髮型互動。在並髮型互動模式下,程式的主要運作步驟如下:
·等待一個客戶請求的到來;
·產生一個新的進程或者任務來處理這個客戶請求,同時這裡還可以接收其他客戶的請求,處理結束後,終止這個進程;
·反饋用戶端;
·等待新的客戶請求的到來並進行下一次服務,如此迴圈運作。
(2) 重複型互動。重複型互動模式下,程式的主要運作步驟如下:
·等待一個客戶請求的到來;
·處理客戶的請求,對客戶進行服務;
·給客戶回函資訊,服務結束;
·等待下一個請求到來,如此迴圈。
這裡重複型互動的缺點就是在伺服器給一個客戶處理請求服務的時候,不能接收和處理其他客戶的請求;而並髮型互動就可以解決這個問題,但要多線程作業系統的支援。一般來說,UDP 伺服器採用重複型互動,TCP 伺服器採用並髮型互動。 客戶/伺服器模式要求每個應用程式由兩個部分組成:一個部分負責啟動通訊,另一個部分負責對它進行應答。它們通常是運行在不同的主機上,分別被稱為客戶機和伺服器。伺服器並不特定指網路上的一台機器,它可以是網路上可提供服務的任何程式,同樣,客戶機也是指使用者為了得到某種服務所需要啟動並執行應用程式。由於用戶端和伺服器端在網路通訊中表現出來的不同的功能,對它們編程要採用不同的演算法。
2.2連線導向和不需連線的客戶—伺服器
在設計客戶—伺服器軟體時,必須在兩種類型的互動中做出選擇:不需連線的風格或連線導向的風格。這兩種風格的互動直接對應於 TCP/IP 協議族所提供的兩個主要的傳輸協議。如果客戶和伺服器使用使用者資料報(UDP)進行通訊,那麼互動就是不需連線的;如果使用傳輸控制通訊協定(TCP),則互動就是連線導向的。由於連線導向風格的互動協議使編程更簡單,程式更可靠,因此採用TCP協議的客戶—伺服器模型是我們的首選。
2.3 TCP 串連通訊過程
TCP是一種連線導向的、可靠的位元組流傳輸協議,通訊之前,雙方之間必須建立一條串連,通訊結束後再釋放。
為了建立一條可靠的串連,TCP採用三向交握的方式:
(1)客戶機(請求端)向伺服器發出同步段(SYN),請求接入。
(2)伺服器向客戶機發出同步—應答段(SYN—ACK)。一方面作為對客戶請求接入的響應,另一方面要求用戶端也進行接入。
(3)客戶機向伺服器再發出應答段(ACK)。作為對伺服器所發請求接入的響應。
終止一個TCP串連共要經過4次握手:
(1)客戶機向伺服器發出關閉段(FIN)。此時,客戶機不能再向遠方伺服器發送資料,但是可以繼續接收資料。
(2)伺服器向客戶機發出關閉—應答段。此時伺服器還可以向客戶機發送資料,即接入處於“半關閉”狀態。
(3)伺服器向客戶機發出關閉段(FIN),關閉本側的接入,仍可接收資料。一方面作為客戶關閉接入的響應,另一方面要求用戶端也須關閉接入。此時,伺服器不能再發送資料。
(4)客戶機為響應伺服器的關閉,向伺服器發出關閉—應答段。
2.4 TCP協議的socket編程
socket編程簡單的說就是使兩台或多台連網的電腦相互交換資料。
2.4.1 TCP 套介面串連中的主要函數的調用
TCP 套介面串連中的主要調用的函數有socket,bind,connect,write,listen,close等。TCP/IP協議的客戶/伺服器機制工作過程如所示:
2.4.2 Linux 中套介面的資料結構
套介面資料結構同時與使用它的網路有關。在Linux中,每一種協議都有自己的網路地址資料結構,這些結構以sockaddr_開頭,不同的尾碼表示不同的協議,如IPv4對應的是sockaddr_in。
2.5編程演算法實現
2.5.1用戶端的演算法
客戶可以按照以下演算法構造與某個伺服器的串連並與該伺服器通訊。
(1)找到與其通訊的伺服器的IP地址和協議連接埠號碼;
(2)分配通訊端;
(3) 指明此串連需要在本地機器中的、任意的、未使用的協議連接埠,並允許TCP選擇一個這樣的連接埠;
(4)將這個通訊端串連到伺服器;
(5)使用應用級協議與伺服器進行通訊(此常包含發送請求和等待應答);
(6)關閉串連。
2.5.2 服務端的演算法
(1)並發伺服器
伺服器在一個時刻可以處理多個請求的伺服器,稱為並發伺服器。我們採用並發的、連線導向伺服器的演算法,下面給出了並發伺服器使用連線導向協議的演算法步驟:
主 1.建立通訊端並將其綁定到所提供服務的設定的地址上。該通訊端保持
非串連的。
主2.將該連接埠設定為被動模式,使其準備為伺服器所用。
主3.反覆調用accept以便接收來自客戶的下一個串連請求,並建立新的從
線程或進程來處理響應。
從1.由主線程傳遞來得串連請求(即針對串連的通訊端開始)。
從2.用該串連與客戶進行互動:讀取請求並發迴響應。
從3.關閉串連並退出。在處理完來自客戶的所有請求後,從線程就退出。
(2)多線程與多進程並發伺服器
Linux提供了兩種形式的並發性——進程和線程,所以有兩種常見的主—從模式實現:一種是伺服器建立多個進程,每個進程都有一個執行線程。另一種實現是,伺服器在一個進程中建立多個執行線程。
(3)依賴單線程和非同步I/O處理多個已連線的服務器
在單線程實現中,一個執行線程管理多個串連。它通過使用非同步I/O來達到表面上的並發性。伺服器反覆地在它所開啟的串連上等待I/O,收到請求便進行處理。由於單個線程處理所有的串連,它就可以在多個串連之間共用資料。然而因為伺服器只有一個線程,即使在一個具有多個處理器的電腦上,它處理請求的速度不會比迴圈伺服器更快。應用程式必須共用資料或者對每個請求的處理時間必須很短,只要在這種情況下這種伺服器實現方案才是可取的。
Linux網路編程