TCP滑動窗口協議

哎,研究了兩個小時也算是看懂了GBN(滑動窗口協議)擴展FSM的描述,關於滑動窗口協議如下圖:

TCP滑動窗口協議

紅色方框代表發送方(或者說是客戶機)要發送的分組(或者說是報文)左邊就是客戶機已經發送並且得到服務器應答的分組,紅色方框右邊的分組就是還不能發送的分組,工作過程是這樣的:比如現在方框的最左邊的編號是31,那麼當31發送完後,32在發送,一直到50,只有31得到服務器的應答後紅色方框整體才向右移動,若是31一直得不到應答,就算31後面的都得到了應答,窗口(說紅色方框有點不專業哈,能懂就行!!!)是不會向右移動的,哦對了,窗口裡面由兩部分組成,一部分就是報文正在實際的物理通道中傳輸的,還有一部分就是客戶機正要發送的報文,那麼也就是說,按順序編好的報文只有依次(注意是依次,重要事只強調幾遍)得到應答,窗口才會向右移動(這句話的意思就是後面那些不能發送才能得到權利被髮送)。

下面我們來研究的更加深入來看看FSM描述:

先看發送方(也就是客戶機方面的):

TCP滑動窗口協議

FSM描述圖

找了很久的圖片來自一篇博客的:https://blog.csdn.net/qq_20233867/article/details/78242170?locationNum=8&fps=1

虛線表示發送方初始,這裡的base表示窗口的的最左邊也就是最早的未確認分組的序號比如上圖的31;nextseqnum表示下一個將要發送的分組序號(再說一遍上面的分組分為4個部分,第一個就是發送了並得到應答的分組,比如上圖序號的26-30;第二和三部分都在窗口裡面分別代表正在發送未得到應答的分組和即將發送的分組,上圖沒畫就不比如了;第四部分就是還未能得到被髮送權利的分組,比如序號為50以後的)所以base就是第二部分的開始序號;nextseqnum就是第三部分的開始的序號。N代表窗口序號的個數,換句話就是要發送的分組的個數。

假設這裡有n個分組的前6個分組,窗口的大小N = 6如下圖:

TCP滑動窗口協議

首先虛線表示初始base = nextseqnum = 1,N = 6那麼base 和nextseqnum 指向序號為1的分組;if(nextseqnum < base + N)表示的意思是判斷是否還有要發送的分組,學過數學的應該灰機算吧->_->然後把nextseqnum 對應的序號做成包對應if 的下面的語句,然後就是發送包對應udt_send,此時由於base = nextseqnum = 1滿足if(base = nextseqnum)就開啟定時器(定時器的作用就是在規定時間內若是發送的分組得不到應答客戶機就會再次發送數據,重發就是可靠數據傳輸的核心,前提是數據不對的情況),最後nextseqnum++(此時nextseqnum = 2;base = 1)。然後我們來看FSM描述圖的最下面,首先發送方接收到接收方的應答數據包,若是數據包在傳輸的過程中沒有損壞,那麼base = getacknum(rcvpkt) + 1,也就是發送方發給接收方分組序號(這個序號也等於接收方發送應答分組給發送的序號) + 1,那麼此時base = 2;換句話就是該分組得到了應答,窗口要向右移動而根據base的定義,base 就要+1,那麼也就滿足下面的if(base = nextseqnum )使得定時器就會停止,那麼問題來了,若是這個分組得不到應答會怎樣???比如從開始的base = nextseqnum = 1然後是發送數據,再然後開啟定時器,nextseqnum ++,再然後發送方就會等待應答分組,若是一直得不到應答若是到了定時器的時間(看FSM發送方圖的右邊就有timeout),那麼發送方就會重新發送數據包(報文或者分組),但是這個數據包指的是已發送但沒確認的分組

。由於此時base = 1,nextseqnum = 2,那麼就會又再次發送序號為1的分組,若是序號為1的分組任然得不到應答,導致nextseqnum 不挺的自加,那麼由於base未得到應答導致,base到nextseqnum 的數據再次重發,那麼你又會想到,若是1得不到應答,而2到後面的分組得到應答會是怎樣的情況,假設這裡nextseqnum =2得到應答,那麼再看FSM發送方描述圖的下面的if語句就會導致定時器再次開啟,然後由於base未1的序號得不到應答base的支部會++所以當超時的時候再次發送序號base到nextseqnum 的數據包,所以base不變,其他的都別想動。還有一點就是,若果發送方接收到有損失的應答分組,發送方什麼也不做,除了再次進入等待完整無暇的應答分組。比如序號1的應答錯誤,而定時器在之前就被開啟,若是在規定時間得不到完好的應答包就會再次重新發送數據。

我們再來看看接收方的FSM的描述圖:

TCP滑動窗口協議

接收方FSM描述圖

圖片來自同樣一篇博客(圖實在太難找了,見諒哈),同樣虛線代表開始(初始值),expectedseqnum(代表期望的序號) = 1,sndpkt就是序號為0的應答包,按照正常的線路走就是,初始->接收到完整的由發送方發來的數據包然後就是提交到應用層,然後expectedseqnum++,也就代表接收方期望得到下一個分組的數據包,同樣的道理,若是發送方發來的數據有誤怎麼辦???default(默認)udt_send(sndpkt)什麼意思???涼拌,繼續發送上一個應答的分組比如expectedseqnum =1 ,檢測包有問題就跳到默認,而根據sndpkt = make_pkt(0,ACK,checksum),這裡的sndpkt 就是包為0的數據包(假設序號1的分組前面是0),那麼就繼續發送分組為0的應答包,正好滿足,你發來的包有問題,我就讓你等待直到超時再次發送。

以上就是發送方和接收方FSM最為詳細的解釋,沒有之一!!!慢慢看自然看的懂的!!!

2018/11/8 23:33 慕名蘭


分享到:


相關文章: