Java學習筆記(十五)-Netty

**

Netty的Recator模型

單線程:一個NIO線程+一個accept線程
在這裏插入圖片描述
多線程:
在這裏插入圖片描述
主從Reactor多線程:多個acceptor的NIO線程池用於接受客戶端的連接
在這裏插入圖片描述
轉自https://segmentfault.com/a/1190000017128263?utm_source=tag-newest
**
**

TCP沾包/拆包

雖然應用層面使用了Netty,但是對於操作系統來說數據交互按TCP協議來,儘管我們的應用層是按照 ByteBuf 爲 單位來發送數據,server按照Bytebuf讀取,但是到了底層操作系統仍然是將數據拆成字節流發送,因此,數據到了服務端,也是按照字節流的方式讀入,然後到了 Netty 應用層面,重新拼裝成 ByteBuf,而這裏的 ByteBuf 與客戶端按順序發送的 ByteBuf 可能是不對等的。
沾包:客戶端根據自定義協議來組裝我們應用層的數據包如將3個數據包組裝成2個TCP包
拆包;服務端根據我們的應用層的協議來組裝數據包將客戶端發來的2個TCP包拆成3個數據包

**
**

時間輪算法 HashedWheelTimer

時間輪其實就是一種環形的數據結構,可以想象成時鐘,分成很多格子,一個格子代碼一段時間(這個時間越短,Timer的精度越高)。並用一個鏈表報在該格子上的到期任務,同時一個指針隨着時間一格一格轉動,並執行相應格子中的到期任務。任務通過取摸決定放入那個格子。

**
**

心跳

因爲網絡的不可靠性, 有可能在 TCP 保持長連接的過程中, 由於某些突發情況, 例如網線被拔出, 突然掉電等, 會造成服務器和客戶端的連接中斷. 在這些突發情況下, 如果恰好服務器和客戶端之間沒有交互的話, 那麼它們是不能在短時間內發現對方已經掉線的. 爲了解決這個問題, 我們就需要引入 心跳 機制. 心跳機制的工作原理是: 在服務器和客戶端之間一定時間內沒有數據交互時, 即處於 idle 狀態時, 客戶端或服務器會發送一個特殊的數據包給對方, 當接收方收到這個數據報文後, 也立即發送一個特殊的數據報文, 迴應發送方, 此即一個 PING-PONG 交互. 自然地, 當某一端收到心跳消息後, 就知道了對方仍然在線, 這就確保 TCP 連接的有效性.

**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章