讓我們來看一個故事,讀完這個故事,我相信你和面試官的對話會非常愉快。
網(wǎng)絡(luò)帝國的崛起
隨著時間的流逝,計算機(jī)帝國的子民耐不住寂寞,他們好想去外面的世界看看,去其他的計算機(jī)家中串串門,他們經(jīng)常抱怨,為什么那些官員可以互相聊天,而我們只能自己對自己說話.
這些抱怨傳到了計算機(jī)國王的耳中,國王也很頭痛啊,他也想讓子民相互溝通,暢聊無阻,可是不同計算機(jī)運(yùn)行著不同的操作系統(tǒng),他們在表達(dá)同一種信息的時候采用的方式千差萬別,很難統(tǒng)一啊,官員們也是費了好大勁才把那么幾個操作系統(tǒng)的通信搞定,更何談萬千子民了.
這一次,國王召開會議與大臣一起討論這個問題,最終一致認(rèn)為成立網(wǎng)絡(luò)專研小組,專門研究此問題
TCP/IP 家族的誕生
成立專家組之后,專家立即開始討論如何使不同計算機(jī)建立通信,通過大量的考察不同的操作系統(tǒng),專家們歷經(jīng)千辛萬苦最終制定了統(tǒng)一標(biāo)準(zhǔn)——TCP/IP 協(xié)議族(注意:TCP/IP不是一個協(xié)議,而是一系列協(xié)議的總和),這個家族里包含了許多協(xié)議,比如常見的TCP協(xié)議,UDP協(xié)議
一次奇異的聊天
專家組把協(xié)議給國王看了看,國王非常高興,馬上派人把TCP/IP協(xié)議族中的所有協(xié)議分發(fā)給萬千子民并給每一位子民拉了一根網(wǎng)線,子民們收到也非常高興,各自研究其協(xié)議了
上官天宇和司馬劍就是其中兩位(下稱上官和司馬),數(shù)天后,在得知上官的地址(對應(yīng)IP和端口)后,司馬決定用可靠傳輸?shù)腡CP和上官進(jìn)行通信,因為他不想在第一次聊條中漏掉任何文字
可是這個TCP有幾個比較討厭的就是聊天之前要做很多準(zhǔn)備工作,有兩步(真實的有三步,這里是為了體現(xiàn)兩次握手的缺陷)?
第一步: 他要發(fā)送一條建立連接的消息告訴對方咱兩要通信了?
第二步: 對方收到這個消息后,要回復(fù)他一個確認(rèn)消息?
上面兩步(兩次握手)做完了,兩人才能夠通信
于是,司馬通過遵守TCP協(xié)議給上官天宇發(fā)了個”你好”,過了一會兒,他見上官沒給他發(fā)確認(rèn)消息?
于是他就按照TCP的超時重傳機(jī)制[簡單的說就是在一定的時間后,如果對方?jīng)]有回應(yīng),就認(rèn)為這個消息發(fā)送失敗,要重新發(fā)送],然后司馬就重新發(fā)了一個消息給上官了
過了一小會,上官發(fā)來了確認(rèn)消息,里面寫著:“我收到了”(這個時候兩次握手已經(jīng)完成,兩個人可以進(jìn)行聊天了)?
然后上官也給司馬發(fā)了一個“你好”,相互聊了幾句,就關(guān)閉了連接(四次揮手在下篇說)
殊不知過了一會,司馬又收到聊了上官的確認(rèn)消息,司馬心中很納悶,我沒給他再發(fā)消息???喜歡探究原因的他把這個事情上報給TCP/IP的酋長了
設(shè)計上的缺陷
酋長帶著問題來到了宮廷,見了專家組,專家組也很納悶,想了許久,一個資深的元老突然說道,我們的設(shè)計可能有問題,現(xiàn)在我們的TCP是兩次連接后就可以進(jìn)行通信了,現(xiàn)在有這么一種情況,當(dāng)A發(fā)送一個消息給B,這個消息由于網(wǎng)絡(luò)的原因,阻塞在某個節(jié)點了,如下圖
然后阻塞的時間很長,超出了咱們設(shè)定超時重發(fā)時間,那么A就會認(rèn)為這個消息丟失了,然后重新發(fā)送
當(dāng)A和B通信完成后,這個之前被A認(rèn)為”失效的消息“到達(dá)了B,而對于B而言,以為這是一個新的請求連接消息,就向A發(fā)了一次確認(rèn)(這就可以解釋司馬有收到了一次的確認(rèn)消息了),而對于A而言,他認(rèn)為他沒有給B再次的發(fā)消息(因為上次的通話已經(jīng)結(jié)束了),所以A不會理睬這條確認(rèn),但是B則會一直在傻傻的等待著A的消息
這就導(dǎo)致了B的時間被白白浪費(對于服務(wù)器而言,就是CPU等資源的一種浪費),這樣是萬萬不可的,這就是為什么不能兩次握手的原因
最終的修訂
專家組的人一致贊同這個觀點,然后幾個人還做了幾個實驗,結(jié)論是確實是這個原因?qū)е碌?,最后專家組坐在一塊討論如何修改這個TCP協(xié)議,元老發(fā)話了,其實修改也很簡單,再加一次通信(握手)就行了,如下圖?
就是說A最后還要給B發(fā)一個確認(rèn),還是上次的那個例子,如果A不給B發(fā)第三次確認(rèn)消息,那么B就認(rèn)為A并沒給他發(fā)消息,B也就不會在那里傻傻的等待了。最后酋長帶著答案和修改草稿回到了部落。