伺服器的請求處理大致可以分為以下幾個階段:
前面的i/o模型負責了【事件分離】階段,【處理請求】階段由工作執行緒來完成,而【斷包】階段在不同的模型中會選擇前靠或者後靠,因為斷包和具體的伺服器協議有關,因此難以在框架階段做更多的假設(定長包頭協議和流式協議是完全不同的處理方式),根據不同的網路框架,斷包是緊靠【事件分離】還是緊靠【處理請求】,它是受一定限制的。
斷包的侷限性主要體現在tcp協議對資料的處理,tcp協議將資料作為流處理,因此單次的事件並不意味著乙個完整的請求,可能存在資料拆分和拼接。udp協議可以忽略這個問題,因為udp協議是以整個包來組織網路傳輸的資料。
對於應用層協議這裡多說兩句,目前流行的協議型別主要是兩種:二進位制定長包頭協議和流式協議。二進位制定長包頭協議的組織方式類似於tcp/ip報文段,流式協議類似於xml。流式協議具有更好的描述性,增加新協議簡單,但協議處理起來比較麻煩,需要邊解析邊斷包,因此容易和【處理請求】相耦合,同時從伺服器處理資料的安全性來說,它也稍差一些。二進位制協議容易斷包,和前後階段耦合也較小,但協議內容不容易擴充套件,有時候甚至需要重新編譯伺服器。乙個較好的結合二者優點的方式是定長包頭+流式協議包體。
【回包】階段後面將不做較多的討論,主要關注在讀階段。對於回包,保持幾個原則:較少的資料拷貝;用writev減少小資料的多次寫;盡可能避免鎖競爭;盡可能減少執行緒切換。
伺服器模型
伺服器模型 1 迴圈伺服器模型 tcp 迴圈伺服器 udp 迴圈伺服器 2 併發伺服器 tcp 併發伺服器 父子程序實現併發伺服器 父親程序 接收請求。accept 兒子程序 處理具體客戶端需求。send recv 注意點 殭屍程序,父親活著,兒子死亡,父親沒有為兒子程序收屍,會產生殭屍程序。避免殭...
伺服器模型
在使用socket進行網路程式設計時,首先要選擇乙個合適的伺服器模型是很重要的。在網路程式裡,通常都是乙個伺服器服務多個客戶機,為了處理多個客戶機的請求,伺服器端的程式有不同的處理方式。迭代模型算是最早期的伺服器模型,其核心實現是每來乙個使用者,然後為這個使用者服務到底,過程中不接受任何新的使用者請...
併發伺服器模型 單程序伺服器
from socket import sersocket socket af inet,sock stream 重複使用繫結的資訊 sersocket.setsockopt sol socket,so reuseaddr 1 localaddr 7788 sersocket.bind localad...