系統(tǒng)設(shè)計(jì),協(xié)議先行。 大部分人不了解協(xié)議的設(shè)計(jì)細(xì)節(jié),更多使用已有協(xié)議進(jìn)行應(yīng)用層設(shè)計(jì),例如: (1)使用HTTP,設(shè)計(jì)get/post/cookie參數(shù),以及json包格式; (2)使用dubbo,而不用去深究內(nèi)部的二進(jìn)制包頭包體細(xì)節(jié); 無論如何,了解協(xié)議設(shè)計(jì)的原則,對深入理解系統(tǒng)通信非常有幫助。 一、協(xié)議的分層設(shè)計(jì) 畫外音:后文主要講語法設(shè)計(jì)。 協(xié)議設(shè)計(jì)通常分為三層:應(yīng)用層協(xié)議、安全層協(xié)議、傳輸層協(xié)議。 二、應(yīng)用層協(xié)議設(shè)計(jì) 應(yīng)用層協(xié)議選型,常見的有三種:文本協(xié)議、二進(jìn)制協(xié)議、流式XML協(xié)議。 文本協(xié)議 文本協(xié)議是指“貼近人類書面語言表達(dá)”的通訊傳輸協(xié)議,典型的協(xié)議是HTTP協(xié)議,一個(gè)HTTP協(xié)議的請求報(bào)文樣例如下:
文本協(xié)議的特點(diǎn)是: 二進(jìn)制協(xié)議 (1)定長包頭; (2)可擴(kuò)展變長包體; (3)一般每個(gè)字段有固定的含義,以IP協(xié)議為例,前4個(gè)bit表示協(xié)議版本號(Version); 二進(jìn)制協(xié)議的特點(diǎn)是: (1)可讀性差,難于調(diào)試; 畫外音:打日志一般需要一個(gè)toString()函數(shù)增強(qiáng)可讀性。 (2)擴(kuò)展性不好,如果要擴(kuò)展字段,舊版協(xié)議就不兼容了,所以設(shè)計(jì)時(shí)一般會有一個(gè)Version字段; 這是一個(gè)典型的16字節(jié)二進(jìn)制定長包頭的例子:
其中: (1)前4個(gè)字節(jié)表示版本號version; (2)接下來4個(gè)字節(jié)表示魔法數(shù)字magic_num,用來解決數(shù)據(jù)錯位或丟包問題; 畫外音:例如,約定好魔法數(shù)字是0x01020304,收到的報(bào)文,魔法數(shù)字匹配,認(rèn)為是正常報(bào)文,否則認(rèn)為是報(bào)文異常,斷開連接。 (3)接下來4個(gè)字節(jié)表示命令號command,不同的命令號對應(yīng)不同的變長包體; 這是一個(gè)實(shí)際的二進(jìn)制變長包體:
它使用的是Google的Protobuf協(xié)議,容易看到: (1)請求報(bào)文傳入的是用戶名與密碼; (2)響應(yīng)包返回的是用戶的uid; (2)自帶壓縮功能; (3)對二進(jìn)制友好; (4)在工業(yè)界已廣泛應(yīng)用; 流式XML協(xié)議
從xml標(biāo)簽中大致可以判斷這是一個(gè)romeo發(fā)給juliet的聊天消息。
(3)有效數(shù)據(jù)傳輸率超低,有大量的標(biāo)簽; (4)對二進(jìn)制不友好 ,比如語音/視頻等; 三、安全層協(xié)議設(shè)計(jì) 安全層協(xié)議設(shè)計(jì),除了使用SSL,自行實(shí)現(xiàn)的話,常見的又有以下三種方案。 畫外音:SSL秘鑰管理是個(gè)問題。 固定密鑰 畫外音:安全性低,安全性基于程序員的職業(yè)操守。 一人一密 (1)固定加密算法; (2)加密秘鑰使用“用戶的某一特殊屬性”,比如用戶uid、手機(jī)號、qq號、用戶密碼等; 一次一密 四、傳輸層協(xié)議設(shè)計(jì) 架構(gòu)師之路-分享可落地的技術(shù)文章 調(diào)研: 貴司的加密,是在代碼中寫死秘鑰么? |
|