TCP-IP網路模型
對於同⼀臺裝置上的程序間通訊,有很多種⽅式,⽐如有管道、訊息佇列、共享記憶體、訊號
等⽅式,⽽對於不同裝置上的程序間通訊,就需要⽹絡通訊,⽽裝置是多樣性的,所以要相容多種多樣的裝置,就協商出了⼀套通⽤的⽹絡協議
。
這個⽹絡協議是分層的,每⼀層都有各⾃的作⽤和職責,接下來就分別對每⼀層進⾏介紹。
應用層
最上層的,也是我們能直接接觸到的就是應⽤層(Application Layer)
,我們電腦或⼿機使⽤的應⽤軟體都是在應⽤層實現。那麼,當兩個不同裝置的應⽤需要通訊的時候,應⽤就把應⽤資料傳給下⼀層,也就是傳輸層。
所以,應⽤層只需要專注於為⽤戶提供應⽤功能,不⽤去關⼼資料是如何傳輸的,就類似於,我們寄快遞的時候,只需要把包裹交給快遞員,由他負責運輸快遞,我們不需要關⼼快速是如何被運輸的。
⽽且應⽤層是⼯作在作業系統中的⽤戶態,傳輸層及以下則⼯作在核心態。
傳輸層
應⽤層的資料包會傳給傳輸層,傳輸層(Transport Layer)
是為應⽤層提供⽹絡⽀持的。
在傳輸層會有兩個傳輸協議,分別是 TCP 和 UDP。
應⽤需要傳輸的資料可能會⾮常⼤,如果直接傳輸就不好控制,因此當傳輸層的資料包⼤⼩超過 MSS(TCP 最⼤報⽂段⻓度)
,就要將資料包分塊,這樣即使中途有⼀個分塊丟失或損壞了,只需要重新發送這⼀個分塊,⽽不⽤重新發送整個資料包。在 TCP 協議中,我們把每個分塊稱為⼀個 TCP 段(TCP Segment)。
當裝置作為接收⽅時,傳輸層則要負責把資料包傳給應⽤,但是⼀臺裝置上可能會有很多應⽤在接收或者傳輸資料,因此需要⽤⼀個編號將應⽤區分開來,這個編號就是端⼝。
⽐如 80 端⼝通常是 Web 伺服器⽤的,22 端⼝通常是遠端登入伺服器⽤的。⽽對於瀏覽器(客戶端)中的每個標籤欄都是⼀個獨⽴的程序,作業系統會為這些程序分配臨時的端⼝號。
由於傳輸層的報⽂中會攜帶端⼝號,因此接收⽅可以識別出該報⽂是傳送給哪個應⽤。
TCP
TCP 的全稱叫傳輸層控制協議(Transmission Control Protocol)
,⼤部分應⽤使⽤的正是 TCP 傳輸層協議,⽐如 HTTP 應⽤層協議。TCP 相⽐ UDP 多了很多特性,⽐如流量控制、超時重傳、擁塞控制等,這些都是為了保證資料包能可靠地傳輸給對⽅。
UDP
UDP 就相對很簡單,簡單到只負責傳送資料包,不保證資料包是否能抵達對⽅,但它實時性相對更好,傳輸效率也⾼。當然,UDP 也可以實現可靠傳輸,把 TCP 的特性在應⽤層上實現就可以,不過要實現⼀個商⽤的可靠 UDP傳輸協議,也不是⼀件簡單的事情。
網路層
傳輸層可能⼤家剛接觸的時候,會認為它負責將資料從⼀個裝置傳輸到另⼀個裝置,事實上它並不負責。
實際場景中的⽹絡環節是錯綜複雜的,中間有各種各樣的線路和分叉路⼝,如果⼀個裝置的資料要傳輸給另⼀個裝置,就需要在各種各樣的路徑和節點進⾏選擇,⽽傳輸層的設計理念是簡單、⾼效、專注,如果傳輸層還負責這⼀塊功能就有點違背設計原則了。
也就是說,我們不希望傳輸層協議處理太多的事情,只需要服務好應⽤即可,讓其作為應⽤間資料傳輸的媒介,幫助實現應⽤到應⽤的通訊,⽽實際的傳輸功能就交給下⼀層,也就是
⽹絡層(Internet Layer)
。
IP協議
⽹絡層最常使⽤的是 IP 協議(Internet Protocol)
,IP 協議會將傳輸層的報⽂作為資料部分,再加上 IP 包頭組裝成 IP 報⽂,如果 IP 報⽂⼤⼩超過 MTU(以太⽹中⼀般為 1500 位元組)
就會再次進⾏分⽚,得到⼀個即將傳送到⽹絡的 IP 報⽂。