這裡講的協議是指通訊上的協議,而非文案上簽署的協議,不過有類似的意思例如:我們講話使用的語言,使用中文的人不能與使用英文的人直接進行交流,因為他們語言不同(協議不同無法直接進行通訊),如果不同語言得人想要進行溝通,必須有一名翻譯作為中介者進行翻譯(協議轉換)。協議是一種用來完成某種功能的通訊/互動方式
協議並沒有什麼神秘之處,通訊雙方約定好的資訊表達方式即是協議,我們現在來自創乙個簡單的協議。
26個英文本母,我們使用數字大小來代替字母進行傳遞資訊,例如:1代表a,2代表b, . 代表分隔,現在需要表達資訊 hello ,轉換為上面的數字表述則是h8.e4.l12.l12.o15
,即8.4.12.12.15
,如果我們與對方約定了上面的的這種資訊表達方式,那麼他看到8.4.12.12.15
就能明白這個是hello
,這個資訊表達方式
即是協議
!
當然,上面這種方式也可以看做是資訊的一種簡單加密,使用數字和. 替換了直接的字母表達。那麼我們轉到通訊上來解釋下協議。
先從電路開始,我們以前初高中或者大學都學過電路,電路中有電壓
這個概念,電壓有高有低,假設現在有個電壓是5v的電源,接在如下電路中:
當按鈕按下時,輸出端接通電源 + ,產生乙個5v的高電壓訊號,按鈕彈起時電路斷開,輸出端無訊號輸出,按鈕按下和彈起
產生了2個有訊號和無訊號
2個狀態,有訊號表示1,無訊號表示0,我們就可以用這個電路來輸出0 和 1
的電訊號了!!
計算機的世界都是由0和1組成的,因此我們這個電路可以作為訊號的傳送方來傳送任何想要表達的資訊了。當然只能輸出0和1是沒有意義的,只能只能告知對方0和1兩個資訊,為了傳輸更豐富的資訊,還需要協議
來做約定。
上面的電路雖然能觸發0和1,但如果是連續連續觸發的話就變成了010101…,0和1必須是交替的,不能連續出現2個1或0,因此需要一種方法能夠表示連續1或0訊號。 我們知道,按下按鈕時有時間的,那麼可以加入時間維度來約束。
我們將按鈕按下產生訊號1的時間設定乙個閾值,假設閾值為0.5s,如果一次按下的時間< 0.5s
就表示這個訊號為0,反之訊號為1,這樣一看,是不是就能完美發出0和1的訊號了!!
上面我們用來成功表達0和1資料的方式就是協議
,也是最底層的一種協議,這個協議約定的訊號閾值是0.5s,我們也可以設定為任意時間,閾值越小,單位時間內所能傳遞的資訊就越多,比如我想傳送1 1 兩個訊號,閾值是0.5s的話意味著我最少需要》1s的時間才能把這個訊號傳送完畢,如果是閾值0.5ms,則只需要》1ms就能發出去。
上面已經完成了單個bit的傳送,我們知道1 byte = 8 bit
那麼連續8次就完成乙個位元組的傳送,現在我們要使用上面的電路傳送位元組0xf0 = 1111 0000
的流程是:
按下》=0.5s ~ 鬆開
~按下》=0.5s ~ 鬆開
~按下》=0.5s ~ 鬆開
~按下》=0.5s ~ 鬆開
按下<0.5s ~ 鬆開
~按下<0.5s ~ 鬆開
~按下<0.5s~ 鬆開
~按下<0.5s ~ 鬆開
迴圈8次就完成了0xf0
的傳送。
我們已經完成了一段位元組的傳送,但是通常我們傳送的資訊是有邊界的
,什麼時候傳送開始,什麼時候傳送完成了不知道,因此還需要乙個協議來約定資料報的起始和結束
位置的標記,例如我們約定:
收到0x00代表資料報開始, 收到0xff表示資料報傳送結束現在要傳送資料
0x1a 0x45 0x88 0xf0
,那麼加上起始結束標記則為0x00 0x1a 0x45 0x88 0xf0 0xff
,這樣我們在軟體**中便可以通過起始和結束標記判斷什麼時候應該開始和停止記錄資料,並且能丟棄在傳輸中由於干擾而丟失包頭或者包尾的殘缺資料報。我們為資料加上 頭標記 0x00 和 尾標記 0xff,這也是乙個協議,這個協議的作用是拆解出一段完整的資料。
上面使用了
頭尾標記協議
來拆解出了一段資料報,那麼如果資料報的中間段資料丟失如何知曉?沒有辦法吧,因此可以再把協議
公升級一下,加入校驗演算法來判斷資料報是否完整。在此我們使用乙個簡單的辦法,在尾部加入一段校驗位來判斷資料報是否完整。校驗演算法為:資料部分位元組值累加的和 取低 2位元組,也就是說如果 攜帶的資料累加和不等於校驗部分2位元組值,那麼表示該資料報不正確應該被丟棄。
例如:資料
0x1a 0x45 0x88 0xf0 0xaa
的累加和為0x0281
,如果資料末端校驗和部分不為0x01 0x81
,則表示該包無效。自此,我們已經從底層建立了一套能傳送完整帶校驗功能資料報的
傳輸協議
了。以上使用的協議為
基於位元組
的協議,例如常用的tcp/ip mqtt 之類,我們知道資料的表達方式除了位元組還有字元,http就是基於字元
的協議,我們能通過字元來分析http協議通訊時部分攜帶的資訊,例如
f12
開啟瀏覽器network
,檢視http請求資訊可以看到這些內容都是可直接閱讀,而位元組協議是很難直接一目了然,大多數情況下我們仍會選擇位元組協議,因為這樣能節省很多頻寬,傳遞更多的資訊。
所以說,協議並不是什麼神秘高大上的東西,本文也不是為了講解各種協議怎麼解析,而是想用乙個簡單的例子來表述本質性的東西,一句話概括
協議就是為了能完成某種通訊所約定的一種資訊表達方式
,部分協議可以相互巢狀,你可以用協議a攜帶協議b格式的資料,就像http是基於tcp的應用層協議。對TCP IP協議的理解
話說兩台電腦要通訊就必須遵守共同的規則,就好比兩個人要溝通就必須使用共同的語言一樣。乙個只懂英語的人,和乙個只懂中文的人由於沒有共同的語言 規則 就沒辦法溝通。兩台電腦之間進行通訊所共同遵守的規則,就是網路協議。那麼誰來制定這個網路協議?tcp ip 是乙個協議族,也是按照層次劃分。共四層 應用層,...
對網路協議的理解
首先,我們大學的時候讀過osi七層網路,包括物理層 資料鏈路層 網路層 傳輸層 會話層 表示層 應用層。其中各層有各自的角色作用。盜用一張 tcp ip協議,包含了一組不同的協議,比如tcp ip udp等等。根據7層協議,ip是屬於網路層,用來告訴乙個包該去往哪個節點。tcp協議則處於傳輸層,目的...
對常見開源協議的理解
在使用開源 的時候,也需要注意其對應的開源協議,特別是在商業級應用中。下面就我個人針對各個常見的開源協議做個簡單的彙總和理解。假設我們使用的開源 為 a,我們自己開發的為 b,其中使用到了a bsd協議 1。若b開源,b中帶有a的 則b在發布時必須帶有a的bsd協議宣告。3。不允許用a的作者或者任何...