|
通信協(xié)議可以理解兩個節(jié)點之間為了協(xié)同工作實現(xiàn)信息交換,協(xié)商一定的規(guī)則和約定,例如規(guī)定字節(jié)序,各個字段類型,使用什么壓縮算法或加密算法等。常見的有tcp,udo,http,sip等常見協(xié)議。協(xié)議有流程規(guī)范和編碼規(guī)范。流程如呼叫流程等信令流程,編碼規(guī)范規(guī)定所有信令和數(shù)據(jù)如何打包/解包。
編碼規(guī)范就是我們通常所說的編解碼,序列化。不光是用在通信工作上,在存儲工作上我們也經(jīng)常用到。如我們經(jīng)常想把內(nèi)存中對象存放到磁盤上,就需要對對象進行數(shù)據(jù)序列化工作。
本文采用先循序漸進,先舉一個例子,然后不斷提出問題-解決完善,這樣一個迭代進化的方式,介紹一個協(xié)議逐步進化和完善,最后總結(jié)?赐曛,大家以后在工作就很容易制定和選擇自己的編碼協(xié)議。
一、緊湊模式本文例子是A和B通信,獲取或設(shè)置基本資料,一般開發(fā)人員第一步就是定義一個協(xié)議結(jié)構(gòu):
struct userbase
{
unsigned short cmd;//1-get, 2-set, 定義一個short,為了擴展更多命令(理想那么豐滿)
unsigned char gender; //1 – man , 2-woman, 3 - ??
char name[8]; //當(dāng)然這里可以定義為 string name;或len + value 組合,為了敘述方便,就使用簡單定長數(shù)據(jù)
}
在這種方式下,A基本不用編碼,直接從內(nèi)存copy出來,再把cmd做一下網(wǎng)絡(luò)字節(jié)序變換,發(fā)送給B。B也能解析,一切都很和諧愉快。
這時候編碼結(jié)果可以用圖表示為(1格一個字節(jié)) |
|