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彼此互相獨立
    • 優點 :
      1. 不須建立Connection(建立會增加RTT)
      2. 簡單
      3. Header Size小
      4. 無Congestion Control
    • 用途 : 串流、DNS、SNMP、HTTP/3
    • 若想要在UDP實施Reliable Transfer(EX: HTTP/3),則需要在Application Layer增加Needed Reliability與Congestion Control
    • Segment Header :
      • ![](https://i.imgur.com/4hcSqdK.png =30%x)
      • length : Segment的大小(包含Header)
      • ==Checksum== :
        • 目標 : 檢查傳輸Segment中的錯誤(EX: 翻轉bit)
        • Sender : 將Segment內容視作16 bits整數的序列,並用加法得出Checksum
        • Receiver :
          1. 自行計算此Segment的Checksum
          2. 與Sender於Segment中所紀錄之Checksum做比較
        • 算法 :
          1. 兩整數相加
          1. 有Carry out的話,就做端迴進位
          2. 再取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
  • ==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 :
        1. 若一封包的ACK逾時未收到,則重送該封包
        2. 若收到的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$$
    • Sender :
      • 從Application收到資料 :
        1. 建立帶有Sequence Number的Segment
        2. 開啟Timer
      • Timeout :
        1. 重送導致Timeout的Segment
        2. 重啟Timer
      • 收到ACK :
        • 如果ACK確認先前unACKed的Segment,則更新已知ACKed的內容
        • 如果仍有unACKed的Segment,則啟動Timer
      • 收到Duplicated Ack(重複三次 ACK):Sender立刻重送Receiver所預期的封包 ,這將會在timeout前就送出
    • 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不會溢出