爛大街的TCP/IP網絡模型,你真的懂了?

2022.10.08

爛大街的TCP/IP網絡模型,你真的懂了?


DNS地址是啥呢?Domain Name System。因為我們一般定位是通過ip地址+mac地址+端口號來定位一個通信目標的,但是如果在瀏覽器上輸入一個www.baidu.com,咋整?這個時候是先把www.baidu.com發給DNS服務器,然後DNS服務器告訴你www.baidu.com對應的ip地址的。​

一、面試真題

你能聊聊TCP/IP 的四層網絡模型和OSI 七層網絡模型嗎?

二、面試官心理分析

為啥要問這個?

坦白講,一些大的公司,計算機基礎必面,尤其是針對薪資30k以內的工程師,因為薪資30k以內,你還是要幹活兒的吧,還沒上升到就設計架構就可以的程度吧,你還沒到那個高度吧。

所以只要你幹活兒,你就不可避免要跟機器、網絡、cpu、磁盤、內存,成天打交道。而線上系統,計算基礎的一些東西,網絡、cpu、磁盤、內存,都是關聯很大的,比如說你線上系統會不會因為網絡故障導致一些問題?cpu負載達到100%了咋辦?磁盤讀寫很慢快滿了咋辦?內存使用率過高咋辦?

你起碼得有一套自己的計算機功底去支撐你玩兒線上系統吧。所以很多人呢,都說計算機基礎沒啥用,那這個話呢,也對,也不對。對就在於,你如果畢業出來幹簡單的crud,這些東西你確實不需要;不對就在於,你如果當個高工,帶幾個小弟干高並發有壓力的線上系統,機器負載很高,很容易出問題,結果你連機器都不敢摸,或者也不知道怎麼摸,那不是尷尬了麼。

所以說,計算機基礎,網絡、磁盤、cpu、內存,還是得會一點兒基礎的

作為一個大公司的面試官,一定會考察你這些東西

三、正餐開始——面試題剖析

首先要說一下,四層模型和七層模型,我們往往是可以一塊兒來聊的。

(1)首先我問要明白,為啥要有協議

設想一下,各個電腦廠商,比如IBM、蘋果啥的,都弄自己的協議,結果就蘋果電腦和蘋果電腦自己可以通信,和IBM電腦就不可以通信,這不是尷尬麼。所以搞一個國際通行的協議,大家都按照這個來,所有電腦都可以通信,不是很好麼。

此時就必須搞一個標準的網絡模型出來,大家都按照這個來走,大家都要遵守統一的規範。這就是所謂OSI七層模型,他們分別是:應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層。那麼在這個基礎上,又簡化出了TCP/IP四層模型,數據鏈路層、網絡層、傳輸層、應用層。

那麼每一層代表的是啥,我一一給大家講解

(2)從底向上的網絡分層

1)物理層

物理層,物理層幹啥的,就是電腦之間要聯網,一般咋弄?類似於說,你有台電腦,現在要聯網,咋聯?以前N年前,大家記不記得都是在電腦上插根線是吧,然後才能上網,結果現在就是聯個wifi就行了,還有中國美國之前聯網靠的是海底的光纜。所以物理層就指的這個,就是怎麼把各個電腦給聯結起來,形成一個網絡,這就是物理層的含義,物理層負責傳輸0和1的電路信號。學過一些計算機的同學,計算機的最最底層,就是0/1,電信號。如下圖:

2)數據鏈路層

數據鏈路層,物理層給各個電腦連接起來了,還傳輸最底層的0和1電路信號,關鍵不行啊,你得定義清楚哪些0和1分為一組,這些信號啥意思?這才能進行通信。所以數據鏈路層就乾這事兒,定義一下電路信號咋分組。

00000011(從電腦1出發,要到電腦2去)

00101(從電腦1出發,要到電腦3去)

0101(從電腦2觸發,要到電腦4去)

01(從電腦3出發,要到電腦5去)

很多年前,每個公司都定義自己的電路信號分組方式,但是後來出來了以太網協議,以太網。一組電信號是一個數據包,叫一個幀(frame),每個幀分成兩個部分,標頭(head)和數據(data),標頭包含一些說明性的東西,比如說發送者、接收者和數據類型之類的。

