網絡層:提供主機之間的邏輯通信機制
傳輸層:提供應用進程之間的邏輯通信機制
Internet 傳輸層協議
可靠、按序的交付服務(TCP)
擁塞控制
流量控制
連接建立
不可靠的交付服務(UDP)
基於“盡力而爲(Best-effort)”的網絡層,沒有做(可靠性方面的)擴展
兩種服務均不保證
延遲
帶寬
多路複用/分用
多路分用原理
主機接收到IP數據報(datagram)
每個數據報攜帶源IP地址、目的IP地址
每個數據報攜帶一個傳輸層的段(Segment)
每個段攜帶源端口號和目的端口號
主機收到Segment之後,傳輸層協議提取IP地址和端口號信息,將Segment導
向相應的Socket(TCP做更多處理)
UDP
UDP提供的功能
複用/分用
簡單的錯誤校驗
“Best effort”服務,UDP段可能
丟失
非按序到達
無連接
UDP發送方和接收方之間不需要握手
每個UDP段的處理獨立於其他段
UDP爲什麼存在?
無需建立連接 ( 減少延遲)
實現簡單 : 無需維護連接狀態
頭部開銷少
沒有擁塞控制: 應用可更好地控制發送時間和速率
常用於流媒體應用(容忍丟失、速率敏感),還用於DNS、SNMP。
在UDP上實現可靠數據傳輸?
在應用層增加可靠性機制
應用特定的錯誤恢復機制
UDP 校驗和(checksum)
發送方
將段的內容視爲16-bit 整數
校驗和計算:計算所有整數的和,再與進位相加,再按位求反,得到校驗和
接收方
計算所收到段的校驗和
將其與校驗和字段進行對比
• 不相等 : 檢測出錯誤
• 相等 : 沒有檢測出錯誤 ( 但可能有錯誤 )
可靠數據傳輸原理
什麼是可靠?不錯、不丟、不亂。可靠數據傳輸(RDT)
下面將漸進地設計可靠數據傳輸層協議,從簡到繁不斷提出更完善的版本!
Rdt 1.0(可靠信道上的可靠數據傳輸)
Rdt 2.0(產生位錯誤的信道)
Rdt 2.1(應對ACK/NAK被破壞)
如果ACK/NAK壞掉,發送方就識別不了了,但也不能簡單地重傳,否則可能產生重複分組。如何解決重複分組問題 ?序列號(Sequence number),發送方給每個分組分配序列號0或1,交替發送0號和1號分組。
Rdt 2.2(相比Rdt 2.1去掉NAK)
給發送方發ACK的時候帶上分組序號0或1。
Rdt 3.0(信道既可能發生錯誤 ,也可能丟失分組)
“校驗和 + 序列號 + ACK + 重傳”夠用嗎?
發送方等待“合理”時間(需要定時器),如果沒收到ACK,重傳。如果分組或ACK只是延遲而不是丟了,重傳會產生重複,序列號機制能夠處理,接收方需在ACK中顯式告知所確認的分組。
Rdt 3.0能夠正確工作,但性能很差。以上各個版本的設計都是發一個等一個,可以使用流水線滑動窗口機制改進(滑動窗口協議Go-Back-N 、Selective Repeat )。
TCP
點對點(一對一, 一個發送方,一個接收方)
可靠的、按序的字節流
流水線機制(TCP擁塞控制和流量控制機制,設置窗口尺寸)
發送方/接收方緩存
全雙工(full-duplex)(同一連接中能夠傳輸雙向數據流)
面向連接
通信雙方在發送數據之前必須建立連接。
連接狀態只在連接的兩端中維護,在沿途節點中並不維護狀態。
TCP連接包括:兩臺主機上的緩存、連接狀態變量、socket等
流量控制機制(緩衝區大小限制)
TCP使用單一重傳定時器,觸發重傳的事件(超時、收到重複ACK)
擁塞控制(使網絡不那麼擁塞,具有公平性)
TCP連接的建立和關閉