目錄
一、計算機網絡發展
二、協議
1.認識協議
2.OSI七層模型
3.TCP/IP 五層(或四層)模型
4.協議本質
三、網絡傳輸流程
1.MAC地址
2.協議棧
3.IP地址
IP地址 vs MAC地址
1. 核心區別
2. 具體通信過程類比
3. 關鍵總結
為什么需要兩者?
4.協議棧圖解
Socket編程
1.端口號
2.TCP/UDP協議
3.網絡字節序
4.sockaddr 結構
一、計算機網絡發展
????????計算機作為人類協作的重要工具,其互聯需求天然催生了網絡技術的發展。最初,局部范圍內的連接需求推動了局域網(LAN)的誕生,這些網絡如同散落世界各地的數字節點,滿足著特定區域內的資源共享需求。隨著協作范圍的擴大,跨地域的局域網間產生了交互需求,這種拓撲擴展最終催生了覆蓋更廣域的廣域網(WAN)技術。網絡技術從LAN到WAN的演進,本質上映射著人類協作邊界不斷突破物理空間限制的過程。
????????所謂“局域網”(LAN)和“廣域網”(WAN)只是一個相對的概念. 比如, 我們有 "天朝特色" 的廣域網, 也可以看做一個比較大的局域網。
二、協議
1.認識協議
????????“協議”是一種約定,計算機要進行交流就需要有協議,就像人與人之間要進行交流就需要有語言,而語言、手語、摩斯密碼等這些都是人們的一種約定。
????????計算機之間的傳輸媒介是光信號和電信號. 通過 "頻率" 和 "強弱" 來表示 0 和 1 這樣的信息,?要想傳遞各種不同的信息, 就需要約定好雙方的數據格式。
但是只要兩臺主機約定好協議就可以了嗎?
????????并不是的,如果你用頻率表示 01, 我用強弱表示 01, 就好比我用中國話, 你用葡萄牙語一樣, 雖然大家可能遵守的一套通信規則, 但是語言不同, 即是訂好了基本的協議, 也是無法正常通信的。這就需要我們定制一個統一的協議或標準,通常是業界公認或者具有江湖地位的組織或者公司來做這件事情。比如有國際標準化組織IEEE,ISO等。
????????IEEE(電氣和電子工程師協會) :這是一個由計算機和工程領域專家組成的龐大技術組織, 在通信協議領域貢獻突出。 IEEE 制定了全世界電子、 電氣和計算機科學領域 30%左右的標準, 包括 IEEE 802 系列標準, 這些標準涵蓋了從局域網(LAN) 到廣域網(WAN) 等多種網絡技術。
????????ISO(國際標準化組織): ISO 是由多個國家的標準化團體組成的國際組織, 它在開放系統互連(OSI) 模型方面的工作尤為著名。 OSI 模型定義了網絡通信的七層協議結構, 盡管在實際應用中, TCP/IP 協議族更為普遍, 但 OSI 模型仍然在學術和理論研究中占有重要地位。
2.OSI七層模型
協議分層好處
????????協議本質也是軟件, 在設計上為了更好地進行模塊化, 解耦合, 也是被設計成為層狀結構的。
這樣的話,層與層之間互不干擾,一層的改變不會牽扯另一層,可以隨意切換。
????????事實上計算機內部的設備與設備之間也需要交互,同樣需要協議。那么現在開啟你的想象力,計算機之間的通信可以這樣理解:把你的計算機硬件拆成各個小零件,然后你的內存在海南,CPU在東北,磁盤在新疆,它們之間用長長的線連接組成了你的計算機。
???????我的意思是,計算機內部馮·諾伊曼體系本身就是一個網絡結構,網絡通信和本地計算機硬件之間的交互沒本質區別,無非就是從非常短的距離變成了超長距離而已。然而距離一旦變長就會遇到很多新的問題,而協議就是用來解決這些問題的。
如何處理數據? | 應用層... |
數據丟了怎么辦?? | 傳輸層 |
怎么定位目標主機? | 網絡層 |
怎么解決當下要去哪里? | 數據鏈路層... |
3.TCP/IP 五層(或四層)模型
TCP/IP 是一組協議的代名詞, 它還包括許多協議, 組成了 TCP/IP 協議簇。
TCP/IP 通訊協議采用了 5 層的層級結構, 每一層都呼叫它的下一層所提供的網絡來完成自己的需求。
- 物理層: 負責光/電信號的傳遞方式. 比如現在以太網通用的網線(雙絞 線)、 早期以太網采用的的同軸電纜(現在主要用于有線電視)、 光纖, 現在的 wifi 無線網使用電磁波等都屬于物理層的概念。 物理層的能力決定了最大傳輸速率、 傳輸距離、 抗干擾性等. 集線器(Hub)工作在物理層。
- 數據鏈路層: 負責設備之間的數據幀的傳送和識別. 例如網卡設備的驅動、 幀同步(就是說從網線上檢測到什么信號算作新幀的開始)、 沖突檢測(如果檢測到沖突就自動重發)、 數據差錯校驗等工作. 有以太網、 令牌環網, 無線 LAN 等標準.,交換機(Switch)工作在數據鏈路層。
- 網絡層: 負責地址管理和路由選擇. 例如在 IP 協議中, 通過 IP 地址來標識一臺主機, 并通過路由表的方式規劃出兩臺主機之間的數據傳輸的線路(路由). 路由器(Router)工作在網路層。
- 傳輸層: 負責兩臺主機之間的數據傳輸. 如傳輸控制協議 (TCP), 能夠確保數據可靠的從源主機發送到目標主機。
- 應用層: 負責應用程序間溝通, 如簡單電子郵件傳輸(SMTP) 、 文件傳輸協議(FTP) 、 網絡遠程訪問協議(Telnet) 等. 我們的網絡編程主要就是針對應用層。
?
????????在傳輸層最出名的協議是TCP,網絡層最出名的協議是IP,所以把這個模型叫作TCP/IP模型。
4.協議本質
????????主機之間雖然系統可能不同,但它們的協議棧都是嚴格按標準實現的,所以它們可以互相通信。
? ? ? ? 協議的本質是結構體,系統之間使用相同的結構體,約定好各個字段的含義,那么數據從哪里來到哪里去,要怎么用,它們都能看懂。這就像一個快遞單。
注:網絡通信貫穿了整個操作系統。
三、網絡傳輸流程
????????局域網(Local Area Network, LAN)是指覆蓋范圍較小(如家庭、辦公室、校園等)的網絡,其核心特點是高帶寬、低延遲和私有管理。
????????局域網發展是從計算機之間在小區域上的合作,最初幾乎每個區都有自己的協議,隨著網絡的發展很多區域之間也需要合作,那就需要統一的協議,所以有很多的協議都被淘汰,只有少部分被保留下來,如以太網,令牌環網,無線LAN等。
這里所指的協議都是在數據鏈路層的,接下來以以太網為例,給大家講解數據的傳輸。
以太網這個名字的由來
????????19世紀,科學家們覺得宇宙里必須有一種介質叫“以太”,光才得以傳播,就像聲音傳播必須有介質一樣。結果后來一群科學家一拍大腿:“這玩意兒根本不存在!”(邁克耳遜-莫雷實驗室錘打臉)。但“以太”這詞兒沒退休,反而被程序員薅走了羊毛,計算機科學家弄出來局域網通信標準后給它起名為以太網,內涵一下物理圈。
1.MAC地址
????????MAC地址是用來標識計算機的唯一性,用48比特位儲存,被寫死在計算機網卡中,是全球唯一的。
????????如上是主機之間在數據鏈路層的通信,在一個局域網內主機A給主機E發數據,這個過程所有的主機都能看到(叫泛洪),但只有跟目標MAC值相同的才會去接收,其他主機相當于吃瓜群眾。一個主機去接收不是發給自己的數據,這個過程就叫抓包。
那么試想一下如果很多臺主機一起發數據會發生什么?所以
- 以太網中,任何時刻,只允許一臺機器向網絡發送數據。
- 如果多臺同時發送,會發生數據干擾,稱之為數據碰撞。
- 沒有交換機的情況下,一個以太網就是一個碰撞域。
- 所有發送數據的主機要進行碰撞檢測和碰撞避免。
所以這也是一個網用的人越多就越卡的原因。以太網本質就是共享資源,具有互斥屬性。
2.協議棧
主機之間通信本質是協議棧在通信,我們把各主機都看做協議棧。
????????數據在走過每一層時都需要添加當層特有的字段,稱為報頭,除報頭外的稱為有效載荷,即
- 報文=報頭+有效載荷。
????????注意:有效載荷是指該層的報頭除外的部分,因為該層并不關心前面幾層加了什么報頭,都看做一塊數據。
如下:
在不同層報文有不同的名稱:
- 數據鏈路層:數據幀。
- 網絡層:數據報。
- 傳輸層:數據段。
- 應用層:請求與應答。
細節1:
對于應用層協議除外的所有協議,要滿足以下兩點:
- 報頭要能做到和有效載荷分離的能力。
- 報頭中必須包含如何將自己的有效載荷交付給上一層的具體協議。
細節2:
- 主機在數據鏈路層判斷報文是否發給自己,不是就直接丟棄。
細節3:
- 如上,整個數據的封裝與解包的過程,相當于入棧與出棧。所以我想大家知道為什么叫協議棧了吧!
3.IP地址
????????IP地址分為IPv4和IPv6,用來標識計算機的唯一性,同樣是全球唯一的,IPV4是4字節的空間,即2^32次方,隨著全球的人數不斷增加,IP地址開始不夠用,后來我國推出了IPV6為16字節空間,但要推廣的全世界仍然是一個難題。
? ? ? ? 我想大家現在會很疑惑,剛才不是講了一個MAC地址是標識計算機的唯一性嗎,現在怎么又來一個IP地址標識計算機的唯一性?
IP地址 vs MAC地址
1. 核心區別
-
IP地址:負責全局尋址,標識通信的起點(源)和終點(目標),類似“出發地”和“最終目的地”。
-
例子:唐僧從東土大唐(源IP)出發,最終目標是西天(目標IP),這兩個地址在整個旅程中不變。
-
-
MAC地址:負責局部尋址,標識每一段路程的直接上一站和下一站,類似“當前驛站”和“下一個驛站”。
-
例子:從東土大唐到高老莊,再到流沙河……每一段的起點和終點MAC地址都會變化。
-
2. 具體通信過程類比
假設唐僧取經的路線是:
東土大唐 → 高老莊 → 流沙河 → 火焰山 → 西天
通信階段 | IP地址 | MAC地址(當前跳) | 解釋 |
---|---|---|---|
出發時 | 源:東土大唐 目標:西天 | 源MAC:大唐 目標MAC:高老莊 | 唐僧離開大唐時,只需知道第一站是高老莊(MAC地址指向直接下一站)。 |
到達高老莊后 | 源:東土大唐 目標:西天 | 源MAC:高老莊 目標MAC:流沙河 | 高老莊的人告訴他下一站是流沙河,MAC地址更新為新的“局部起點和終點”。 |
到達流沙河后 | 源:東土大唐 目標:西天 | 源MAC:流沙河 目標MAC:火焰山 | 流沙河的河神指引他去火焰山,MAC地址再次更新。 |
…… | (IP始終不變) | (MAC逐段更新) | 直到最終抵達西天。 |
3. 關鍵總結
-
IP地址:像“終極目標”,全程不變(唐僧始終牢記要去西天)。
-
MAC地址:像“路標”,每到一個新地方就問:“下一站怎么走?”(MAC地址動態更新,確保每一步不迷路)。
-
網絡通信:數據包像唐僧,IP決定最終去向,MAC決定如何走到下一跳(路由器或交換機)。
MAC地址 | IP地址 |
---|---|
物理地址,固化在硬件中 | 邏輯地址,可動態分配 |
用于同一局域網內的直接通信 | 用于跨網絡的路由通信 |
數據鏈路層(OSI第二層) | 網絡層(OSI第三層) |
為什么需要兩者?
-
IP地址是邏輯上的全局定位,但實際網絡中數據包需要經過多個設備(路由器、交換機),這些設備之間需要通過MAC地址在本地網絡中準確傳遞數據。
-
就像唐僧不能直接“瞬移”到西天,必須依賴每一站的指引(MAC地址),而IP地址保證他最終不會走偏。
4.協議棧圖解
????????如上圖,數據在網絡層添加報頭時帶有源IP和目標IP,在數據鏈路層發現目標IP不是不是局域網內IP,然后添加MAC目標地址為路由器。傳輸到路由器后,路由器解包,分析目標IP后重新封裝,即加報頭,此時傳到另一個局域網,注意它封裝的這個報頭的協議已經不是原來局域網用的協議了,而是新局域網用的協議。
? ? ? ? 所以局域網之間盡管用不同的協議也無所謂,在路由器這里會進行重新封裝。從另一層面也說明了為什么有MAC地址還要在網絡層加IP地址好處,它讓世界的所有網絡都是 IP 網絡
,屏蔽最底層網絡的差異。
Socket編程
1.端口號
????????我們上網本質就是做兩臺主機的交互,一個是本地,一個是遠端,即客戶端與服務器。但是一個主機上客戶端是有很多的,比如:QQ,微信,抖音,愛奇藝等。服務器同樣有很多,QQ,微信,王者榮耀等。
? ? ? ? 所以一個數據傳輸到目標主機還不夠,還要把數據送入正確的服務器或客戶端。
服務器和客戶端的本質是什么?是一個程序,即進程。所以數據發送除了需要目標主機還需要目標進程。也就有了端口號用來標記一個主機內的唯一進程,端口號即port。
總結:IP+port可以確定全球唯一的進程。
- 細節1:一個進程可以綁定多個端口號; 但是一個端口號不能被多個進程綁定。。
- 細節2:雖然進程里面有進程ID標識進程唯一性,但進程 ID 屬于系統概念,?用它來標識唯一性會讓系統進程管理和網絡強耦合, 實際設計的時候,并沒有選擇這樣做。
端口號是多少字節,怎么分配的?
????????端口號在TCP/IP協議中是一個16位無符號整數,占用2字節,取值范圍為?0~65535(即?12^16?1)
????????一個主機內的進程是有生命周期的,這也決定了端口號是動態綁定的。可以由系統隨機分配和綁定,也可以有程序員自己綁定。但端口號0~1023是知名端口,不可以由我們把它綁定到進程,就像我們不能把110、120、119作自己的電話號碼一樣。只有1023以后才能有我們綁定。
2.TCP/UDP協議
在傳輸層有TCP/UDP協議,我們先做簡單了解,它們的特性如下:
特性 | TCP | UDP |
---|---|---|
連接性 | 面向連接(需三次握手建立連接) | 無連接(直接發送數據) |
可靠性 | 數據可靠傳輸(確認、重傳、校驗) | 不保證可靠性(可能丟包、亂序) |
傳輸效率 | 低(因額外控制機制) | 高(無復雜控制流程) |
數據邊界 | 字節流(無固定邊界) | 數據報(保留發送邊界) |
3.網絡字節序
????????在計算機中并沒有規定在儲存一個數據時是把高位儲存在地址還是低地址,所以就有了大端機和小端機,小端是低地址存放低位,巧記“小”“小”“小”,其他情況為大端機。
? ? ? ? 在網絡通信,即計算機之間要進行交互,就需要解決一個存儲方式不一致問題,統一規定使用大端存儲,即網絡字節序,在計算機把數據丟入網絡前要把數據轉化為大端模式。
網絡字節序=大端模式。
4.sockaddr 結構
sockaddr 結構是網絡編程中用于表示套接字地址的通用數據結構。
它既可以用做網絡通信,可以用作本地通信。它的實現具有多態的性質。如下:
????????sockarr_in是網絡通信的套接字,socket_un是本地通信的套接字。類型轉化為sockaddr后通過頭16位地址判斷出類型。