每台電腦要往另外一台電腦發送數據,一堆0/1電路信號,封裝成數據包,包含頭和數據,頭里包含了從哪兒來到哪兒去,必須從一台電腦的一個網卡,發送到另外一個電腦的一個網卡,所以以太網發送的數據包必須得指定,目標電腦的網卡的mac地址。

以太網規定了,每個網卡必須得包含一個mac地址,mac地址就是這個網卡的唯一標識,

以太網協議規定了,接入網絡裡的所有設備,都得有個網卡,以太網協議裡的那個數據包,在數據鏈路層傳輸的數據包,必須從一個電腦的網卡傳輸到另外一個電腦的網卡,而這個網卡地址就叫做所謂的mac地址。每塊網卡出廠的時候,就有一個唯一的mac地址,48位的二進制,但是一般用12個16進制數字表示,前6個16進制是廠商編號,後6個16進制是網卡流水號。

windows上,ipconfig /all,看看物理地址,就是mac地址,7C-67-A2-20-AB-5C

所以在以太網里傳輸數據包的時候,必須指定接收者的mac地址才能傳輸數據。

但是以太網的數據包怎麼從一個mac地址發送到另一個mac地址?這個不是精準推送的,以太網裡面,如果一個電腦發個數據包出去,會廣播給局域網內的所有電腦設備的網卡,然後每台電腦都從數據包裡獲取接收者的mac地址,跟自己的mac地址對比一下,如果一樣,就說明這是發給自己的數據包。

但是上面這種廣播的方式,僅僅針對一個子網(局域網)內的電腦,會廣播,否則一個電腦不能廣播數據包給全世界所有的其他電腦吧,是僅僅廣播給一個子網裡面的電腦的。

如下圖:

3)網絡層

上面說到,子網內的電腦,通過以太網發個數據包,對局域網內的電腦,是廣播出去的。那麼怎麼知道哪些電腦在一個子網內呢?這就得靠網絡層了,這裡就有一套IP地址,IP地址就可以讓我們區分哪些電腦是一個子網的。

網絡層裡有IP協議,IP協議定義的地址就叫做IP地址。IP地址有IPv4和IPv6兩個版本,目前廣泛使用的是IPv4,是32個二進制數字組成的,但是一般用4個十進制數字表示,範圍從0.0.0.0到255.255.255.255之間。

每台計算機,都會分配一個ip地址,ip地址的前24位(就是前面3個十進制數字),代表了網絡,後8位(就是最後1個十進制數字),代表了主機。

如果幾台電腦是一個子網的,那麼前面的3個十進制數字一定是一樣的。舉個例子,大家平時做實驗,玩兒虛擬機吧,自己win上開幾個linux虛擬機,你會發現,win上的ip地址可能是192.168.0.103,然後幾個虛擬機的ip地址是192.168.0.182,192.168.0.125,192.168.0.106,類似這樣的。

這個win機器和幾個虛擬機,前面3個十進制數字都是192.168.0,就代表大家是一個子網內的,最後那個數字是這個子網的不同主機的編號。

但是實際上上面就是舉個例子,其實單單從ip地址是看不出來哪些機器是一個子網的,因為從10進制是判斷不出來的。需要通過ip地址的二進制來判斷,結合一個概念來判斷,叫做子網掩碼。

比如說ip地址是192.168.56.1,子網掩碼是255.255.255.0。知道了子網掩碼之後,如果要判斷兩個ip地址是不是一個子網的,就分別把兩個ip地址和自己的子網掩碼進行二進制的與運算,與運算之後,比較一下代表網絡的那部分。

192.168.56.1和192.168.32.7,判斷是不是一個子網的,拿子網掩碼255.255.255.0,跟兩個ip地址的二進製做與運算

11000000.10101000.00111000.00000001

11111111.11111111.11111111.00000000

子網掩碼的二進制是:11111111.11111111.11111111.00000000,然後就跟ip地址的二進製做與好了,通過二進制來比較網絡部分的地址是不是一模一樣的。

