1. 程式人生 > >TCP/IP之薊遼督師

TCP/IP之薊遼督師

原文地址
袁崇煥奉聖旨進京,也被迫帶來了他的心肝寶貝幻月寶鏡。

他一進京,顧上休息, 立刻就先去拜見曾經舉薦提報自己的恩師孫承宗, 看到自己的愛將風塵僕僕的趕來,雖然心疼, 稍事寒暄過後,還是立刻問起了怎麼用幻月寶鏡實現可靠傳輸的問題。

袁崇煥道: “老師有所不知, 這幻月寶鏡雖好,但是如果沒有失敗重傳的方法,一切都是白搭。 關外的環境比關內更加惡劣, 除了強盜野獸,還有飄忽不定的清軍騎兵,隨時打劫你。 ”

“確實是實情, 老夫當年巡視遼東的時候也看到了, 那你發出去物資以後, 是不是要等待對方的回覆確認啊?”

“老師說的對,這也是我們剛開始的設想, 請看這張狀態圖:”
在這裡插入圖片描述

“狀態圖是什麼東西? 你自己弄的?”

“不, 這是荷蘭紅毛送紅衣大炮的時候教我畫的, 他們那邊的人很擅長搞這種玩意, 說是‘科學’, 這張圖的第一個狀態是‘等待發送資料’, 然後傳送分組資料進入了第二個狀態‘等待反饋’, 此時如果對方發來了反饋說‘收到了’, 那就回到第一個狀態, 否則, 重發之前的資料”

“荷蘭紅毛還是挺厲害的, 這是個描述系統的好方法啊,比純用我們漢字好多了。 ”

“是的老師, 這個狀態圖的問題就是:如果對方發回的反饋損壞了改怎麼辦?”

孫承宗道:“有道理, 如果反饋損壞了, 傳送方將無法理解接收方是否收到資料分組, 只好重新發送上一個分組, 但是從接收方來看, 沒法區分這個分組是新的還是一次重傳, 這就麻煩了。 ”

“所以我和滿桂、祖大壽他們商量了下, 我們採用給資料編號的辦法來解決這個問題, 第一次傳送編號為A的, 然後就等待針對A的反饋, 如果反饋沒法識別或者是沒收到, 那就重新發送, 如果反饋是‘收到了’, 那就傳送分組編號為B的資料。 ”
在這裡插入圖片描述
“有個關鍵問題, 那要是出現了反饋遲遲收不到怎麼辦, 你肯定不能無限制的等待吧? ”

“老師明鑑, 我們確實遇到了這個問題, 於是就搞了一個沙漏定時器, 針對上面的狀態做了改進, 分組一發送就開始計時,如果超時就重新發送同一分組, 像這樣:”
在這裡插入圖片描述
(點選看大圖)

孫承宗道:”好複雜啊,老夫這腦子裡全是四書五經, 這狀態圖讓人頭蒙啊。 “

師生二人正聊著, 下人通報首輔葉大人來了。

同樣是老學究的葉首輔看到了袁崇煥畫的西洋狀態圖, 大為吃驚,心想袁崇煥贏得寧遠大捷和寧錦大捷,果然是與眾不同。

經過袁崇煥連番講解,葉首輔終於明白了這是怎麼回事, 他捻著鬍子思忖一下, 馬上提出一個問題:“你每次傳送一個分組都得等待, 多慢啊, 能不能連續傳送?”

孫承宗和袁崇煥對視一眼, 心想果然薑還是老的辣。

袁崇煥道:“葉大人高瞻遠矚, 思慮縝密,屬下佩服。 這個問題我們把我們困住了很久才想出一個辦法, 這個方法約定,傳送方可以連續的傳送分組,但是有限制數量,例如只能連續傳送4個, 我們稱之為視窗, 傳送視窗滿了就不能發了,需要等待接收方的確認, 當確認來了以後才能繼續傳送, 向前移動視窗 。”
在這裡插入圖片描述

“這又是個什麼圖? ” 葉首輔問到。

“這也是紅毛們教我的,可以稱為互動圖, 大人請看, 我們傳送到分組4的時候, 視窗滿了, 就停止傳送, 只有等到分組1的確認(acknowledge, 簡稱ACK)來了以後,才繼續傳送下一個分組。”

孫承宗道: “我看到分組3在傳送當中丟失了, 超時後重新發送, 可是接收端明明收到了分組4, 5, 6還要丟棄啊。 ”

袁崇煥道:“這個辦法是滿桂最先提出的, 他是一個粗人, 想出的方法也很粗暴, 非常依賴幻月寶鏡, 把失敗分組及其以後的全部重新發送, 的確浪費。”

(碼農翻身注: 這叫做回退N步協議)

葉首輔道:“很明顯, 你們得選擇性的重傳那些丟失的分組。”

“大人說的對, 請看這個圖:”
在這裡插入圖片描述
“這個圖中只發送丟失的分組3, 在接收端會暫時快取分組4,5,6, 這樣就省了很多事了”

(碼農翻身注:這叫做選擇性重傳)

葉首輔一拍大腿道: “好 !應該不錯了, 我們就用這種辦法來建立大明的可靠傳輸網路吧“

接著他又鄭重的補充到 : “ 二位要注意, 這些失敗重傳的方法,是我們三人的祕密, 絕不能讓魏閹黨知道, 要不然他又要去找皇上邀功請賞了。”

(碼農翻身注:這只是可靠性傳輸的原則, 實際的TCP協議要更復雜,需要考慮雙向的全雙工通訊,想了解詳情的可以看《TCP/IP詳解 卷1》)