ICE 協議概要

2021-08-29 09:11:02 字數 2649 閱讀 8351

1、ice協議由三部分組成:

1)資料編碼規範,用來進行各種資料型別的序列化。

2)客戶端與伺服器端的互動的訊息型別,以及在何種情況下應發出何種訊息的規範。

3)客戶端與伺服器端如何協商二者所用協議及編碼版本的規範。

2、資料編碼規範:

1)數值型別的編碼是little-endian(x86的都是這個,所以基本上不用管了,除非你用mac...)。即0x12345678存放在記憶體中是0x78 0x56 0x34 0x12。

2)size,資料長度(string)或者資料計數(sequence):若長度或計數小於255,則用乙個byte來表示,如果大於等於255,則用1byte+1int(共五個byte)來表示,其中第乙個byte值為255。即:若長度或者計數為254,則size為0xfe,若長度或者計數為256,則size為0xff 0x01 0x00 0x00 0x00。

3)資料封裝:資料封裝是指將某可變長度的未知資料及其相關資訊(大小、編碼版本等)打包成乙個單元包。其結構如下:

struct encapsulation ;

4)slices:考慮到exception和class到達接收端後,由於接收端僅理解其部分資訊(比如只有父型別定義而無子型別定義),因此exception和class的編碼也具有一定的層次性,每乙個繼承層次的資料編碼叫做乙個slice。每個slice由乙個int型(slice的總size)+資料組成。接收端接收到資料進行解碼時,可以通過slice的size,直接由當前的slice跳轉定位到下乙個slice。

5)基本型別:

bool  1位元組1為true,0為false

byte   1 位元組

short  2位元組

int      4位元組

long   8位元組

float    4位元組ieee標準23位小數,8位指數,1位標誌

double 8位元組ieee標準52位小數,11位指數,1位標誌

6)string 字串:字串由乙個size和一串utf-8編碼的資料組成,size見2),字串不是以null結束的。空字串的size為0。

7)sequence 序列:序列由乙個size和一系列按各自型別編碼的資料組成,size見2)。

8)dictionary 字典:字典由乙個size和一系列鍵值對編碼的資料組成,size見2),鍵值對是乙個struct的資料結構,這個資料結構有兩個成員,乙個是key,乙個是value。

9)enumerator 列舉:列舉資料的編碼是由其定義的列舉個數決定的,如果列舉個數在1-127之間,每個列舉值為乙個byte,若個數在128-32767之間,其值為short,大於32767的,其值為int。

10)structure 結構:結構中的每個元素,依次按各自的型別編碼,按各自在宣告中的位置排列。

11)exception 異常:異常是由以下幾部分組成:

uses classes (bool) 是否存在後面的class instances

type id(string)  type id和下面的slice for members是一組的,乙個exception中可能存在多組。

//slice for members……

//class instances(optional) 指exception引用或者間接引用的class例項的編碼。

首先exception第乙個位元組是乙個bool型別,標誌是否exception包括有class例項的編碼,若有的話,在exception的尾部會有class例項的編碼。緊接著是一系列的鍵值對,鍵為type id(string),值為type id所對應的member編碼(slice)。這些鍵值對的排列順序是按先子類後父類,每個slice中的member排列順序是按其類定義中的順序。接在鍵值對後面的是class例項編碼。

舉個例子,看下面這個exception類層次(member後面括號中為假定值):

exception base ;

exception derived extends base;

其編碼後的資料為:

0x0 (不存在class例項的引用)

0x10 「::derived」 (type id string的長度及內容)

0x14 0x00 0x00 0x00(slice的長度)

0x1(derivedbool)

0x7 「world!」 (derivedstring的長度及內容)

3.14d (deriveddouble,佔8位元組)

0x7 「::base」 (type id string的長度及內容)

0x0e 0x00 0x00 0x00(slice的長度)

0x99 0x00 0x00 0x00(baseint)

0x06 「hello」 (basestring的長度及內容)

當接收端接收到這資料時,會首先取第乙個位元組,判斷是否需要解碼class例項(上面這個例子沒有),然後會檢查第乙個type id(::derived)。如果接收端擁有這個type的定義,則它會將其解碼,如果接收端沒有這個type的定義,它可以根據slice的長度size,跳過這個type的slice,處理下乙個type的slice,直到所有的type id都處理完。如果接收端不識別所有的type,則會丟擲乙個marshalexception異常(這種情況往往是由於client和server各自採用不同的定義檔案造成的)。

若exception包括有class例項的編碼,其編碼規則按class的規則來處理。

ICE協議摘要

1 ice協議由三部分組成 1 資料編碼規範,用來進行各種資料型別的序列化。2 客戶端與伺服器端的互動的訊息型別,以及在何種情況下應發出何種訊息的規範。3 客戶端與伺服器端如何協商二者所用協議及編碼版本的規範。2 資料編碼規範 1 數值型別的編碼是little endian x86的都是這個,所以基...

HTTP協議概要

三 請求行 請求行的格式為 method request uri http version 換行 這裡的 換行 表示後面的資料需要另起一行寫,即請求行獨佔一行。request uri是指請求頁面的uri。而method即為方法,它指定了請求使用的方法,方法有多種,如圖 方法是大小寫敏感的,如 get...

Http協議 概要

http協議 超文字傳輸協議 是位於tcp ip結構中的應用層的一種傳輸協議,規定了全球資訊網伺服器之間相互通訊的規則。比如比較常見的web瀏覽器客戶端與應用伺服器的通訊!全球資訊網伺服器之間互相通訊的時候往往需要其它協議的配合才能完成整個通訊的作業,比如應用層的dns協議,網路層的ip協議等眾多協...