1. 程式人生 > >(websocket)協議中Ping Pong,Socket通訊ping pong(長連線)

(websocket)協議中Ping Pong,Socket通訊ping pong(長連線)

- websocket協議,長連線;Http短連線
WebSocket如何建立連線、交換資料的細節,以及資料幀的格式。
 WebSocket複用了HTTP的握手通道。具體指的是,客戶端通過HTTP請求與WebSocket服務端協商升級協議。協議升級完成後,後續的資料交換則遵照WebSocket的協議。

 websocket協議是基於tcp的網路協議,實現了瀏覽器與客戶端的全雙工通訊,與http協議不同的是,它允許伺服器主動推送訊息給客戶端。
 websocket協議分為兩部分,一是握手建立連線;二是資料傳輸。
 建立連線:websocket的連線建立是基於http協議的。資料傳輸:websocket協議中資料是通過一系列的幀來傳輸。出於安全性考慮,所有客戶端發往伺服器的資料幀需要掩碼,若伺服器收到未掩碼的資料幀將會主動斷開連線;所有伺服器發往客戶端的資料幀不能掩碼,若客戶端收到掩碼的資料幀將會主斷開連線。

- (websocket)協議中Ping Pong,長連線

  WebSocket為了保持客戶端、服務端的實時雙向通訊,需要確保客戶端、服務端之間的TCP通道保持連線沒有斷開。然而,對於長時間沒有資料往來的連線,如果依舊長時間保持著,可能會浪費包括的連線資源。但不排除有些場景,客戶端、服務端雖然長時間沒有資料往來,但仍需要保持連線。這個時候,可以採用心跳來實現。
  傳送方->接收方:ping;
  接收方->傳送方:pong;
  ping、pong的操作,對應的是WebSocket的兩個控制幀,opcode分別是0x9、0xA。

  websocket ping pong:目前的話,瀏覽器中沒有相關api傳送ping給伺服器,只能由伺服器發ping給瀏覽器,瀏覽器返回pong訊息;

  WebSocket控制幀有3種:Close(關閉幀)、Ping以及Pong。控制幀的操作碼定義了0x08(關閉幀)、0x09(Ping幀)、0x0A(Pong幀)。Close關閉幀很容易理解,客戶端如果接受到了就關閉連線,客戶端也可以傳送關閉幀給服務端。Ping和Pong是websocket裡的心跳,用來保證客戶端是線上的,一般來說只有服務端給客戶端傳送Ping,然後客戶端傳送Pong來回應,表明自己仍然線上。

WebSocket協議深入探究-https://www.sohu.com/a/227600866_472869
OPCODE:4位 , 解釋PayloadData,如果接收到未知的opcode,接收端必須關閉連線。
0x0表示附加資料幀
0x1表示文字資料幀
0x2表示二進位制資料幀
0x3-7暫時無定義,為以後的非控制幀保留
0x8表示連線關閉
0x9表示ping
0xA表示pong
0xB-F暫時無定義,為以後的控制幀保留

- WebSocket分包,粘包,連包,半包
  網上很多資料都說WebSocket不會粘包,半包。OK,這是正確的,因為上述將資料幀的時候我們已經看到WebSocket會將大的資料,自動分片傳送。所以WebSocket會自動分包傳送,因為這種分包傳送,WebSocket的資料不會溢位接收緩衝區,所以也不會有半包的情況傳送。
  但是關於粘包,和連包,我看到一部分資料都說不會。因為WebSocket具有幀頭資訊,所以不會粘包?這是不完全正確的,要知道Tcp的報文也是具有包頭資訊的,只不過Socket已經處理了。而且經過我對我們專案伺服器實際壓力測試,發現WebSocket會粘包,連包。不同的是,WebSocket的資料中擁有包頭資訊,但Tcp沒有(實際開發中,我們自己一定會加個包頭來分割封包的,WebSocket只是替我們設計了一個包頭而已),但對這個包頭分割的處理,還是要我們自己完成,WebSocket不會代勞,如果我們自己不處理,抱歉,妥妥的粘包,連包

Websocket協議原理與實現(一)- https://www.jianshu.com/p/1ee01218097b
A barebones WebSocket client and server implementation written in 100% Java- https://github.com/TooTallNate/Java-WebSocket
WebSocket協議詳解及應用- https://blog.csdn.net/u014520745/article/details/52639452
WebSocket的ping與pong的java實現- https://blog.csdn.net/u010770993/article/details/70312279

- Socket通訊ping pong
  做一個socket網路傳輸的專案,在使用TCP進行傳輸的時候,接收端有時候會因為寫入到檔案的時間而造成一定的延時,所以在接收端使用了ping-pong buffer的策略進行優化。

 ping-pong機制- https://blog.csdn.net/chenyu201003/article/details/81449762
 專案用到的Socket通訊ping pong流程圖- https://blog.csdn.net/hufei20082008/article/details/53513918?utm_source=blogxgwz2
 Socket預設是長連結,為了知道Client和Server連結是否正常,專案中使用的ClientSocket和ServerSocket都有一個心跳的執行緒,這個執行緒主要是為了檢測Client和Server是否正常連結,Client和Server是否正常連結主要是用ping pong流程來保證的.