TCP/IP網路模型簡析

語言: CN / TW / HK

我正在參與掘金創作者訓練營第5期, 點選瞭解活動詳情

目錄

TCP/IP協議是什麼

從字面上來看,很多人會認為 TCP/IP 是 TCP、IP 這兩種協議,實際上TCP/IP 協議族指的是在 IP 協議通訊過程中用到的協議的統稱。

為什麼要有TCP/IP網路模型?

對於同一臺裝置的程序間通訊,有很多種方式,比如管道、訊息佇列、共享記憶體、訊號等方式,而對於不同裝置的程序間通訊,就需要網路通訊。

一開始計算機廠商各自推出各自的網路體系結構和協議,只能用於自己的產品之間通訊,就導致不同廠商之間不相容,而為了讓不同廠商的計算機裝置都可以互通,在IETF(Internet Engineering Task Force)的建議下協商出了一系列標準化的網路協議TCP/IP。

TCP/IP網路模型分層

從頂向下可以分為應用層→傳輸層→網路層→網路介面層。

應用層

我們日常直接接觸到的就是應用層(Application Layer) ,電腦、手機使用的應用都是在應用層實現,但若是不同裝置的應用之間需要通訊的時候,就需要將資料傳給下一層,也就是傳輸層。

應用層專注於給使用者提供應用功能,如HTTP、FTP、Telnet、DNS、SMTP等。

應用層不需要關心資料是如何傳輸的。就像我們寄快遞時也不需要關心快遞是如何運輸到目的地的。

應用層是工作於作業系統中的使用者態,而傳輸層及以下是工作在核心態。

執行在使用者態下的程式不能直接訪問作業系統核心資料結構和程式。當我們在系統中執行一個程式時,大部分時間是執行在使用者態下的,在其需要作業系統幫助完成某些它沒有權力和能力完成的工作時就會切換到核心態(比如操作硬體)。

結論:如果不涉及與其他裝置通訊就不需要核心態,也就是不需要從應用層傳到傳輸層及之後的層。在HTTP協議中,連線就是利用核心建立的。

傳輸層

傳輸層(Transport Layer) 是為應用提供網路支援的。

傳輸層有兩個協議,TCPUDP

TCP

TCP全稱叫 傳輸控制協議(Transmission Control Protocol),大部分應用使用的是TCP傳輸層協議,因為應用的應用層使用的是HTTP協議,而HTTP協議是基於傳輸層的TCP協議。TCP相對比UDP多了很多特性,如流量控制、超時重傳、擁塞控制等。是為了確保資料包可以可靠的從一方傳輸給另一方。

應用需要傳輸的資料有可能很大,如果直接傳輸的話不好控制(比如很大的檔案如果只傳一個包萬一網絡卡就得重傳,沒法暫停續傳),因此當傳輸層的資料包大小超過 MSS(TCP 最大報文段長度) ,就要將資料包分塊,這樣即使中途有一個分塊丟失或損壞了,只需要重新發送這一個分塊,而不用重新發送整個資料包。在 TCP 協議中,我們把每個分塊稱為一個 TCP 段TCP Segment)。

UDP

UDP相對來說比較簡單粗暴,只負責傳送到對應應用資料包,不保證包是否能送到對方,但是它的實時性更好,傳輸效率也比TCP要高。而且UDP也可以實現可靠傳輸,只要把TCP的特性在應用層實現就可以,這樣整體的資料傳輸還是可靠的。

為什麼TCP要有連線

連線可以確保通訊雙方的收發能力,從而可以保證資料的可靠性,由於IP協議是無連線的,而HTTP之所以可以保證資料準確是在TCP有連線的基礎上保證的。而UDP是繼承IP協議的無連線,因此如果不在應用層上實現連線和資料可靠性則整個協議就無法保證資料可靠性。

上述所說的TCP建立連線不是說伺服器和客戶端真的有根網線連一塊,而是一種虛擬的,這就和三次握手和四次揮手相關了。

應用層和傳輸層之間的關係

在客戶端要和服務端通訊時,應用層的資料包會送到傳輸層。而在接收服務端資料時,傳輸層會將對應應用的資料包發到對應應用的埠。

