應用協定概述
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiATN381dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5COwUDO3cTOjZzY4ATYyY2YxYzX0IDNwADMxAzLcFDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
- 在對外提供網絡服務時,服務端和用戶端需要遵循同一套資料 通訊協定
- 每個系統不一樣,提供的服務也不一樣,是以每個系統都要有 自己的應用協定
- 流式傳輸解決粘包和半包問題
一個協定設計案例
具體的代碼
協定設計的種類
二進制協定
比如網絡通信運輸層中的tcp協定,rtsp,rtmp,rtp。
明文的文本協定
比如應用層的http、redis協定。
混合協定(二進制+明文)
很多企業産品都采用這個。
固定邊界協定
能夠明确得知一個協定封包的長度,這樣的協定易于解析,比如tcp協定。
模糊邊界協定
無法明确得知一個協定封包的長度,這樣的協定解析較為複雜,通常需要通過某些 特定的位元組來界定封包是否結束,比如http協定。
https://cloud.tencent.com/developer/article/1038381
redis協定
https://xargin.com/redis-protocal/
協定設計的注意事項
大小端
位元組對齊
任何變量,不管是堆變量還是棧變量都對應着作業系統中的一塊記憶體,由于記憶體對齊的要求程式中
的變量并不是緊湊存儲的,例如一個c語言的結構體Test在記憶體中的布局可能如下圖所示。
struct Test
{
char a; char b; int32_t c;
};
結構體操作的變量便宜
協定設計的優劣評判
Netyy中的實作
高效的
快速的打包解包減少對cpu的占用,高資料壓縮率降低對網絡帶寬的占用。
簡單的
易于人的了解、程式的解析。
易于擴充的
對可預知的變更,有足夠的彈性用于擴充。
容易相容的
• 向前相容,對于舊協定發出的封包,能使用新協定進行解析,隻是新協定支援的新功能不能使用。
• 向後相容,對于新協定發出的封包,能使用舊協定進行解析,隻是新協定支援的新功能不能使用。