聲明:本文僅提供一個思路,因本人較lan,且近期時間匆忙,是以代碼實作有許多不足制之處(詳情見正文 四、不足之處 )
文章目錄
- 一、實驗需求
- 二、測試效果
- 測試用例一
- 測試用例二
- 三、完整代碼
- 四、不足之處
一、實驗需求
掌握TCP進行擁塞控制的四種算法:慢開始、擁塞避免、快重傳、快恢複的工作原理,程式設計實作擁塞控制算法。
程式輸入:
(1)擁塞視窗cwin;
(2)初始門檻值ssthresh;
(3)判斷封包段丢失的依據(逾時?三個重複确認?)
(4)(…自行設定額外輸入項)
程式輸出:
(1)輸出前i輪次擁塞視窗的值。
(2)畫圖描述出擁塞視窗的變化曲線。
聲明:因涉及圖像結果的輸出,選用 Python 較為友善。
二、測試效果
測試用例一
測試資料輸入:
- 初始擁塞視窗大小:1
- 初始門檻值大小:16
- 逾時發生時的傳輸輪次(沒有則輸-1):12
- 重傳發生時的傳輸輪次(沒有則輸-1):-1
- 傳輸輪次:22
程式輸出如下:
測試用例二
測試資料輸入:
- 初始擁塞視窗大小: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輸出圖的中文編碼
- 為設定多個逾時,多個阻塞的情況
- …讀者自行更改即可,本文僅提供一個思路