我們每天使用互聯網,你是否想過,它是如何實現的?

  全世界幾十億臺電腦,連接在一起,兩兩通信。杭州的某一塊網卡送出信號,紐約的另一塊網卡居然就收到了,兩者實際上根本不知道對方的物理位置,你不覺得這是很 神奇 的事情嗎?

  互聯網的核心是一系列協議,總稱為 互聯網協議 Internet Protocol Suite。它們對 電腦 以及各種 網路設備 如何 連接組網,做出了詳盡的規定。理解了這些協議,就理解了互聯網的原理。

  下面我們一起來探索 網路神祕

互聯網 的實現,分成好幾層。每一層都有自己的功能,就像建築物一樣,每一層都靠下一層支持

  用戶接觸到的,只是最上面的一層,也就是 應用層。根本沒有感覺到下面的層。要理解互聯網,必須從 最下層 開始,自下而上理解每一層的功能。

  如何分層有不同的模型,OSI分為 七層TCP-IP協議羣把互聯網分成五層,比較容易解釋。

  如圖所示,最底下的一層叫做 物理層 Physical Layer,最上面的一層叫做 應用層 Application Layer,中間的三層分別是 鏈路層 Link Layey, 網路層 Network Layer傳輸層 Transport Layer。越 下面 的層,越靠近 硬體 ;越 上面 的層,越靠近 用戶

層與協議

  每一層都是為了完成一種功能。為了實現這些功能,就需要大家都遵守共同的規則。

  大家都遵守的 規則,就叫做 協議 protocol

互聯網每一層,都定義了很多協議。它們是互聯網的核心,我們依次來探索每一層和每一層所適用的 協議

  • 物理層

  物理層是網路協議的最底層。

  電腦要組網,第一件事要幹什麼?當然是先把電腦連起來,可以用 光纜電纜雙絞線無線電波 等方式。

  如圖所示,2臺電腦通過中間媒介的鏈接就組成了一個最簡單的 區域網 。在這一層中,各種媒介中傳輸的就是我們熟稱的 比特流,也就是傳送 01 的電信號。

  • 鏈路層
  1. 定義單純的0和1沒有任何意義,必須規定解讀方式:多少個電信號算一組?每個信號位有何意義? 這就是 鏈接層 的功能,它在 實體層 的上方,確定了 01分組方式
  2. 乙太網協議早期的時候,每家公司都有自己的電信號分組方式。逐漸地,一種叫做乙太網Ethernet)的協議,佔據了主導地位。乙太網規定,一組電信號構成一個 數據包,叫做 Frame)。每一幀分成兩個部分:標頭Head)和 數據Data)。

標頭 包含數據包的一些說明項,比如 發送者接受者數據類型等等;數據則是數據包的 具體內容標頭 的長度,固定為 18 位元組。數據 的長度,最短為 46 位元組,最長為 1500 位元組。因此,整個 最短為 64 (18+46)位元組,最長為1518(18+1500)位元組。如果數據很長,就必須分割成多個幀進行發送。
    1. 1. MAC地址上面提到,乙太網數據包的 標頭,包含了 發送者接受者 的信息。那麼,發送者接受者 是如何標識呢?乙太網規定,連入網路的所有設備,都必須具有 網卡 介面。數據包必須是從一塊網卡,傳送到另一塊網卡。網卡 的地址,就是數據包的發送地址和接收地址,這叫做MAC地址。

每塊網卡出廠的時候,都有一個全世界 獨一無二MAC 地址,長度是 48 個比特,通常用 12十六進位數 表示。

6 個十六進位數是廠商編號,後 6 個是該廠商的網卡流水號。有了 MAC 地址,就可以 定位網卡和數據包路徑 了。
    1. 2 廣播定義地址只是第一步,後面還有更多的步驟。首先,一塊網卡怎麼會知道另一塊網卡的MAC地址?我們可以通過ARP協議,可以解決這個問題。

      其次,就算有了MAC地址,系統怎樣才能把數據包準確送到接收方?

      回答是乙太網採用了一種很 原始 的方式,它不是把數據包準確送到接收方,而是向本網路內所有 網路設備 發送,讓每臺網路設備自己判斷,是否為接收方。【此處存在漏洞,我們可以進行攻擊

