標籤:pip 完數 rarp 設計 子進程 str 動態 而且 單機
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去組織資料,以符合指定的協議。
通訊過程:
主機 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和socket之長串連和短串連