TCP/IP 分層結構
- 應用層:各個應用程式可以定義(使用)各種這樣的協議
- 傳輸層:確保發出的資料能夠達到目標主機,完成資料傳輸
- 網路層:填寫資料包地址,選擇資料傳輸路徑
- 資料鏈路層:融合不同連線方式的鏈路,遮蔽網路差異
- 物理層:具體連線方式,有線,無線,光纖...
TCP/IP 工作方式
TCP/IP層次結構的特點
- 上層依賴鄰接下層的能力,下層只為直接鄰接上層服務
- 上層不知道下層的工作機制,下層不管上層傳輸的資料內容
- 不做跨層服務,層次結構中的角色缺一不可
深入理解網路層(IP層)
- IP 定址:IP 地址屬於網路層地址,用於標識網路上的主機
- 路由控制:控制資料如何到達主機(如:需要經過哪些路由器轉發)
- 無連線:資料包根據 IP 地址在網路上傳遞(無需與目標主機建立連線)
Mac 地址:資料鏈路層所使用的硬體地址
Mac 地址與網路無關,出廠時寫入到網路裝置中
當主機從網路上每收到一個資料幀時,首先檢查資料中的 MAC 地址。如果是發往本機的資料幀則收下,之後進行其他的處理;否則就將此幀丟棄,不再進行其他的處理。
IP 地址和 MAC 地址
- IP 地址是動態的,不屬於某個具體的硬體 (MAC 地址隸屬於具體硬體)
- IP 地址是網路層使用的地址(用於跨網路投遞資料包)
- MAC 地址是資料鏈路層使用的地址(用於確定目標網路中接收資料的主機)
- 路由器中記錄了本網路中主機 IP 地址與 MAC 地址的對映關係(ARP協議完成)
IP 路由控制
- 為了將資料發給目標主機,所有主機都維護著一張路由表
- 路由表記錄了 IP 資料包下一步應該發給哪個路由器
IP 資料轉發
IP 包轉發用的是 ”盡力服務“ 策略
- ”盡力服務“ 指 ”會努力“, 但不保證結果
- 轉發時會通過附加資訊檢查資料合法性,但出現異常不會進行重發
- 以包為單位進行轉發,不保證到達(發出之後,石沉網海)
TCP/IP 網路層次結構是否能提供可靠資料傳輸?
傳輸控制協議 (Transmission Control Protocol)
TCP 在協議實現上提供可靠資料傳輸
- TCP 不存在 ”資料包“ 的概念,實現了流式傳輸 (資料如流水,無頭無尾)
- TCP 內部有服務狀態,能夠精確知道資料是否已經傳送成功,是否被接收...
- TCP 在行為上可進行阻塞控制(網路環境變差時,能夠調整資料傳送速度)
TCP 連線建立
問:三次互動結束後,建立連線,為什麼是三次?
答:防止舊的重複連線引起連線混亂問題
比如在網路環境比較複雜的情況,客戶端可能會連續傳送多次請求。如果只設計成兩次握手的情況,服務端只能一接收請求,然後返回請求資訊,也不知道客戶端是否請求成功。這些過期請求的話就會造成網路連線的混亂。
所以設計成三次握手的情況,客戶端在接收到服務端SEQ+1的返回訊息之後,就會知道這個連線是歷史連線,所以會傳送報文給服務端,告訴服務端。
所以TCP設計成三次握手的目的就是為了避免重複連線。
然後可以設計成四次握手?五次握手?不可以?答案是也是可以的,不過為了節省資源,三次握手就可以符合實際情況,所以就沒必要設計成四次握手、五次握手等等情況
TCP 的天生缺陷 (DDoS攻擊)
- 客戶端收到
SYN,ACK
之後,不再回復最後的ACK
訊息 - 這將導致服務端消耗資源,但並不會實際進行通訊
- 當多個傀儡客戶端同時對服務端進行 ”連線請求“,服務端資源將耗盡
TCP 連線斷開
問:四次互動結束後,連線斷開,為什麼是四次?
答:因為TCP是全雙工通訊的
第一次揮手:當主動方傳送斷開連線的請求(即FIN報文)給被動方時,僅僅代表主動方不會再傳送資料包文了,但主動方仍可以接收資料包文。
第二次揮手:被動方此時有可能還有相應的資料包文需要傳送,因此需要先傳送ACK報文,告知主動方“我知道你想斷開連線的請求了”。這樣主動方便不會因為沒有收到應答而繼續傳送斷開連線的請求(即FIN報文)
第三次揮手:被動方在處理完資料包文後,便傳送給主動方FIN報文;這樣可以保證資料通訊正常可靠地完成。傳送完FIN報文後,被動方進入LAST_ACK階段(超時等待)。
第四揮手:如果主動方及時傳送ACK報文進行連線中斷的確認,這時被動方就直接釋放連線,進入可用狀態。
UDP 的特點:完全繼承網路層工作方式
- 無需連線,直接指定 IP 地址和埠即可傳送資料
- 監聽固定埠,只要有資料,統統接收
- 不管網路情況,只要有資料統統可傳送
- 不關心資料是否到達
UDP 的使用場合
- 對資料不敏感,需要實時性的場合(如:直播,實時遊戲)
- 網路環境比較好的場合(如:物聯網家居)
- 需要深度定製協議的場合(如:”不丟包的“UDP協議)
TCP 與 UDP 的區別
- TCP: 瓶口到嘴上了嗎?瓶口到嘴上了嗎?瓶口到嘴上了嗎?好,給你喝水。
- UDP:給你給你都給你,我懶得管你喝不喝得到。