如圖,1號2號 發送一個數據包,同一個子網路的 3號4號5號 計算機都會收到這個包。它們讀取這個包的 標頭,找到接收方的 MAC 地址,然後與自身的 MAC 地址相比較,如果兩者相同,就接受這個包,做進一步處理,否則就丟棄這個包。這種發送方式就叫做 廣播broadcasting)。有了數據包的定義、網卡的MAC地址、廣播的發送方式,鏈接層 就可以在多臺計算機之間傳送數據了。
  • 網路層
    • 不同一個子網沒有辦法直接得到對方的MAC地址,只能把數據包傳送到兩個子網路連接處的 網關gateway),讓網關去處理。
    • 同一個子網那麼我們可以用ARP協議,得到對方的MAC地址。ARP 協議也是發出一個數據包(包含在乙太網數據包中),其中包含它所要查詢主機的IP地址,在對方的 MAC 地址這一欄,填的是FF:FF:FF:FF:FF:FF,表示這是一個 廣播 地址。

      它所在子網路的 每一臺主機 ,都會收到這個數據包,從中取出IP地址,與自身的IP地址進行比較。如果兩者相同,都做出回復,向對方報告自己的MAC地址,否則就 丟棄 這個包。

  1. 1 網路層的由來乙太網協議,依靠MAC地址發送數據。理論上,單單依靠MAC 地址,杭州的網卡就可以找到紐約的網卡了,技術上是可以實現的。但是,這樣做有一個重大的缺點。乙太網 採用 廣播方式 發送數據包,所有成員 人手一包,不僅 效率低,而且侷限在發送者所在的 子網路。也就是說,如果兩臺計算機不在同一個 子網路,廣播是傳不過去的。這種設計是合理的,否則互聯網上每一臺計算機都會收到所有包,那會引起災難。互聯網是無數子網路共同組成的一個巨型網路,很像想像上海和洛杉磯的電腦會在同一個子網路,這幾乎是不可能的。

因此,必須找到一種方法,能夠區分哪些MAC地址屬於同一個子網路,哪些不是。如果是 同一個子網路,就採用 廣播方式 發送,否則就採用 路由 方式發送。遺憾的是,MAC地址本身無法做到這一點。它只與廠商有關,與所處網路無關。這就導致了 網路層 的誕生。它的作用是引進一套新的地址,使得我們能夠區分不同的計算機是否屬於同一個子網路。這套地址就叫做 網路地址,簡稱 網址。於是,網路層 出現以後,每臺計算機有了兩種地址,一種是MAC地址,另一種是 網路 地址。兩種地址之間沒有 任何聯繫MAC地址是綁定在 網卡上 的,網路地址則是系統自動分配的或者管理員指定,它們只是隨機組合在一起。

網路地址 幫助我們確定計算機所在的子網路,MAC地址則將數據包送到該子網路中的目標網卡。因此,從邏輯上可以推斷,必定是先處理 網路地址 ,然後再處理MAC地址。

    1. 2 IP協議規定網路地址的協議,叫做IP協議。它所定義的地址,就被稱為IP地址。目前,廣泛採用的是IP協議第四版,簡稱IPv4。這個版本規定,網路地址由 32 個二進位位組成。

習慣上,我們用分成 四段十進位 數表示IP地址,從0.0.0.0一直到 255.255.255.255。互聯網上的每一臺網路設備,都會分配到一個IP地址。這個地址分成兩個部分,前一部分 代表網路,後一部分 代表主機。比如,IP地址 172.16.254.1,這是一個32位的地址,假定它的網路部分是前24位(172.16.254),那麼主機部分就是後8位(最後的那個1)。處於同一個子網路的電腦,它們IP地址的網路部分必定是相同的,也就是說172.16.254.2應該與172.16.254.1處在同一個子網路。但是,問題在於單單從IP地址,我們無法判斷網路部分。還是以172.16.254.1為例,它的網路部分,到底是前24位,還是前16位,甚至前28位,從IP地址上是看不出來的。那麼,怎樣才能從IP地址,判斷兩臺計算機是否屬於同一個子網路呢?這就要用到另一個參數 子網掩碼subnet mask)。

所謂 子網掩碼 ,就是表示 子網路特徵 的一個參數。它在形式上等同於IP地址,也是一個32二進位數字,它的網路部分全部為 1 ,主機部分全部為 0

比如,IP地址172.16.254.1,如果已知網路部分是前24位,主機部分是後8位,那麼子網路掩碼就是11111111.11111111.11111111.00000000,寫成十進位就是255.255.255.0。知道 子網掩碼,我們就能判斷,任意兩個IP地址是否處在同一個子網路。方法是將兩個IP地址與 子網掩碼 分別進行AND運算(兩個數位都為1,運算結果為1,否則為0),然後比較結果是否相同,如果是的話,就表明它們在同一個子網路中,否則就不是。比如,已知IP地址172.16.254.1172.16.254.233的子網掩碼都是255.255.255.0,請問它們是否在同一個子網路?兩者與子網掩碼分別進行AND運算,結果都是172.16.254.0,因此它們在同一個子網路。
    1. 3 IP數據包根據IP協議發送的數據,就叫做IP數據包。不難想像,其中必定包括IP地址信息。但是前面說過,乙太網數據包 只包含MAC地址,並沒有IP地址的欄位。那麼是否需要修改數據定義,再添加一個欄位呢?回答是不需要,我們可以把IP數據包直接放進乙太網數據包的 數據 部分,因此完全不用修改乙太網的規格。這就是互聯網分層結構的好處:上層的變動完全不涉及下層的結構具體來說,IP數據包也分為 標頭數據 兩個部分。

