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。
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網路協議 學習摘要
一 http協議狀態碼 狀態碼主要用於描述當客戶端向伺服器傳送請求時的返回結果,標記服務端的處理是否正常,通知出現的錯誤等工作。狀態碼整體分為五大類 1開頭的狀態碼 資訊類狀態碼,主要接收請求,表示接受正在處理 2開頭的狀態碼 請求成功狀態碼,表示請求正常處理完畢 3開頭的狀態碼 重定向狀態碼,表示...
HTTP協議學習 (三)摘要認證
這個認證可以看做是基本認證的增強版本,使用隨機數 密碼進行md5,防止通過直接的分析密碼md5防止破解.摘要訪問認證最初由 rfc 2069 http的乙個擴充套件 摘要訪問認證 中被定義加密步驟 後來發現,就算這樣還是不安全 md5 可以用彩虹表進行攻擊 所以在rfc 2617入了一系列安全增強的...