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個字節的網絡整型碼html