有了網絡層的ip地址之後,兩台在子網內的電腦終於可以通過廣播+mac地址判斷來傳輸數據包進行通信了。

但是如果發現要接受數據包的計算機不在子網內,那麼就不能通過廣播來發送數據包,需要通過路由來發送數據包。

看到路由,就想到了路由器了,對了,路由器大家都熟悉吧,自己平時也會去買對吧,比如小米的路由器啥的,家裡上網一般都會弄個路由器對吧,ok。路由器負責將多個子網進行連接,因為比如你在自己家裡,其實你就只是你自己的一個子網,你要是訪問網站啥的,是跟那個網站機器所在的子網進行通信。

每個電腦都可以搞多個網卡的,不是只有一個網卡,一般筆記本電腦都有以太網網卡和wifi網卡,發送數據包的時候要決定走哪個網卡。路由器,其實就是配置了多個網卡的一個專用設備,可以通過不同的網卡接入不同的網絡。

網關其實是就是路由器的一種,運作在網絡層,這個概念不多解釋了,大家可以就把路由器上的ip地址認為是網關,路由器上每個網卡都有mac地址和對應的ip地址。路由器雖然有mac地址,但是不能通過mac地址尋址的,必須通過ip地址尋址,所以路由器其實是工作在網絡層的設備。

網絡交換機,也是一種設備,是工作在數據鏈路層的,路由器是工作在網路層的。

網絡交換機是通過mac地址來尋址和傳輸數據包的;但是路由器是通過ip地址尋址和傳輸數據包的。網絡交換機主要用在局域網的通信,一般你架設一個局域網,裡面的電腦通信是通過數據鏈路層發送數據包,通過mac地址來廣播的,廣播的時候就是通過網絡交換機這個設備來把數據廣播到局域網內的其他機器上去的;路由器一般用來讓你連入英特網。

LAN,就是local area network,就是局域網;WAN,就是wide area network,就是廣域網。WLAN是wireless local area network,就是無線局域網,也就是wifi,在局域網內,直接通過wifi無線聯網。

家裡的路由器是包含了交換機和路由的兩個功能的,如果是連接到局域網內的設備就把線插LAN那兒;如果是連接到英特網,就把線插在WAN那兒。

這兒給大家舉個例子,就是兩個局域網之間,如果要是通過一個路由器進行通信的話,是怎麼弄的。

大概過程就是,路由器配置了兩塊網卡,每個網卡可以連到一個局域網內。

局域網1內的電腦,要發送數據包到局域網2內的電腦,在數據包裡寫上自己的ip地址和對方的ip地址。但是他們倆不在一個局域網內,於是局域網1內的電腦,先通過交換機將數據包發送給路由器,這個過程需要將路由器的一塊網卡的ip地址對應的mac地址寫到數據包的頭部,然後才能通過交換機廣播出去,路由器接收到之後比較自己一塊網卡的mac地址,就知道是來找自己的。

接著路由器接收到數據包之後,就會在局域網2內,將目標機器的ip地址對應的mac地址寫入頭部,接著再次通過交換機發送廣播通知,發送給局域網2內的電腦。

一個局域網內的每台機器都有自己的ARP cache,這個ARP就是用來在一個局域網內讓各個設備都知道每個設備的ip地址和mac地址的對應關係的,一般就是某個機器發送廣播通知自己的ip地址和mac地址的對應關係,然後每個機器給他一個回應。以此類推,大家都互相這樣廣播一把,ip地址和mac地址的對應關係,大家不就都知道了嗎?

所以大家在上面可以看到,一個子網內的機器之間通信,就是在數據包裡寫上對方的mac地址,然後交換機廣播出去ok了;但是如果是跨子網的通信,就是寫上對方的ip地址,然後先通過mac地址廣播到路由器,讓路由器再根據另外一個子網的ip地址轉換為mac地址,通過另外一個子網的交換機廣播過去。就這個意思。

如圖:

4)傳輸層