假如你在電腦上分別在用QQ和微信聊天,當你的電腦接受到一個數據包的時候,該怎麼知道他到底是QQ的訊息還是微信的訊息呢?這就需要用傳輸層報文中的TCP/UDP頭中的埠號(Destination Port)來確定,傳輸層用埠號來標記不同的應用程式。

到達傳輸層的資料包

比如80埠通常是web伺服器用,22埠是遠端登入伺服器,而瀏覽器中每一個Tab頁則是獨立的程序,隨機分配的埠號。

網路層

網路層是負責將資料從一個裝置傳輸到另一個裝置,而傳輸層是負責將裝置上的資料傳輸到裝置上的應用。目標地址可以是多個網路通過路由器連線而成的某一個地址。因此這一層主要負責定址和路由選擇。

網路層最常使用的是IP協議(Internet Protocol),IP協議會將從傳輸層傳出的報文作為資料部分,再加上IP報頭組裝成IP報文。這一層的主要作用是給資料包加上源地址和目標地址,將資料包傳送到目標地址

既然網路層的目的是將資料包傳送到目標地址,那麼IP協議是如何做到的呢?

通過IP協議的兩大功能:定址路由

定址,匹配到相同的網路號(子網),然後去對應子網下找對應的主機。

路由,在實際場景中,兩臺裝置並不是由一根網線連線起來的,而是通過很多閘道器、路由器、交換機等許多網路裝置連線起來,是一個網狀的結構,從一個點到另一個點,就會有很多路徑,因此當資料包到達途徑節點時,就需要路由演算法來決定下一步走哪條路徑。

和TCP報文類似,IP報文在大於MSS時也會分片

在資料包到達網路層,會和IP頭(源地址、目標地址)組裝成IP報文,如果IP報文大小超過MTU(一般為1500位元組),就會再次分片,得到一個即將傳送到網路的IP報文。

上圖的意思就是第一次傳輸層接受到的應用層資料包內容超過一個MSS(TCP 最大報文段長度),因此在傳輸層分別新增TCP頭分為了兩個TCP段進行傳送,而到達網路層時又都需要新增IP頭。而如果此時整個資料包大小若超過MTU(一般為1500位元組)就又需要分為兩個帶IP的資料包到下一層。

IP地址是什麼?

IP 地址是一個網絡卡在網路世界的通訊地址,相當於我們現實世界的門牌號碼。

10.100.122.2 就是一個 IPv4 地址。這個地址被點分隔為四個部分,每個部分 8 個 bit(8位2進位制),所以 IP 地址總共是 32 位,也就是說IP地址最多有2的32次方個,42億多個,但沒想到還是不夠用了,因此出現了IPv6地址,如fe80::f816:3eff:fec7:7975/64,IPv6有128位,總數2^128次方,目前看來是夠用了。

IP分類

IPv4地址還被分為了5類,分別是A,B,C,D,E這五種。

對於常用的A、B、 C 類主要分兩部分,前面是網路號,後面是主機號。可以認為網路號是小區名,而主機號是具體的門牌名。比如A小區1棟1單元201和B小區1棟1單元201。

而不同的小區可以容納的住戶也是不同數量的,比如A類小區下根據主機號24位則可以有2^24次方也就是16777214戶,依次類推。

但是按照這樣分配則會造成不夠用或是浪費的情況,比如C類地址只有254,對於網咖可能都不夠用,而B類下有6萬多,非大型企業壓根也用不完,會導致浪費。

無型別域間選路(CIDR)

因此除了上述的IP分類,有了一個折中的方法叫無型別域間選路,簡稱 CIDR(Classless Inter-Domain Routing)。CIDR的做法是將32位的IP地址一分為二,前面是網路號,後面是主機號

  • 網路號,負責標識該 IP 地址是屬於哪個「子網」的;
  • 主機號,負責標識同一「子網」下的不同主機;

比如10.100.122.2/24,斜槓後的24代表的意思就是當前網路地址的32位中,前24位是網路號,後8位是主機號。

