--- 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 計算  > 實際上網路的狀態(壅塞程度)不斷變化 所以視窗的大小並不會固定 (由接收端緩衝區大小及網路狀態決定) 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up