標頭 部分主要包括 版本長度IP地址 等信息,數據 部分則是 IP數據包 的具體內容。它放進乙太網數據包後,乙太網數據包就變成了下面這樣。

IP 數據包的 標頭 部分的長度為2060位元組,整個數據包的總長度最大為65,535位元組。因此,理論上,一個IP數據包的 數據 部分,最長為 65,515 位元組。前面說過,乙太網數據包的 數據 部分,最長只有 1500 位元組。因此,如果IP數據包超過了1500位元組,它就需要分割成 幾個 乙太網數據包,分開發送了。
    1. 4 ARP協議。因為IP數據包是放在乙太網數據包裏發送的,所以我們必須同時知道兩個地址,一個是對方的MAC地址,另一個是對方的IP地址。通常情況下,對方的IP地址是已知的,但是我們不知道它的MAC地址。所以,我們需要一種 機制 ,能夠從IP地址得到MAC地址。
  • 傳輸層
  1. 傳輸層的由來有了MAC地址和IP地址,我們已經可以在互聯網上任意兩臺主機上建立通信。接下來的問題是,同一臺主機上有許多 程序 都需要用到網路,比如,你一邊瀏覽網頁,一邊與朋友在線聊天。當一個數據包從互聯網上發來的時候,你怎麼知道,它是表示 網頁 的內容,還是表示 在線聊天 的內容?也就是說,我們還需要一個 參數 ,表示這個數據包到底供哪個程序(進程)使用。這個參數就叫做 port),它其實是每一個 使用網卡的程序的編號。每個 數據包 都發到主機的 特定埠 ,所以不同的程序就能取到自己所需要的數據。 是0到65535之間的一個整數,正好16個二進位位。01023 的埠被系統佔用,用戶只能選用 大於1023 的埠。傳輸層 的功能,就是建立 埠到埠 的通信。相比之下,網路層 的功能是建立 主機到主機 的通信。只要確定 主機,我們就能實現程序之間的交流。因此,Unix系統就把 主機+埠,叫做 套接字socket)。有了它,就可以進行網路應用程序開發了。
  2. UDP協議現在,我們必須在數據包中加入信息,這就需要新的協議。最簡單的實現叫做UDP 協議,它的格式幾乎就是在 數據前面,加上埠號UDP 數據包,也是由 標頭數據 兩部分組成。

標頭 部分主要定義了 發出埠接收埠數據 部分就是具體的內容。然後,把整個UDP數據包放入IP數據包的 數據 部分,而前面說過,IP數據包 又是放在 乙太網數據包 之中的,所以整個乙太網數據包現在變成了下面這樣:

UDP 數據包非常簡單,標頭 部分一共只有 8 個位元組,總長度不超過 65,535位元組,正好放進一個IP數據包。
    1. TCP協議UDP 協議的優點是比較 簡單容易實現,但是 缺點可靠性較差,一旦數據包發出,無法知道對方是否收到。為瞭解決這個問題,提高網路可靠性,TCP協議就誕生了。這個協議非常複雜,但可以近似認為,它就是有 確認機制UDP協議,每發出一個數據包都要求 確認。如果有一個數據包 遺失,就收不到 確認,發出方就知道有必要 重發 這個數據包了。因此,TCP協議能夠確保數據 不會遺失。它的 缺點 是過程 複雜實現困難消耗較多的資源TCP 數據包和 UDP 數據包一樣,都是內嵌在IP數據包的 數據 部分。TCP 數據包沒有 長度限制 ,理論上可以無限長,但是為了 保證網路的效率,通常TCP數據包的長度不會超過IP數據包的長度,以確保單個TCP數據包不必再分割。
  • 應用層 應用程序 收到 傳輸層 的數據,接下來就要進行 解讀。由於互聯網是開放架構,數據來源五花八門,必須事先規定好 格式,否則根本無法解讀。 應用層 的作用,就是規定應用程序的數據格式。

    舉例來說,TCP協議可以為各種各樣的程序傳遞數據,比如EmailWWWFTP等等。那麼,必須有不同協議規定 電子郵件網頁FTP數據格式,這些應用程序協議就構成了 應用層

    這是 最高 的一層,直接面對用戶。它的數據就放在TCP數據包的 數據 部分。因此,現在的乙太網的數據包就變成下面這樣。

    五層結構就是如此啦,那麼筆者就提個問題吧?那麼,我們的個人PC會中 電腦病毒,那麼網路設備中的 交換機路由器集線器 等設備也會中 電腦病毒 麼?

  願意與大家分享交流各種技術,個人公眾賬號[mindev],以及 知識星球[ 極客世界]

            歡迎訂閱公眾賬號,日更喲~~~
推薦閱讀:
相關文章