在學習過計算機網絡的課程,咱們知道剛開始計算機都是單獨脫機工做的,沒有聯網的狀況下計算機的信息共享能力、運算能力都很是有限,後來誕生了計算機網絡.有了就是那幾網絡,計算機 A 的信息和數據能夠經過網絡傳遞到計算機 B,一樣計算機 A 能夠獲取到來自計算機 B 的數據. 可是不一樣計算機之間交換數據的時候就要經過網絡來傳輸了.傳輸的過程當中須要不一樣的計算機都遵循必定的規則來組裝數據、傳遞信息,那麼這樣的規則就叫作協議.git
計算機網絡中有很是多協議,這些協議位於 OSI 的不一樣層中,好比 TCP/IP、UDP、SMTP、FTP 等. 協議之因此稱爲協議,是由於它具備約束效應,信息在端到端的傳輸過程當中,同等層次之間經過使用一樣的協議規則,這樣發送方在該層次按照協議約定處理數據,接收方在該層次按照協議約定解析數據.成對存在.github
在平常開發的時候處於某些緣由可能須要自定義報文協議.這個協議是創建在 TCP 鏈接的基礎上,好比,移動端在作 APM 的時候將功能拆分爲2個模塊,一個是 APM 監控模塊、一個爲了方即可拓展單獨作了一個數據上報組件,具備動態下發上報策略的配置.網絡
因此上報組件這裏涉及到和服務端高效通訊,因此客戶端和服務端約定了一套自定義的報文協議,以下所示.學習
PACKET 總體結構 | HEAD | META | BATCH_PAYLOAD |編碼
PACKET::HEAD 結構加密
| META_SIZE (2bytes unsigned int) | BATCH_COUNT (1 bytes unsigned int) | PAYLOAD_SIZE (4bytes unsigned int) | PAYLOAD_SIZE (4bytes unsigned int) | ... |計算機網絡
PACKET::META 結構設計
換行符分割的 JSON 字符串3d
crypto(deflate(JSON\nJSON...))code
PACKET::BATCH_PAYLOAD 結構
JSON 體裏每一個字段的值都是 BASE64 編碼的
crypto(deflate(JSON) | crypto(deflate(JSON) | ...
其實計算機網絡過程當中傳輸的就是二進制數據,因此拿 iOS 舉例來講,咱們自定義報文協議的目的就是按照協議的約定,自定義組裝好一個 NSData 的數據,報文裏面的頭規定了各類信息的組裝格式.
因此核心就上面的3點,一點都不難,只不過第一次作的時候可能會踩坑.列覺以下
Objective-C 語言中處理 unsigned int 的數據,因此你須要直接操做 unsign short 到 NSData, NSData 的接口很方便, [NSData dataWithBytes:&metaLength length:sizeof(metaLength)]]
就能夠處理成 2byte 的 unsigned int 的數據