應(yīng)用層協(xié)議那些事

應(yīng)用層的協(xié)議簡單來說就是程序之間網(wǎng)絡(luò)通信的方式淋昭,相當(dāng)于就是我們說話的方式茵休,兩個人能成功的進(jìn)行溝通需要有兩個先決條件:

1、大家在說同一種語言

一個只會說漢語的人和一個只會說德語的人注定是無法在一起的震叙;一個胡建人和一個河北人雖然會有較高的誤碼率倚评,但基本還是可以談戀愛的。

2单鹿、需要有“斷句”方式的約定

人類的溝通無一例外是通過“說話的停頓”和“對于語言內(nèi)容的理解”來進(jìn)行斷句的:

說話的停頓

“Hey掀宋,你在干啥呢?”仲锄、“寫作業(yè)呢”劲妙、“吃飯了沒”、”一會兒去吃
煎餅“儒喊,理解沒有問題

對于語言內(nèi)容的理解

“Hey你在干啥呢吃飯了沒”镣奋、”寫作業(yè)呢一會兒去吃煎餅“。也能費(fèi)勁理解(NLP)

3澄惊、對于計算機(jī)網(wǎng)絡(luò)

當(dāng)兩臺計算機(jī)需要溝通的時候唆途,情況是十分類似的:

“大家在說同一種語言”很容易理解,我們不能用FTP協(xié)議去訪問HTTP的服務(wù)器掸驱。

“斷句方式“往往被初學(xué)者所忽略肛搬,校園招聘的時候經(jīng)常遇到小朋友做了個“基于socket的文件傳輸工具”,但細(xì)問起傳輸協(xié)議是怎么判定文件傳輸結(jié)束的時候毕贼,有很多人就不明白這個問題的點在哪里温赔,這時我就十分懷疑這個”傳輸工具“只是個Broken Toy。

由于現(xiàn)在廣泛應(yīng)用的TCP協(xié)議是基于流的傳輸協(xié)議(Stream)鬼癣。也就是說陶贼,傳輸層協(xié)議本身沒有“斷句”的功能。
參見:https://en.wikipedia.org/wiki/Transport_layer#COMPARISON1

這就要求我們在協(xié)議層實現(xiàn)”斷句“:

4待秃、 ”斷句“的方式

斷句的方式也是隨著計算機(jī)網(wǎng)絡(luò)的發(fā)展一直在進(jìn)化:

  • 初拜秧,盤古開天辟地,有些類似于PING-PONG協(xié)議的非常簡單的定長協(xié)議章郁,限定消息長度是4個字節(jié)枉氮,協(xié)議的功能也十分之弱智志衍,你發(fā)PING,我回PONG聊替。

  • 1968~1971年誕生的Telnet楼肪、FTP這類化石級的協(xié)議,一般采用的策略就是和我們寫文章一樣的方式:用回車和換行來標(biāo)示一條命令的結(jié)束惹悄。這里細(xì)心的人就會想那遇到消息里本身有\(zhòng)r\n的情況怎么辦呢春叫?答案就是,轉(zhuǎn)義泣港!就是在消息本身帶有\(zhòng)r\n的地方前面加一個”\”字符暂殖。stupid but work

  • 1982年制定的SMTP協(xié)議的Header就沿用了上述的\r\n方式,但SMTP需要傳輸郵件內(nèi)容爷速,郵件附件央星。如果繼續(xù)采用“轉(zhuǎn)義”大法霞怀,恐怕有點吃不消惫东。這時候就有大神提出了用Base64進(jìn)行編碼,把所有字符都轉(zhuǎn)化成a-z, A-Z, 0-9等字符毙石。這樣就就完美解決了這個問題廉沮。但副作用就是數(shù)據(jù)會膨脹1/3左右。

  • 1991年制定HTTP協(xié)議Header繼續(xù)沿用\r\n的方式徐矩,但由于HTTP將會傳輸更多的數(shù)據(jù)滞时,用Base64就太浪費(fèi)寶貴的帶寬資源了。于是我們的前輩們就想出一個好辦法滤灯,在Header里固定增加一個Content-length字段坪稽,用來標(biāo)示,后續(xù)的數(shù)據(jù)大小鳞骤。Haeder和content用\r\n\r\n分割窒百。這樣就解決了問題,有不會造成數(shù)據(jù)膨脹豫尽。(后續(xù)增加的trunk模式這里就不展開說了)

  • 當(dāng)然有朋友就會問了篙梢,有沒有可能不增加額外的字節(jié)解決“斷句”問題?答案是:Yes美旧。1999年XMPP協(xié)議被制定出來的時候渤滞,就實現(xiàn)了這個設(shè)想。XMPP是基于XML的協(xié)議榴嗅,XML的語法解析是有能力判斷XML是否閉合妄呕,從而完成“斷句”。但這種方式有一個較為嚴(yán)重的問題就是嗽测,“斷句”邏輯依賴編碼方式绪励,這樣在工程上的實現(xiàn)難度就會變大。

