【上課筆記】電腦網路概論 - Ch3
Ch3
- Network Layer vs Transport Layer :
Network Layer Transport Layer Hosts之間的邏輯溝通 Processes之間的邏輯溝通
- Multiplexing(多工) at sender :
- 定義 : 處理來自多個Socket的Data,並添加Transport Header
- Demultiplexing(解多工) at receiver :
- 定義 : 使用Header資訊,將收到的Segments以傳遞給正確的Socket
- 原理 : 在收到Datagram之後,Host在Transport Layer利用IP Addresses & Port Numbers,將該Segment指引到正確的Socket
- UDP : 不論Source Address & Port Number為何,若Dest Address & Port Number相同,則都傳到同個Socket中
- TCP : 若Dest Address & Port Number相同,但Source Address & Port Number不同,便會各自傳到不同Socket中
- UDP(User Datagram Protocol) :
- 特性 :
- 由於提供Best Effort Service,所以Segment可能會遺失 or 不保證會照順序
- Unreliable : 並非一定不可靠,而是不保證可靠
- Connectionless :
- Sender與Receiver之間無Handshaking
- 每個Segment彼此互相獨立
- 優點 :
- 不須建立Connection(建立會增加RTT)
- 簡單
- Header Size小
- 無Congestion Control
- 用途 : 串流、DNS、SNMP、HTTP/3
- 若想要在UDP實施Reliable Transfer(EX: HTTP/3),則需要在Application Layer增加Needed Reliability與Congestion Control
- Segment Header :
- 
- length : Segment的大小(包含Header)
- ==Checksum== :
- 目標 : 檢查傳輸Segment中的錯誤(EX: 翻轉bit)
- Sender : 將Segment內容視作16 bits整數的序列,並用加法得出Checksum
- Receiver :
- 自行計算此Segment的Checksum
- 與Sender於Segment中所紀錄之Checksum做比較
- 算法 :
1. 兩整數相加- 有Carry out的話,就做端迴進位
- 再取1’s補數
- 特性 :
- rdt(Reliable data transfer protocol/可靠傳輸協議) :
- rdt1.0 :
- 假設使用Reliable Channel
- 用FSM(Finite State Machine/有限狀態機)去指出Sender與Receiver
- rdt2.0 :
- 考量到資料錯誤
- Acknowledgements (ACKs) : Receiver明確告知Sender已收到Packet
- Negative Acknowledgements(NAKs) : Receiver明確告知Sender未收到Packet
- rdt2.1 : 新增Sequence number
- rdt2.2 :
- 移除NAK
- 在ACK中加入Sequence number
- rdt3.0 :
- 考量到資料錯誤 + Packet遺失
- 在Sender新增Timer
- rdt1.0 :
- ==Stop-and-Wait== :
- rdt3.0所採用
- 整體效率低落
- 傳輸一個Packet之利用率 : $$U_{sender} = \frac{L/R}{RTT + L/R}$$
- ==Pipelining== :
- Sender可以同時傳送多個Packet
- 雙方必須增加Buffer與Sequence Number
- 傳輸$n$個Packet之利用率 : $$U_{sender} = \frac{n * L/R}{RTT + L/R}$$
利用率增加n倍
- ==Go-Back-N==
- Sender每收到一個ack,Sliding Window就往前一格
- 若Sender的Sliding Window Size為$x$,則代表一次發送$x$個封包
- 假設Receiver等待接收pkt(n),但下個收到的卻是pkt(n+1),便會將pck(n+1)之後(含)的封包全數丟棄,並回傳最後一次收到正確序號的 ACK給Sender
- 若Sender端pkt(n)的Timeout,卻仍沒收到ack(n)的話,就將Sliding Window中的封包全數再次傳送出去
- ==Selective Repeat== :
- 只重送Receiver未正確收到的封包,可能是遺失或毀損
- 會暫存out-of-order的Packet
- Sliding Window Size必須 $\leq$ 有限序號大小的一半,以避免錯亂
- Sender :
- 若一封包的ACK逾時未收到,則重送該封包
- 若收到的ACK序號是 Base,則Slide Windows
- Receiver : 收到任意封包
- 回傳收到的序號之ACK 給Sender
- 若收到的序號不是 base,則將封包暫存
- 若收到的序號是 base,則Slide Windows
- TCP(Transmission Control Protocol) :
- 特性 :
- 點對點
- Reliable、照順序
- Full Duple(全雙工) : 允許二台裝置間同時進行雙向資料傳輸
- cumulative ACKs
- pipelining
- Connection-oriented : Handshaking
- flow controll
- Segment Header :

- Sequence Number : 目前此封包的順序編號
- Acknowledge Number : 期望Sender下次發送封包的序號
- length : Segment的大小(包含Header)
- Receive Window:控制封包流量,告訴對方目前本身還有多少Receive Buffer可以接收封包
- Timeout :
- Timeout長短問題 :
- 太短 : 過早超時,不必要的重傳
- 太長:對Segment Loss的反應太慢
- SampleRTT : 前一次的實際RTT
- EstimatedRTT : 估計的RTT
- DevRTT : 上述兩者之標準差
- TimeoutInterval : 最後得出的Timeout值
- $\alpha$ : 0.125; $\beta$ : 0.25
- $$EstimatedRTT = (1- \alpha)EstimatedRTT + \alphaSampleRTT\ \DevRTT = (1-\beta)DevRTT + \beta|SampleRTT-EstimatedRTT|\ \TimeoutInterval = EstimatedRTT + 4*DevRTT$$
- Timeout長短問題 :
- Sender :
- 從Application收到資料 :
- 建立帶有Sequence Number的Segment
- 開啟Timer
- Timeout :
- 重送導致Timeout的Segment
- 重啟Timer
- 收到ACK :
- 如果ACK確認先前unACKed的Segment,則更新已知ACKed的內容
- 如果仍有unACKed的Segment,則啟動Timer
- 收到Duplicated Ack(重複三次 ACK):Sender立刻重送Receiver所預期的封包 ,這將會在timeout前就送出
- 從Application收到資料 :
- Receiver :
- 預期Packet抵達事件:回傳下一次期望收到的封包序號ACK
- 非預期Packet抵達事件:暫存封包,送出期望收到的封包之序號ACK。
- Flow Control :
- 定義 : Receiver控制Sender,因此Sender不會通過發送太多、發送得太快而使Receiver的Buffer溢出

- Socket Options可以設定RcvBuffer大小(默認4096 Bytes)
- 許多OS可以自動調整RcvBuffer
- Sender將unACKed的Data數量限制為已接收的rwnd
- 保證Receiver Buffer不會溢出
- 特性 :
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Robin's Tech Blog!


