天天看點

長連接配接短連接配接socket及windows連接配接數限制配置

TCP/IP

TCP/IP是個協定組,可分為三個層次:網絡層、傳輸層和應用層。

在網絡層有IP協定、ICMP協定、ARP協定、RARP協定和BOOTP協定。

在傳輸層中有TCP協定與UDP協定。

在應用層有:TCP包括FTP、HTTP、TELNET、SMTP等協定

                 UDP包括DNS、TFTP等協定

短連接配接

連接配接->傳輸資料->關閉連接配接

HTTP是無狀态的,浏覽器和伺服器每進行一次HTTP操作,就建立一次連接配接,但任務結束就中斷連接配接。

也可以這樣說:短連接配接是指SOCKET連接配接後發送後接收完資料後馬上斷開連接配接。

長連接配接

連接配接->傳輸資料->保持連接配接 -> 傳輸資料-> 。。。 ->關閉連接配接。

長連接配接指建立SOCKET連接配接後不管是否使用都保持連接配接,但安全性較差。

http的長連接配接

HTTP也可以建立長連接配接的,使用Connection:keep-alive,HTTP 1.1預設進行持久連接配接。HTTP1.1和HTTP1.0相比較而言,最大的差別就是增加了持久連接配接支援(貌似最新的 http1.0 可以顯示的指定 keep-alive),但還是無狀态的,或者說是不可以信任的。

什麼時候用長連接配接,短連接配接?

 長連接配接多用于操作頻繁,點對點的通訊,而且連接配接數不能太多情況,。每個TCP連接配接都需要三步握手,這需要時間,如果每個操作都是先連接配接,再操作的話那麼處理速度會降低很多,是以每個操作完後都不斷開,次處理時直接發送資料包就OK了,不用建立TCP連接配接。例如:資料庫的連接配接用長連接配接, 如果用短連接配接頻繁的通信會造成socket錯誤,而且頻繁的socket 建立也是對資源的浪費。

而像WEB網站的http服務一般都用短連結,因為長連接配接對于服務端來說會耗費一定的資源,而像WEB網站這麼頻繁的成千上萬甚至上億用戶端的連接配接用短連接配接會更省一些資源,如果用長連接配接,而且同時有成千上萬的使用者,如果每個使用者都占用一個連接配接的話,那可想而知吧。是以并發量大,但每個使用者無需頻繁操作情況下需用短連好。

總之,長連接配接和短連接配接的選擇要視情況而定。

發送接收方式

1、異步

封包發送和接收是分開的,互相獨立的,互不影響。這種方式又分兩種情況:

(1)異步雙工:接收和發送在同一個程式中,由兩個不同的子程序分别負責發送和接收

(2)異步單工:接收和發送是用兩個不同的程式來完成。

2、同步

封包發送和接收是同步進行,既封包發送後等待接收傳回封包。 同步方式一般需要考慮逾時問題,即封包發出去後不能無限等待,需要設定逾時時間,超過該時間發送方不再等待讀傳回封包,直接通知逾時傳回。

在長連接配接中一般是沒有條件能夠判斷讀寫什麼時候結束,是以必須要加長度封包頭。讀函數先是讀取封包頭的長度,再根據這個長度去讀相應長度的封包。

Socket是什麼

Socket是應用層與TCP/IP協定族通信的中間軟體抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協定族隐藏在Socket接口後面,對使用者來說,一組簡單的接口就是全部,讓Socket去組織資料,以符合指定的協定。

長連接配接短連接配接socket及windows連接配接數限制配置

Socket 通信示例

長連接配接短連接配接socket及windows連接配接數限制配置

主機 A 的應用程式要能和主機 B 的應用程式通信,必須通過 Socket 建立連接配接,而建立 Socket 連接配接必須需要底層 TCP/IP 協定來建立 TCP 連接配接。建立 TCP 連接配接需要底層 IP 協定來尋址網絡中的主機。我們知道網絡層使用的 IP 協定可以幫助我們根據 IP 位址來找到目标主機,但是一台主機上可能運作着多個應用程式,如何才能與指定的應用程式通信就要通過 TCP 或 UPD 的位址也就是端口号來指定。這樣就可以通過一個 Socket 執行個體唯一代表一個主機上的一個應用程式的通信鍊路了。