上面我們大概明白了通過網絡層的ip地址怎麼劃分出來一個一個的子網,然後在子網內部怎麼通過mac地址廣播通信;跨子網的時候,怎麼通過ip地址-> mac地址-> 交換機-> 路由器-> ip地址-> mac地址-> 交換機的方式來通過路由器進行通信。

但是這裡還有一個問題,就是一台機器上,是很多個程序用一個網卡進行網絡通信的,比如說瀏覽器、QQ、視頻直播,這些軟件都用了一個網卡往外面發送數據,然後從網卡接收數據,對吧。

所以還需要一個端口號的概念,就是你得發送數據包到某個機器的一個網卡的某個端口上去,然後那個機器上監聽那個端口的程序,就可以提取發送到這個端口的數據,知道是自己的數據。端口號是0~65536的範圍內,0~1023被系統佔用了,別的應用程序就用1024以上的端口就ok了。

電腦1,是在端口48362監聽的,通過網卡發送了一條數據-> 電腦2的ip地址的20386這個端口-> 電腦2的上面的某個QQ,監聽著20386的端口-> 電腦2的網卡接收到一條數據之後,發現人家找的是20386這個端口,就去找誰哪個哥兒們在監聽20386端口,QQ在監聽,我就把這個網卡過來的數據,傳遞給QQ,通過端口知道,哪條數據是給你的

所以其實大家會發現一點,網絡層,是基於ip協議,進行主機和主機間的尋址和通信的,然後傳輸層,其實是建立某個主機的某個端口,到另外一個主機的某個端口的連接和通信的。

這個通信,就是通過socket來實現的,通過socket就可以基於tcp/ip協議完成剛才上面說的一系列的比如基於ip地址和mac地址轉換和尋址啊,通過路由器通信啊之類的,而且會建立一個端口到另外一個端口的連接。

udp和tcp都是傳輸層的協議,作用就是在數據包裡加入端口號,可以通過端口號進行點對點的通信了。udp協議是不可靠的,發出去人家收到沒有就不知道了;tcp協議是可靠的,要求三次握手,而且要求人家接收到數據必須回复你。

傳輸層的tcp協議,僅僅只是規定了一套基於端口的點對點的通信協議,包括如何建立連接,如何發送和讀取消息,但是實際上如果你要基於tcp協議來開發,你一般是用socket,java socket網絡編程, 如下圖:

5)應用層

通過傳輸層的tcp協議可以傳輸數據,但是人家收到數據之後,怎麼來解釋?比如說收到個郵件你怎麼處理?收到個網頁你怎麼處理?類似這個意思,所以針對各種不同的應用,郵件、網頁之類的,都是定義不同的應用層協議的。這個應用層,我們就假設綜合了會話層、表示層和應用層了,3層合成1層。

電腦1走tcp協議發送了一段東西過來,發送到電腦2的20386端口;

  • GET http://localhost:8080/ http/1.1
  • key:valuel
  • key:value

電腦2走tcp協議讀取到了屬於自己這個20386端口的一段數據;

  • GET http://localhost:8080/ http/1.1
  • key:valuel
  • key:value

發送了一段響應;

  • 200
  • key;value
  • key:value

又通過底層的tcp發了出去,電腦1的30987端口,ip

電腦1,網卡,走以太網協議收到一個數據包

  • 200
  • key;value
  • key:value

比如最常見的,應用層的協議就是http協議,進行網絡通信。

然後我們看下自己的網絡設置,一般包含了ip地址、子網掩碼、網關地址、DNS地址。前面3個我們其實都知道啥意思了。ip地址和子網掩碼用來劃分子網的,判斷哪些ip地址在一個子網內。同時你的ip地址和mac地址關聯起來的,唯一定位了你的網卡。網關地址,你就認為是路由器上的那個網卡的ip地址吧,路由器的網卡也有mac地址,mac地址對應了一個ip地址。

DNS地址是啥呢?Domain Name System。因為我們一般定位是通過ip地址+mac地址+端口號來定位一個通信目標的,但是如果在瀏覽器上輸入一個www.baidu.com,咋整?這個時候是先把www.baidu.com發給DNS服務器,然後DNS服務器告訴你www.baidu.com對應的ip地址的。