網絡協議
標准定義是這樣的:
為計算機網絡中進行數據交換而建立的規則、標准或約定的集合。
網絡協議至少包括三要素:
語法:語法是用戶數據與控制信息的結構與格式,以及數據出現的順序。
語義:解釋控制信息每個部分的意義。它規定了需要發出何種控制信息,以及完成的動作與做出什麼樣的響應。
時序:時序是對事件發生順序的詳細說明。
人們形象地把這三個要素描述為:語義表示要做什麼,語法表示要怎麼做,時序表示做的順序。
通俗地說,協議就是通信雙方能夠理解的一種數據格式。
在進行網絡開發中,文本協議和二進制協議是我們最常用的兩種。往往要根據這兩種協議的特點進行選擇,那麼我們先來看下這兩種協議分別具有什麼特點。
文本協議
文本協議一般是由一串ACSII字符組成的數據,這些字符包括數字,大小寫字母、百分號,還有回車(\r),換行(\n)以及空格等等。
文本協議設計的目的就是方便人們理解,讀懂。所以,協議中通常會加入一些特殊字符用於分隔,比如如下數據:
!set chl 003#
其中,以!標識命令的開始,#標識命令結束,空格用來分隔命令字段,雖然我們不知道這條命令具體干什麼,但通過字面我們大致知道可能是設置(set)某一個參數(chl)值為003,這樣在我們進行調試的時候,可以快速准確地看到當時發生了什麼,更好地解決問題。
但為了便於解析,文本協議不得不添加一些冗余的字符用於分隔命令,降低了其傳輸的效率;而且只適於傳輸文本,很難嵌入其他數據,比如一張圖片。
二進制協議
二進制協議就是一串字節流,通常包括消息頭(header)和消息體(body),消息頭的長度固定,並且消息頭包括了消息體的長度。這樣就能夠從數據流中解析出一個完整的二進制數據。如下是一個典型的二進制協議:
其中,Guide用於標識協議起始,Length是消息體Data的長度,為了數據完整性,還會加上相應的校驗(DataCRC,HeaderCRC);Data中又分為命令字(CMD),和命令內容。命令字是雙方協議文檔中規定好的,比如0x01代表登錄,0x02代表登出等,一般數據字段的長度也是固定的。又因為長度的固定,所以少了冗余數據,傳輸效率較高。
總結
綜上,我們大致總結文本協議和二進制協議的優缺點:
文本協議,直觀、描述性強,容易理解,便於調試,缺點就是冗余數據較多,不適宜傳輸二進制文件(比如:圖片等),解析復雜(需要進行字符串比較);
二進制協議,沒有冗余字段,傳輸高效,方便解析(固定長度,並且可以直接比較字節),缺點就是定義的比較死,哪個位置有哪些東西,是什麼意義是定義死的,場景單一。
所以,
1. 如果想要高效傳輸,比如物聯網中收集傳感器數據,使用二進制協議
2. 如果想要便於調試,比如使用telnet就能當客戶端用,可使用文本協議
3. 如果命令較少,比如即時通訊軟件,可以使用文本協議
4. 二進制數據的難理解性,自然加密,對數據安全有一定要求的可以使用二進制協議
等等。
總的來說,這是一個平衡的過程,要看具體項目的需要。