建立通信鍊路

當用戶端要與服務端通信,用戶端首先要建立一個 Socket 執行個體,作業系統将為這個 Socket 執行個體配置設定一個沒有被使用的本地端口号,并建立一個包含本地和遠端位址和端口号的套接字資料結構,這個資料結構将一直儲存在系統中直到這個連接配接關閉。在建立 Socket 執行個體的構造函數正确傳回之前,将要進行 TCP 的三次握手協定,TCP 握手協定完成後,Socket 執行個體對象将建立完成,否則将抛出 IOException 錯誤。

與之對應的服務端将建立一個 ServerSocket 執行個體,ServerSocket 建立比較簡單隻要指定的端口号沒有被占用,一般執行個體建立都會成功,同時作業系統也會為 ServerSocket 執行個體建立一個底層資料結構,這個資料結構中包含指定監聽的端口号和包含監聽位址的通配符,通常情況下都是“*”即監聽所有位址。之後當調用 accept() 方法時,将進入阻塞狀态,等待用戶端的請求。當一個新的請求到來時,将為這個連接配接建立一個新的套接字資料結構,該套接字資料的資訊包含的位址和端口資訊正是請求源位址和端口。這個新建立的資料結構将會關聯到 ServerSocket 執行個體的一個未完成的連接配接資料結構清單中,注意這時服務端與之對應的 Socket 執行個體并沒有完成建立,而要等到與用戶端的三次握手完成後,這個服務端的 Socket 執行個體才會傳回,并将這個 Socket 執行個體對應的資料結構從未完成清單中移到已完成清單中。是以 ServerSocket 所關聯的清單中每個資料結構,都代表與一個用戶端的建立的 TCP 連接配接。

備注:

Windows 下單機最大TCP連接配接數

調整系統參數來調整單機的最大TCP連接配接數,Windows 下單機的TCP連接配接數有多個參數共同決定:

以下都是通過修改系統資料庫[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]

1.最大TCP連接配接數      TcpNumConnections

2.TCP關閉延遲時間    TCPTimedWaitDelay    (30-240)s

3.最大動态端口數   MaxUserPort  (Default = 5000, Max = 65534) TCP用戶端和伺服器連接配接時,用戶端必須配置設定一個動态端口,預設情況下這個動态端口的配置設定範圍為 1024-5000 ,也就是說預設情況下,用戶端最多可以同時發起3977 Socket 連接配接

4.最大TCB 數量   MaxFreeTcbs

系統為每個TCP 連接配接配置設定一個TCP 控制塊(TCP control block or TCB),這個控制塊用于緩存TCP連接配接的一些參數,每個TCB需要配置設定 0.5 KB的pagepool 和 0.5KB 的Non-pagepool,也就說,每個TCP連接配接會占用 1KB 的系統記憶體。

非Server版本,MaxFreeTcbs 的預設值為1000 (64M 以上實體記憶體)Server 版本,這個的預設值為 2000。也就是說,預設情況下,Server 版本最多同時可以建立并保持2000個TCP 連接配接。

5. 最大TCB Hash table 數量   MaxHashTableSize TCB 是通過Hash table 來管理的。

這個值指明配置設定 pagepool 記憶體的數量,也就是說,如果MaxFreeTcbs = 1000 , 則 pagepool 的記憶體數量為 500KB那麼 MaxHashTableSize 應大于 500 才行。這個數量越大,則Hash table 的備援度就越高,每次配置設定和查找 TCP  連接配接用時就越少。這個值必須是2的幂,且最大為65536.

IBM WebSphere Voice Server 在windows server 2003 下的典型配置

MaxUserPort = 65534 (Decimal)

MaxHashTableSize = 65536 (Decimal)

MaxFreeTcbs = 16000 (Decimal)

這裡我們可以看到 MaxHashTableSize 被配置為比MaxFreeTcbs 大4倍,這樣可以大大增加TCP建立的速度。

http://zhaohuiopensource.iteye.com/admin/blogs/1498256

繼續閱讀