---
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

### 埠號
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訊息長度 都會加進來一起計算

> TCP 的校驗和也是如此
> 
乙太網路層(上圖) 標尾 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就可以把順序調整回來

> 實際上起始序號是隨機產生的 並不一定從0開始
> 目的是提高安全性(若序號都從0開始 駭客就可以知道想竊聽封包的序號 進而對封包動手腳)
> 序號的大小可以到非常大 讓駭客不容易猜到正在傳輸封包的序號
> 最初TCP序號以"封包數"累積,目前則以"位元組數"累積
考題(?的地方挖空)

### 滑動視窗(Sliding Window)

目的:flow control(流量控制) 允許傳送端最多可以送個封包(只要有收到Ack視窗就會滑動(空間變大)當空間足夠就可以再送下一個封包)
1. 送太快 路由器緩衝區會過載 並丟棄封包
2. 接收端緩衝區若滿了 也會丟棄封包
最簡單的方法
stop and wait
送出封包 等待收到Ack 再送下一個
缺點:太保守 閒置時間長 無法有效利用網路的資源

上圖 中間的(第二個)改良 是緩衝區的運用
delayed ack 計算

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