天天看點

【計網】代碼實作:TCP擁塞控制算法程式設計實驗(結合matplotlib折線圖輸出結果)

聲明:本文僅提供一個思路,因本人較lan,且近期時間匆忙,是以代碼實作有許多不足制之處(詳情見正文 四、不足之處 )

文章目錄

  • ​​一、實驗需求​​
  • ​​二、測試效果​​
  • ​​測試用例一​​
  • ​​測試用例二​​
  • ​​三、完整代碼​​
  • ​​四、不足之處​​

一、實驗需求

掌握TCP進行擁塞控制的四種算法:慢開始、擁塞避免、快重傳、快恢複的工作原理,程式設計實作擁塞控制算法。

程式輸入:

(1)擁塞視窗cwin;

(2)初始門檻值ssthresh;

(3)判斷封包段丢失的依據(逾時?三個重複确認?)

(4)(…自行設定額外輸入項)

程式輸出:

(1)輸出前i輪次擁塞視窗的值。

(2)畫圖描述出擁塞視窗的變化曲線。

聲明:因涉及圖像結果的輸出,選用 Python 較為友善。

二、測試效果

測試用例一

【計網】代碼實作:TCP擁塞控制算法程式設計實驗(結合matplotlib折線圖輸出結果)

測試資料輸入:

  • 初始擁塞視窗大小:1
  • 初始門檻值大小:16
  • 逾時發生時的傳輸輪次(沒有則輸-1):12
  • 重傳發生時的傳輸輪次(沒有則輸-1):-1
  • 傳輸輪次:22

程式輸出如下:

【計網】代碼實作:TCP擁塞控制算法程式設計實驗(結合matplotlib折線圖輸出結果)

測試用例二

【計網】代碼實作:TCP擁塞控制算法程式設計實驗(結合matplotlib折線圖輸出結果)

測試資料輸入:

  • 初始擁塞視窗大小:1
  • 初始門檻值大小:16
  • 逾時發生時的傳輸輪次(沒有則輸-1):12
  • 重傳發生時的傳輸輪次(沒有則輸-1):21
  • 傳輸輪次:26

程式輸出如下:

三、完整代碼

import numpy as np 
from matplotlib import pyplot as plt 


#程式輸入-------

'''測試資料
1
16
12
-1
22

1
16
12
21
26
'''

cwin = eval(input('請輸入初始擁塞視窗大小:')) #擁塞視窗
ssthresh = eval(input('請輸入初始門檻值大小:')) #初始門檻值

#是否逾時 >0-True  -1-False
ifTimeoutRoundIndex = eval(input('請輸入逾時發生時的傳輸輪次(沒有則輸-1):')) #逾時發生時的傳輸輪次

#是否重傳 >0-True  -1-False
ifReTransmissionRoundIndex = eval(input('請輸入重傳發生時的傳輸輪次(沒有則輸-1):')) #重傳發生時的傳輸輪次

roundCount = eval(input("請輸入傳輸輪次:")) #傳輸輪次


#算法----------

listXResult = [] #後期繪圖用的x坐标集(此處直接用roundCount算出也可以)
listYResult = [] #後期繪圖用的y坐标集


for roundIndex in range(roundCount):
    print("第", roundIndex, "輪:", ",擁塞視窗大小:", cwin)

    #圖:收集x, y坐标
    listXResult.append(roundIndex)
    listYResult.append(cwin)

    #先判斷,是否逾時或重傳------------

    #---若逾時--->轉-慢開始
    if (roundIndex == ifTimeoutRoundIndex):
        ssthresh = cwin // 2
        cwin = 1
        continue
    #---若重傳--->轉-快重傳
    if (roundIndex == ifReTransmissionRoundIndex):
        ssthresh = cwin // 2
        cwin = ssthresh
    #--------------------------------

    #+++++++慢開始
    #【擁塞視窗 < 初始門檻值】
    if (cwin < ssthresh):
        cwin *= 2
        #避免因x2而越界
        if (cwin > ssthresh):
            cwin = ssthresh

    #+++++++擁塞避免
    #【擁塞視窗 > 初始門檻值 且 目前輪次 < 逾時發生時的傳輸輪次】
    elif (cwin >= ssthresh): 
        cwin += 1

    

#程式輸出-------
# print("----------------------------------")
# print(listXResult)
# print(listYResult)

plt.xlabel("傳輸次數 roundIndex")
plt.ylabel("擁塞視窗 cwin")
plt.plot(listXResult, listYResult, 'r')
plt.grid()#添加網格
plt.show()      

四、不足之處

  • 未進行使用者輸入的檢驗,讀者可自行彌補此缺點
  • 未更改plt輸出圖的中文編碼
  • 為設定多個逾時,多個阻塞的情況
  • …讀者自行更改即可,本文僅提供一個思路