這里有個有意思的插曲,大家可能發(fā)現(xiàn)GFW有封SSH協(xié)議的能力优炬,按理說SSH是加密的颁井,不應(yīng)該能被識別出來啊,看下圖大家就應(yīng)該明白了:

SSH協(xié)議在client連接成功后蠢护,server端會主動明文發(fā)送ssh的版本信息雅宾。

5、復(fù)雜度和效率的平衡

首先我們介紹一種叫Netstring 的協(xié)議:開頭用ASCII明文標(biāo)記后面數(shù)據(jù)的大小葵硕,然后緊跟一個“:”眉抬,然后是數(shù)據(jù),最后以一個“,”結(jié)尾懈凹。

12:hello world!,

空消息:

0:,

我們在之前幾家公司做項目的時候為了平衡“工程實現(xiàn)復(fù)雜度”和“運(yùn)行效率”蜀变,往往采用類似Netstring的協(xié)議,并進(jìn)一步簡化介评,固定10bytes的ASCII頭表示消息長度库北,后面緊跟數(shù)據(jù)。

0000000002hi

這樣做的優(yōu)勢有:

  • ASCII頭方便debug
  • 10bytes固定頭長度们陆,易于算法實現(xiàn)寒瓦,消息長度上限大約是10GB,基本夠用
  • 頭后面緊跟數(shù)據(jù)坪仇,不需要其它邏輯
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杂腰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子椅文,更是在濱河造成了極大的恐慌喂很,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皆刺,死亡現(xiàn)場離奇詭異少辣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芹橡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門毒坛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人林说,你說我怎么就攤上這事煎殷。” “怎么了腿箩?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵豪直,是天一觀的道長。 經(jīng)常有香客問我珠移,道長弓乙,這世上最難降的妖魔是什么末融? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮暇韧,結(jié)果婚禮上勾习,老公的妹妹穿的比我還像新娘。我一直安慰自己懈玻,他們只是感情好巧婶,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涂乌,像睡著了一般艺栈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上湾盒,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天湿右,我揣著相機(jī)與錄音,去河邊找鬼罚勾。 笑死毅人,一個胖子當(dāng)著我的面吹牛峦阁,可吹牛的內(nèi)容都是我干的馏段。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼分衫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起般此,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚪战,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后铐懊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邀桑,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年科乎,在試婚紗的時候發(fā)現(xiàn)自己被綠了壁畸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡茅茂,死狀恐怖捏萍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情空闲,我是刑警寧澤令杈,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站碴倾,受9級特大地震影響逗噩,放射性物質(zhì)發(fā)生泄漏掉丽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一异雁、第九天 我趴在偏房一處隱蔽的房頂上張望捶障。 院中可真熱鬧,春花似錦纲刀、人聲如沸残邀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芥挣。三九已至,卻和暖如春耻台,著一層夾襖步出監(jiān)牢的瞬間空免,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工盆耽, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蹋砚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓摄杂,卻偏偏與公主長得像坝咐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子析恢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容