---
# System prepended metadata

title: 無線及寬頻網路 week5 1102951 劉宗翰

---

# 無線及寬頻網路 week5 1102951 劉宗翰
## 第一題 TCP擁塞控制的三種方式

   - **Slow Start（慢啟動）**：在TCP連線開始或丟包後，傳送端會以指數增長的方式逐步增加擁塞窗口（cwnd）的大小。每次成功接收到ACK後，傳送端會將cwnd加倍，直到達到一個閾值（ssthresh，慢啟動閾值）。此階段的目的是探測網路的可用頻寬。

   - **Congestion Avoidance（擁塞避免）**：當cwnd達到ssthresh後，TCP會進入擁塞避免階段。在這個階段，cwnd不再以指數方式增加，而是以線性方式增加，每次成功接收到ACK後，cwnd僅增加一個單位。這個階段的目標是避免網路擁塞。

   - **Fast Retransmit（快速重傳）**：如果傳送端連續收到三個相同的ACK（即重複ACK），TCP會認為資料包丟失，並立即進行重傳，而無需等待超時。重傳資料後，TCP會減少cwnd，並可能進入快恢復階段。

## 第二題 Throughput圖中的各個階段說明
![image](https://hackmd.io/_uploads/r1Z22pwy1e.png)
   - **Slow Start階段**：在圖的左側，可以看到throughput（吞吐量）從較低的值開始迅速增加，這種增加接近指數增長，對應的是慢啟動階段。大約在1秒左右，增長速度開始放緩。

   - **Congestion Avoidance階段**：在1秒到2.5秒之間，吞吐量的增長速度變得緩慢且趨於平穩，這表明TCP進入了擁塞避免階段，cwnd的增長變得線性。

   - **Fast Retransmit階段**：圖中可以看到一些點出現了短暫的吞吐量下降，尤其是在2.5秒左右有一個明顯的下降。這可能是由於資料包丟失，啟動了快速重傳機制。

總結：慢啟動階段出現在圖的左側，吞吐量快速上升；擁塞避免階段位於右側，吞吐量增長放緩；快速重傳則表現為吞吐量的短暫下降。

## 第三題 將結束時間設為random
### 程式碼片段
```TCL=
set ns [new Simulator]

set nd [open out.tr w]
$ns trace-all $nd

set nflow	3

set r1 [$ns node]
set r2 [$ns node]
$ns duplex-link $r1 $r2 1Mb 10ms DropTail

for {set i 1} { $i <= $nflow } { incr i } {

	set s($i) [$ns node]
	set d($i) [$ns node]
	
	$ns duplex-link $s($i) $r1 10Mb 1ms DropTail 
	$ns duplex-link $r2 $d($i) 10Mb 1ms DropTail
}

for {set i 1} {$i <= $nflow} {incr i} {
	
        set tcp($i) [new Agent/TCP]
        set sink($i) [new Agent/TCPSink]
        $ns attach-agent $s($i) $tcp($i)
        $ns attach-agent $d($i) $sink($i)
        $ns connect $tcp($i) $sink($i)
	
        set ftp($i) [new Application/FTP]
        $ftp($i) attach-agent $tcp($i)
        $ftp($i) set type_ FTP
}

set rng [new RNG]
$rng seed 1

set RVstart [new RandomVariable/Uniform]
$RVstart set min_ 0
$RVstart set max_ 1
$RVstart use-rng $rng

set RVend [new RandomVariable/Uniform]
$RVend set min_ 5
$RVend set max_ 6
$RVend use-rng $rng

for {set i 1} { $i <= $nflow } { incr i } {
	
	set startT($i) [expr [$RVstart value]]
	puts "startT($i) $startT($i) sec"

	set endT($i) [expr [$RVend value]]
	puts "endT($i) $endT($i) sec"

	$ns at $startT($i) "$ftp($i) start"
	$ns at $endT($i) "$ftp($i) stop"
}

proc finish {} {
    global ns nd
    
    close $nd
    $ns flush-trace

    exit 0
}

$ns at 7.0 "finish"

$ns run
```
### 實驗截圖

![image](https://hackmd.io/_uploads/S1fb11uJyg.png)
**<p class="text-center">3條TCP且start time設為random之情形</p>**

![image](https://hackmd.io/_uploads/Hy4vyJd11x.png)
**<p class="text-center">3條TCP且start time、end time皆設為random之情形</p>**

### 簡要說明
- **新增**：一變數命名為RVend，使用Uniform亂數表，並將其生成值範圍設定為介於五至六之間
- **修改**：endT結束時間之值，將其值設為RVend所生成之數值
- **觀察**：可以看到，第一個TCP開始的時間不變，且同為第一個開始的，其後面之傳輸時間較前面的傳輸時間長，因此傳輸的封包量是增加的；而第二個TCP開始的時間有變化，且後者的傳輸順序為最後一個，因此導致傳輸的封包量明顯下降；而第三個TCP開始時間後者雖較晚，不過傳輸順序為第二個，因此傳輸的封包量較前者明顯增多
- **結論**：由此可知開始傳輸的順序在TCP中扮演了重要的角色，較晚開始發送的封包傳輸量較較早開始的封包傳輸量明顯減少
## 第四題 將TCP flow改為6條
### 程式碼片段
```tcl=
set nflow	6
```
### 實驗截圖

![image](https://hackmd.io/_uploads/S1fb11uJyg.png)
**<p class="text-center">3條TCP且start time設為random之情形</p>**

![image](https://hackmd.io/_uploads/HJuUxkuk1e.png)
**<p class="text-center">6條TCP且start time設為random之情形</p>**

### 簡要說明
- **修改**：將TCP flow從3條改為6條
- **觀察**：後者可以看出，到第三個開始傳輸的封包傳輸量明顯減少，第六個封包傳輸量為0
- **結論**：與第三題的結論相同，開始傳輸的順序在TCP中扮演了重要的角色，較晚開始發送的封包傳輸量較較早開始的封包傳輸量明顯減少甚至為0

