Socket協議

  • Socket協議的形象描述
    socket的英文原義是“孔”或“插座”。在這裏作爲4BDS UNIX的進程通信機制,取後一種意思。socket非常類似於電話插座。以一個國家級電話網爲例。電話的通話雙方相當於相互通信的2個進程,區號是它的網絡地址;區內一個單位的交換機相當於一臺主機,主機分配給每個用戶的局內號碼相當於socket號。任何用戶在通話之前,首先要佔有一部電話機,相當於申請一個socket;同時要知道對方的號碼,相當於對方有一個固定的socket。然後向對方撥號呼叫,相當於發出連接請求(假如對方不在同一區內,還要撥對方區號,相當於給出網絡地址)。對方假如在場並空閒(相當於通信的另一主機開機且可以接受連接請求),拿起電話話筒,雙方就可以正式通話,相當於連接成功。雙方通話的過程,是一方向電話機發出信號和對方從電話機接收信號的過程,相當於向socket發送數據和從socket接收數據。通話結束後,一方掛起電話機相當於關閉socket,撤消連接。

    通常短連接是這樣:連接->傳輸數據->關閉連接
    那什麼是長連接?一般長連接相對短連接而言的,長連接在傳輸完數後不關閉連接,而不斷的發送包保持連接等待處理下一個數據包。
    such as: 連接->傳輸數據->保持連接 -> 傳輸數據-> 。。。 ->關閉連接。

  • 那什麼時候用短連接呢?
    一般長連接用於少數client-end  to server-end的頻繁的通信,例如:數據庫的連接用長連接, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創建也是對資源的浪費。
    而像WEB網站的http服務一般都用短鏈接,因爲長連接對於服務端來說會耗費一定的資源,而像WEB網站這麼頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一些資源。

 

  • TCP/IP通信解讀長短鏈接
    一。通信方式
    主要有以下三大類:
    (一)SERVER/CLIENT方式
    1.一個Client方連接一個Server方,或稱點對點(peer to peer):
    2.多個Client方連接一個Server方,這也是通常的併發服務器方式。
    3.一個Client方連接多個Server方,這種方式很少見,主要
    用於一個客戶向多個服務器發送請求情況。
  • (二)連接方式
    1.長連接
    Client方與Server方先建立通訊連接,連接建立後不斷開,
    然後再進行報文發送和接收。這種方式下由於通訊連接一直
    存在,可以用下面命令查看連接是否建立:
    netstat –f inet|grep 端口號(如5678)。
    此種方式常用於點對點通訊。
    2.短連接
    Client方與Server每進行一次報文收發交易時才進行通訊連
    接,交易完畢後立即斷開連接。此種方式常用於一點對多點
    通訊,比如多個Client連接一個Server.
  • (三)發送接收方式
    1.異步
    報文發送和接收是分開的,相互獨立的,互不影響。這種方
    式又分兩種情況:
    (1)異步雙工:接收和發送在同一個程序中,有兩個不同的
    子進程分別負責發送和接收
    (2)異步單工:接收和發送是用兩個不同的程序來完成。
    2.同步
    報文發送和接收是同步進行,既報文發送後等待接收返回報文。
    同步方式一般需要考慮超時問題,即報文發上去後不能無限等
    待,需要設定超時時間,超過該時間發送方不再等待讀返回報
    文,直接通知超時返回。
    實際通信方式是這三類通信方式的組合。比如一般書上提供的
    TCP/IP範例程序大都是同步短連接的SERVER/CLIENT程序。有的
    組合是基本不用的,比較常用的有價值的組合是以下幾種:
    同步短連接Server/Client
    同步長連接Server/Client
    異步短連接Server/Client
    異步長連接雙工Server/Client
    異步長連接單工Server/Client
    其中異步長連接雙工是最爲複雜的一種通信方式,有時候經
    常會出現在不同銀行或不同城市之間的兩套系統之間的通信。
    比如金卡工程。由於這幾種通信方式比較固定,所以可以預
    先編制這幾種通信方式的模板程序。
    二.報文格式
    通信報文格式多樣性更多,相應地就必須設計對應的讀寫報文的接
    收和發送報文函數。
    (一)阻塞與非阻塞方式
    1.非阻塞方式
    讀函數不停地進行讀動作,如果沒有報文接收到,等待一段時間後
    超時返回,這種情況一般需要指定超時時間。
    2.阻塞方式
    如果沒有報文接收到,則讀函數一直處於等待狀態,直到有報文到達。
    (二)循環讀寫方式
    1.一次直接讀寫報文
    在一次接收或發送報文動作中一次性不加分別地全部讀取或全部
    發送報文字節。
    2.不指定長度循環讀寫
    這一般發生在短連接進程中,受網絡路由等限制,一次較長的報
    文可能在網絡傳輸過程中被分解成了好幾個包。一次讀取可能不
    能全部讀完一次報文,這就需要循環讀報文,直到讀完爲止。
    3.帶長度報文頭循環讀寫
    這種情況一般是在長連接進程中,由於在長連接中沒有條件能夠
    判斷循環讀寫什麼時候結束,所以必須要加長度報文頭。讀函數
    先是讀取報文頭的長度,再根據這個長度去讀報文.實際情況中,
    報頭的碼制格式還經常不一樣,如果是非ASCII碼的報文頭,還必須
    轉換成ASCII,常見的報文頭碼制有:
    (1)n個字節的ASCII碼
    (2)n個字節的BCD碼
    (3)n個字節的網絡整型碼

------------------------------------------------------------------------------------------------

基於TCP/IP的通訊有兩個步驟:1、連接;2、通訊。client連接到server的監聽端口,隨後在server端會隨機產生一個通訊端口和client進行數據通訊。端口是個unsigned short類型的數據結構。所以最多連接是65535。系統一般要求1024前的端口是系統使用的。建議用戶程序的監聽端口大於10000,通訊端口是系統隨機分配的。假如需要有10萬個客戶端,程序應該怎麼處理呢? 如果只有一個服務器,只能用短連接的方式處理。如果都是長連接就要負載均衡。把連接分到其它服務器上去處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章