如何區分網路號和主機號?需要IP地址配合子網掩碼算出網路號主機號。其實上述中10.100.122.2 /24中的24就表示子網掩碼是255.255.255.0(3個255代表的實際上就是前24個二進位制位都是1,8個2進位制1剛好是255),代表相同的意思。

將子網掩碼和IP地址進行邏輯與(AND)運算可以得到網路號

將子網掩碼255.255.255.0取反後與IP地址進行按位與運算,則可以得到主機號也就是2。

伴隨CIDR存在的一個是廣播地址,10.100.122.255。如果傳送到這個地址,則所有10.100.122網路裡面的機器都可以收到。網路號可以想成是一個由一些主機組成的大群,廣播地址可以認為是直接往大群裡發訊息的地址

公有 IP 地址和私有 IP 地址

CIDR中還存在公有IP地址和私有IP地址。

公有IP地址可以認為是小區名,私有IP地址可以認為是門牌號,A小區可以有1棟1單元201,B小區也同樣可以有1棟1單元201。

常見的公有IP地址就是那些你在網際網路上直接訪問到的網站伺服器,都有一個公有IP地址以供訪問。

一般辦公室、家裡的IP地址都是私有的地址,這些地址允許組織內部的IT人員自己管理、分配。常見的私有地址是家裡Wi-Fi下的IP地址,一般是192.168.0.x,一般/24就夠了,對應的就是254個可以分配的IP地址。有時也有/16的CIDR,這兩種是最常見的。

可以看出192.168.0是網路號,後面是主機號,整個網路中第一個地址192.168.0.1,往往是你這個私有網路的出口地址,比如連線WIFI,WIFI路由器的地址就是192.168.0.1(通常我們管理路由器比如改密碼也是登入這個IP)。

MAC地址

在 IP 地址的上一行是 link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff,這個被稱為 MAC 地址,是一個網絡卡的實體地址,用十六進位制,6 個 byte 表示。MAC 地址是一個很容易讓人“誤解”的地址。

因為 MAC 地址號稱全域性唯一,不會有兩個網絡卡有相同的 MAC 地址,而且網絡卡自生產出來,就帶著這個地址。很多人看到這裡就會想,既然這樣,整個網際網路的通訊,全部用 MAC 地址好了,只要知道了對方的 MAC 地址,就可以把資訊傳過去。這樣當然是不行的。 一個網路包要從一個地方傳到另一個地方,除了要有確定的地址,還需要有定位功能。 而有門牌號碼屬性的 IP 地址,才是有遠端定位功能的。

例如,你是一個警察,要抓法外狂徒張三,現在只知道他的身份證號,張三同名的人很多,總不能滿中國翻人身份證看是不是這個法外狂徒,所以你得根據情報之類的線索先確定他在哪個區域,然後再根據監控啥的抓捕。MAC 地址就像是身份證,是一個唯一的標識。它的唯一性設計是為了組網的時候,不同的網絡卡放在一個網路裡面的時候,可以不用擔心衝突。

從硬體角度,保證不同的網絡卡有不同的標識。MAC 地址是有一定定位功能的,只不過範圍非常有限。你可以根據 IP 地址,找到杭州市網商路 599 號 B 樓 6 層,但是依然找不到我,你就可以靠吼了,大聲喊身份證 XXXX 的是哪位?我聽到了,我就會站起來說,是我啊。但是如果你在上海,到處喊身份證 XXXX 的是哪位,我不在現場,當然不會回答,因為我在杭州不在上海。

所以,MAC 地址的通訊範圍比較小,侷限在一個子網裡面。例如,從 192.168.0.2/24 訪問 192.168.0.3/24 是可以用 MAC 地址的。一旦跨子網,即從 192.168.0.2/24 到 192.168.1.2/24,MAC 地址就不行了,需要 IP 地址起作用了。

資料鏈路層

通訊傳輸實際上是通過物理的傳輸介質實現的,資料鏈路層的作用是在這些通過傳輸介質互連的裝置之間進行資料處理。

將資料中的0、1轉換位電壓和脈衝光傳輸通過物理的傳輸介質在相互直連的裝置之間使用MAC地址進行傳輸。MAC地址,也可以稱為實體地址或硬體地址,目的是為了識別連線到同一個傳輸介質上的裝置。

「其他文章」