---
# System prepended metadata

title: 網路課 week6 筆記
tags: [網路課tcp/ip]

---

---
title: 網路課 week6 筆記
tags: 網路課tcp/ip
---

# 網路課 week6 筆記

## UDP 協定
1. 非連線導向式(傳資料之前不需建立連線)
2. 講求快速 但是封包發生任何事UDP一概不管
3. UDP標頭 8 Byte
> IP標頭 20 Byte (no options)
 TCP標頭 20 Byte (no options)
 IPv6標頭 40 Byte

![](https://i.imgur.com/oJwY1If.png)

### 埠號
16 bit -> 最大65536 (一台主機跑的應用程式最多65536個)

### 訊息長度
訊息長度 = UDP標頭 + Payload
<pre>
      ＜--   這塊   --＞
 _____________________
| IP | UDP | Payload  |
 ---------------------
</pre>

### 檢驗和
可以做 也可以不做
封包傳輸過程發生問題 有做的話 就會去校驗
主要保護 UDP標頭 + Payload

> IP CheckSum 只保護Header的部分

### Checksum值運算
標頭、資料、虛擬標頭(Pseudo Header)
虛擬標頭 包括 網路層的來源IP 目的IP 等相關欄位

如果校驗和只保護 (第4層)來源Port、目的Port  範圍太大 不夠精準
所以 第三層 來源IP 目的IP 通訊協定 UDP訊息長度 都會加進來一起計算
![](https://i.imgur.com/fDFOhOH.png)

> TCP 的校驗和也是如此

> ![](https://i.imgur.com/69BPr4N.jpg)

乙太網路層(上圖) 標尾 FCS(Frame check sequence):Checksum
IP層 Header Checksum
UDP 也有 Checksum
> Q:為甚麼要做這麼多次Checksum?
因為網路是分層分工的
ex 1:沒辦法確保底層永遠都走乙太網路 有可能走WiFi或其他網路 說不定資料鏈結層沒有實作Checksum
ex 2:傳輸層不一定走的是有實作Checksum的TCP、UDP，可能選擇沒有做Checksum的其他協定

---

`netstat -a` linux下查看系統開了哪些服務 哪些是已連線或被監聽的
顯示的是被解析過的結果 
0.0.0.0:DNS
0.0.0.0:http
若加入參數-n (不解析)`netstat -an` 或是 `netstat -na` `netstat -n -a` `netstat -a -n` 
0.0.0.0:53
0.0.0.0:80
方便做資料的統計

`sed -i "/^$/d" test.txt` 將test.txt的空白行刪除
<pre>
sed: stream editor 一種命令式的文字編輯器
-i: 操作完後直接寫到原本的檔案 不用的話只會顯示結果不會更動檔案
^: 以...為開頭
$: 以...為結尾
^$: 空白行
/d: delete
</pre>

---

## TCP 協定

### TCP協定序列號碼(SN:Sequence Number)
幫資料編號 當資料遺失時就可以透過編號來檢查
封包遺失定義:data不見(封包沒有送到目的端)或ack不見(封包有送到目的端但傳回的ack遺失)
當傳送端送出封包時Timer開始計時 若超過設定的時間沒有收到ack就會判定為封包遺失 並重送
RTO(Retransmission TimeOut) [課外補充](https://www.796t.com/content/1548844041.html)

TCP(連線導向)建立在IP(非連線導向)上 可能會造成失序
透過SN就可以把順序調整回來

![](https://i.imgur.com/TyY7JzJ.jpg)
> 實際上起始序號是隨機產生的 並不一定從0開始
> 目的是提高安全性(若序號都從0開始 駭客就可以知道想竊聽封包的序號 進而對封包動手腳)
> 序號的大小可以到非常大 讓駭客不容易猜到正在傳輸封包的序號
> 最初TCP序號以"封包數"累積，目前則以"位元組數"累積

考題(?的地方挖空)
![雙向資料傳輸](https://i.imgur.com/2uwIFH7.jpg)


### 滑動視窗(Sliding Window)

![](https://i.imgur.com/9h5uWuH.jpg)


目的:flow control(流量控制) 允許傳送端最多可以送個封包(只要有收到Ack視窗就會滑動(空間變大)當空間足夠就可以再送下一個封包)
1. 送太快 路由器緩衝區會過載 並丟棄封包
2. 接收端緩衝區若滿了 也會丟棄封包

最簡單的方法
stop and wait
送出封包 等待收到Ack 再送下一個 
缺點:太保守 閒置時間長 無法有效利用網路的資源
![](https://i.imgur.com/OpP6HCZ.jpg)
上圖 中間的(第二個)改良 是緩衝區的運用

delayed ack 計算
![](https://i.imgur.com/vkHtWNA.png)

> 實際上網路的狀態(壅塞程度)不斷變化 所以視窗的大小並不會固定 (由接收端緩衝區大小及網路狀態決定)

![](https://i.imgur.com/useQXSX.png)
