天天看點

不可不知 Linux作業系統網絡伺服器模型

 linux系統網絡伺服器模型主要有兩種:并發伺服器和循環伺服器。

  所謂并發伺服器就是在同一個時刻可以處理來自多個用戶端的請求;循環伺服器是指伺服器在同一時刻指可以響應一個用戶端的請求。而且對于tcp和udp套接字,這兩種伺服器的實作方式也有不同的特點。

  1、tcp循環伺服器:

  首先tcp伺服器接受一個用戶端的連接配接請求,處理連接配接請求,在完成這個用戶端的所有請求後斷開連接配接,然後再接受下一個用戶端的請求。

  建立tcp循環伺服器的算法如下:socket(……); //建立一個tcp套接字bind(……); //邦定公認的端口号listen(……); //傾聽用戶端連接配接while(1) //開始循環接收用戶端連接配接{ accept(……);//接收目前用戶端的連接配接while(1)

  { //處理目前用戶端的請求read(……);process(……);write(……);} close(……); //關閉目前用戶端的連接配接,準備接收下一個用戶端連接配接} tcp循環伺服器一次隻處理一個用戶端的請求,如果有一個用戶端占用伺服器不放時,其它的客戶機連接配接請求都得不到及時的響應。是以,tcp伺服器一般很少用循環伺服器模型的。

  2、tcp并發伺服器:

  并發伺服器的思想是每一個用戶端的請求并不由伺服器的主程序直接處理,而是伺服器主程序建立一個子程序來處理。

  建立tcp并發伺服器的算法如下:socket(……); //建立一個tcp套接字bind(……); //邦定公認的端口号listen(……);//傾聽用戶端連接配接while(1) //開始循環接收用戶端的接收{ accept(……);//接收一個用戶端的連接配接if(fork(……)==0) //建立子程序{ while(1)

  { //子程序處理某個用戶端的連接配接read(……);process(……);write(……);} close(……); //關閉子程序處理的用戶端連接配接exit(……) ;//終止該子程序} close(……); //父程序關閉連接配接套接字描述符,準備接收下一個用戶端連接配接} tcp并發伺服器可以解決tcp循環伺服器用戶端獨占伺服器的情況。但同時也帶來了一個不小的問題,即響應客戶機的請求,伺服器要建立子程序來處理,而建立子程序是一種非常消耗資源的操作。

  3、udp循環伺服器:

  udp伺服器每次從套接字上讀取一個用戶端的資料報請求,處理接收到的udp資料報,然後将結果傳回給客戶機。

  建立udp循環伺服器的算法如下:socket(……); //建立一個資料報類型的套接字bind(……); //邦定公認的短口号while(1) //開始接收用戶端的連接配接{ //接收和處理用戶端的udp資料報recvfrom(……);process(……);sendto(……);//準備接收下一個客戶機的資料報}因為udp是非面向連接配接的,沒有一個用戶端可以獨占伺服器。隻要處理過程不是死循環,伺服器對于每一個客戶機的請求總是能夠處理的。

  udp循環伺服器在資料報流量過大時由于處理任務繁重可能造成客戶技資料報丢失,但是因為udp協定本身不保證資料報可靠到達,是以udp協定是允許丢失資料報的。

  鑒于以上兩點,一般的udp伺服器采用循環方式4、udp并發伺服器把并發的概念應用udp就得到了并發udp伺服器,和并發tcp伺服器模型一樣是建立子程序來處理的。

  建立udp并發伺服器的算法如下:socket(……); //建立一個資料報類型的套接字bind(……); //邦定公認的短口号while(1) //開始接收用戶端的連接配接{ //接收和處理用戶端的udp資料報recvfrom(……);if(fork(……)==0) //建立子程序{ process(……);sendto(……);}除非伺服器在處理用戶端的請求所用的時間比較長以外,人們實際上很少用這種udp并發伺服器模型的。

  4、多路複用i/o并發伺服器:

  建立子程序會帶來系統資源的大量消耗,為了解決這個問題,采用多路複用i/o模型的并發伺服器。采用select函數建立多路複用i/o模型的并發伺服器的算法如下:

  初始化(socket,bind,listen);while(1)

  {設定監聽讀寫檔案描述符(fd_*);調用select;如果是傾聽套接字就緒,說明一個新的連接配接請求建立{建立連接配接(accept);加入到監聽檔案描述符中去;}否則說明是一個已經連接配接過的描述符{進行操作(read或者write);}多路複用i/o可以解決資源限制問題,此模型實際上是将udp循環模型用在了tcp上面。這也會帶了一些問題,如由于伺服器依次處理客戶的請求,是以可能導緻友的客戶會等待很久。

繼續閱讀