WebSocket和long poll、ajax輪詢的區別,ws協議測試
WebSocket是HTML5出的東西(協議),也就是說HTTP協議沒有變化,或者說沒關系,但HTTP是不支持持久連接的(長連接,循環連接的不算)首先HTTP有1.1和1.0之說,也就是所謂的keep-alive,把多個HTTP請求合並為一個,但是Websocket其實是一個新協議,跟HTTP協議基本沒有關系,只是為了兼容現有瀏覽器的握手規范而已
典型的Websocket握手:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
服務器會返回下列東西,表示已經接受到請求, 成功建立Websocket
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
告訴客戶端已成功切換協議
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Protocol 表示最終使用的協議。
至此HTTP協議已經完成,接下來就是完全按照Websocket協議進行了。
ajax輪詢 的原理非常簡單,讓瀏覽器隔個幾秒就發送一次請求,詢問服務器是否有新信息。
long poll 其實原理跟 ajax輪詢 差不多,都是采用輪詢的方式,不過采取的是阻塞模型,客戶端發起連接后,如果沒消息,就一直不返回Response給客戶端。
直到有消息才返回,返回完之后,客戶端再次建立連接,不斷循環。
從上面可以看出其實這兩種方式,都是在不斷地建立HTTP連接,然后等待服務端處理,可以體現HTTP協議的另外一個特點,被動性。
這兩種都是非常消耗資源的。
ajax輪詢 需要服務器有很快的處理速度和資源
long poll 需要有很高的並發
WebSocket當服務器完成協議升級后(HTTP->Websocket),服務端就可以主動推送信息給客戶端,只需要經過一次HTTP請求,就可以做到源源不斷的信息傳送了。
Websocket可以直接跟nginx(等)建立持久連接,業務處理程序(Tomcat等)有信息的時候通知nginx,然后nginx在統一轉發客戶端
這樣可以解決高並發和處理速度的問題
可以把 WebSocket 看成是 HTTP 協議為了支持長連接所打的一個大補丁,它和 HTTP 有一些共性,是為了解決 HTTP 本身無法解決的某些問題而做出的一個改良設計。
在以前 HTTP 協議中所謂的 keep-alive connection 是指在一次 TCP 連接中完成多個 HTTP 請求,但是對每個請求仍然要單獨發 header;
所謂的 polling 是指從客戶端(一般就是瀏覽器)不斷主動的向服務器發 HTTP 請求查詢是否有新數據。
這兩種模式有一個共同的缺點,就是除了真正的數據部分外,服務器和客戶端還要大量交換 HTTP header,信息交換效率很低。
它們建立的“長連接”都是偽.長連接,只不過好處是不需要對現有的 HTTP server 和瀏覽器架構做修改就能實現。
WebSocket 解決的第一個問題是,通過第一個 HTTP request 建立了 TCP 連接之后,之后的交換數據都不需要再發 HTTP request了,使得這個長連接變成了一個真.長連接。
但是不需要發送 HTTP header就能交換數據顯然和原有的 HTTP 協議是有區別的,所以它需要對服務器和客戶端都進行升級才能實現。
在此基礎上 WebSocket 還是一個雙通道的連接,在同一個 TCP 連接上既可以發也可以收信息。
此外還有 multiplexing 功能,幾個不同的 URI 可以復用同一個 WebSocket 連接。
這些都是原來的 HTTP 不能做到的。
WebSocket 可能進入某種半死不活的狀態。這實際上也是原有網絡世界的一些缺陷性設計。
一個 HTTP/WebSocket 連接往往要經過無數的路由,防火牆。
中間節點可能會認為一份連接在一段時間內沒有數據發送就等於失效,它們會自作主張的切斷這些連接。
這種情況下,不論服務器還是客戶端都不會收到任何提示。而計算機網絡協議棧的實現中又會有一層套一層的緩存,除非填滿這些緩存,你的程序根本不會發現任何錯誤。
這樣WebSocket長連接就可能在毫不知情的情況下進入了半死不活狀態。
解決方案就是讓服務器和客戶端能夠發送 Ping/Pong Frame(RFC 6455 - The WebSocket Protocol)。
這種 Frame 是一種特殊的數據包,它只包含一些元數據而不需要真正的 Data Payload,可以在不影響 Application 的情況下維持住中間網絡的連接狀態。
WebSocket 跟其他 API 比較不一樣的是,它不僅僅依賴於瀏覽器支持,同時要求服務器和代理支持。
WebSocket 本質上跟 HTTP 完全不一樣,只不過為了兼容性,WebSocket 的握手是以 HTTP 的形式發起的,如果服務器或者代理不支持 WebSocket,會把這當做一個不認識的 HTTP 請求拒絕掉。
======================
webSocket ws協議測試
WebSocket測試小工具-CSDN下載
https://download.csdn.net/download/zdz8207/10675861
使用該工具可以很容易的實現websocket穩定性測試,連接數測試就有點麻煩了,可以通過autoit3調用該.exe程序來實現對不同參數的輸入
需要提前准備好數據文件:具體代碼如下:
Run("E:\webSocket\WebSocket_test\TradePhoneClient.exe") Sleep(5000) WinWait("Form1") $sheet = Gettestsheet("E:\webSocket\WebSocket_test\student_uuid20000_data.csv",1) For $i= 1 TO 801 Step 1 Dim $stu_uid = $sheet.Cells($i,1).value CreateWebSocketConnect($stu_uid) ;MsgBox(4096, "讀取的行:", $stu_uid) Next CloseExcel() Func CreateWebSocketConnect($stu_uid) ControlSetText("Form1","","[CLASS:WindowsForms10.EDIT.app.0.141b42a_r14_ad1;INSTANCE:2]","ws://XXXXXXX.cn/broadcast-rest/echo?uuid="&$stu_uid&"&type=student&encryptId=testrenshu2000") ControlClick("Form1","","[CLASS:WindowsForms10.BUTTON.app.0.141b42a_r14_ad1;INSTANCE:6]") WinWait("[CLASS:#32770]","",3) ControlClick("[CLASS:#32770]","","Button1") EndFunc Func Gettestsheet($path,$sheetindex) ProcessClose("EXCEL.EXE") $oExcel = ObjCreate("Excel.Application") $oExcel.visible=0 $workbook=$oExcel.WorkBooks.Open($path) $sheet=$workbook.Worksheets.Item($sheetindex) Return $sheet EndFunc Func CloseExcel() $workbook.Save(); $oExcel.Quit(); ProcessClose("EXCEL.EXE");退出不了則強制殺死進程 EndFunc
總結:webSocket最大連接數取決web服務器最大線程數,系統進程數/etc/security/limits.d/90-nproc.conf文件,一般設置51200