不做Script Kiddie (網路原理上篇)
我們每天使用互聯網,你是否想過,它是如何實現的?
全世界幾十億臺電腦,連接在一起,兩兩通信。杭州的某一塊網卡送出信號,紐約的另一塊網卡居然就收到了,兩者實際上根本不知道對方的物理位置,你不覺得這是很 神奇 的事情嗎?
互聯網的核心是一系列協議,總稱為 互聯網協議 Internet Protocol Suite
。它們對 電腦 以及各種 網路設備 如何 連接 和 組網,做出了詳盡的規定。理解了這些協議,就理解了互聯網的原理。
下面我們一起來探索 網路 的 神祕 吧
互聯網 的實現,分成好幾層。每一層都有自己的功能,就像建築物一樣,每一層都靠下一層支持。
用戶接觸到的,只是最上面的一層,也就是 應用層。根本沒有感覺到下面的層。要理解互聯網,必須從 最下層 開始,自下而上理解每一層的功能。
如何分層有不同的模型,OSI
分為 七層。TCP-IP
協議羣把互聯網分成五層
,比較容易解釋。
如圖所示,最底下的一層叫做 物理層 Physical Layer
,最上面的一層叫做 應用層 Application Layer
,中間的三層分別是 鏈路層 Link Layey
, 網路層 Network Layer
和 傳輸層 Transport Layer
。越 下面 的層,越靠近 硬體 ;越 上面 的層,越靠近 用戶。
層與協議
每一層都是為了完成一種功能。為了實現這些功能,就需要大家都遵守共同的規則。
大家都遵守的 規則,就叫做 協議 protocol
。
互聯網 的 每一層,都定義了很多協議。它們是互聯網的核心,我們依次來探索每一層和每一層所適用的 協議。
- 物理層
物理層是網路協議的最底層。
電腦要組網,第一件事要幹什麼?當然是先把電腦連起來,可以用 光纜、電纜、雙絞線、無線電波 等方式。
如圖所示,2臺電腦通過中間媒介的鏈接就組成了一個最簡單的 區域網 。在這一層中,各種媒介中傳輸的就是我們熟稱的 比特流,也就是傳送 0 和 1 的電信號。
- 鏈路層
- 定義單純的0和1沒有任何意義,必須規定解讀方式:多少個電信號算一組?每個信號位有何意義? 這就是 鏈接層 的功能,它在 實體層 的上方,確定了 0 和 1 的 分組方式。
- 乙太網協議早期的時候,每家公司都有自己的電信號分組方式。逐漸地,一種叫做乙太網(
Ethernet
)的協議,佔據了主導地位。乙太網規定,一組電信號構成一個 數據包,叫做 幀(Frame
)。每一幀分成兩個部分:標頭(Head
)和 數據(Data
)。
- 1. MAC地址上面提到,乙太網數據包的 標頭,包含了 發送者 和 接受者 的信息。那麼,發送者 和 接受者 是如何標識呢?乙太網規定,連入網路的所有設備,都必須具有 網卡 介面。數據包必須是從一塊網卡,傳送到另一塊網卡。網卡 的地址,就是數據包的發送地址和接收地址,這叫做
MAC
地址。
- 2 廣播定義地址只是第一步,後面還有更多的步驟。首先,一塊網卡怎麼會知道另一塊網卡的
MAC
地址?我們可以通過ARP
協議,可以解決這個問題。其次,就算有了
回答是乙太網採用了一種很 原始 的方式,它不是把數據包準確送到接收方,而是向本網路內所有 網路設備 發送,讓每臺網路設備自己判斷,是否為接收方。【此處存在漏洞,我們可以進行攻擊】MAC
地址,系統怎樣才能把數據包準確送到接收方?
broadcasting
)。有了數據包的定義、網卡的MAC
地址、廣播的發送方式,鏈接層 就可以在多臺計算機之間傳送數據了。
- 網路層
- 不同一個子網沒有辦法直接得到對方的
MAC
地址,只能把數據包傳送到兩個子網路連接處的 網關(gateway
),讓網關去處理。 - 同一個子網那麼我們可以用ARP協議,得到對方的
MAC
地址。ARP 協議也是發出一個數據包(包含在乙太網數據包中),其中包含它所要查詢主機的IP地址,在對方的MAC
地址這一欄,填的是FF:FF:FF:FF:FF:FF
,表示這是一個 廣播 地址。它所在子網路的 每一臺主機 ,都會收到這個數據包,從中取出
IP
地址,與自身的IP
地址進行比較。如果兩者相同,都做出回復,向對方報告自己的MAC
地址,否則就 丟棄 這個包。
- 1 網路層的由來乙太網協議,依靠
MAC
地址發送數據。理論上,單單依靠MAC
地址,杭州的網卡就可以找到紐約的網卡了,技術上是可以實現的。但是,這樣做有一個重大的缺點。乙太網 採用 廣播方式 發送數據包,所有成員 人手一包,不僅 效率低,而且侷限在發送者所在的 子網路。也就是說,如果兩臺計算機不在同一個 子網路,廣播是傳不過去的。這種設計是合理的,否則互聯網上每一臺計算機都會收到所有包,那會引起災難。互聯網是無數子網路共同組成的一個巨型網路,很像想像上海和洛杉磯的電腦會在同一個子網路,這幾乎是不可能的。
MAC
地址屬於同一個子網路,哪些不是。如果是 同一個子網路,就採用 廣播方式 發送,否則就採用 路由 方式發送。遺憾的是,MAC
地址本身無法做到這一點。它只與廠商有關,與所處網路無關。這就導致了 網路層 的誕生。它的作用是引進一套新的地址,使得我們能夠區分不同的計算機是否屬於同一個子網路。這套地址就叫做 網路地址,簡稱 網址。於是,網路層 出現以後,每臺計算機有了兩種地址,一種是MAC
地址,另一種是 網路 地址。兩種地址之間沒有 任何聯繫 ,MAC
地址是綁定在 網卡上 的,網路地址則
是系統自動分配的或者管理員指定,它們只是隨機組合在一起。
網路地址 幫助我們確定計算機所在的子網路,MAC
地址則將數據包送到該子網路中的目標網卡。因此,從邏輯上可以推斷,必定是先處理 網路地址 ,然後再處理MAC
地址。
- 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.1
和172.16.254.233
的子網掩碼都是255.255.255.0
,請問它們是否在同一個子網路?兩者與子網掩碼分別進行AND運算,結果都是172.16.254.0
,因此它們在同一個子網路。
- 3 IP數據包根據
IP
協議發送的數據,就叫做IP
數據包。不難想像,其中必定包括IP
地址信息。但是前面說過,乙太網數據包 只包含MAC
地址,並沒有IP
地址的欄位。那麼是否需要修改數據定義,再添加一個欄位呢?回答是不需要,我們可以把IP
數據包直接放進乙太網數據包的 數據 部分,因此完全不用修改乙太網的規格。這就是互聯網分層結構的好處:上層的變動完全不涉及下層的結構具體來說,IP數據包也分為 標頭 和 數據 兩個部分。
IP
數據包超過了1500
位元組,它就需要分割成 幾個 乙太網數據包,分開發送了。
- 4
ARP
協議。因為IP
數據包是放在乙太網數據包裏發送的,所以我們必須同時知道兩個地址,一個是對方的MAC
地址,另一個是對方的IP
地址。通常情況下,對方的IP
地址是已知的,但是我們不知道它的MAC
地址。所以,我們需要一種 機制 ,能夠從IP
地址得到MAC
地址。
- 傳輸層
- 傳輸層的由來有了
MAC
地址和IP
地址,我們已經可以在互聯網上任意兩臺主機上建立通信。接下來的問題是,同一臺主機上有許多 程序 都需要用到網路,比如,你一邊瀏覽網頁,一邊與朋友在線聊天。當一個數據包從互聯網上發來的時候,你怎麼知道,它是表示 網頁 的內容,還是表示 在線聊天 的內容?也就是說,我們還需要一個 參數 ,表示這個數據包到底供哪個程序(進程)使用。這個參數就叫做 埠(port
),它其實是每一個 使用網卡的程序的編號。每個 數據包 都發到主機的 特定埠 ,所以不同的程序就能取到自己所需要的數據。埠 是0到65535之間的一個整數,正好16個二進位位。0 到 1023 的埠被系統佔用,用戶只能選用 大於1023 的埠。傳輸層 的功能,就是建立 埠到埠 的通信。相比之下,網路層 的功能是建立 主機到主機 的通信。只要確定 主機 和 埠,我們就能實現程序之間的交流。因此,Unix
系統就把 主機+埠,叫做 套接字(socket
)。有了它,就可以進行網路應用程序開發了。 - UDP協議現在,我們必須在數據包中加入埠信息,這就需要新的協議。最簡單的實現叫做
UDP
協議,它的格式幾乎就是在 數據前面,加上埠號。UDP 數據包,也是由 標頭 和 數據 兩部分組成。
UDP
數據包放入IP
數據包的 數據 部分,而前面說過,IP數據包 又是放在 乙太網數據包 之中的,所以整個乙太網數據包現在變成了下面這樣:
- TCP協議UDP 協議的優點是比較 簡單,容易實現,但是 缺點 是 可靠性較差,一旦數據包發出,無法知道對方是否收到。為瞭解決這個問題,提高網路可靠性,
TCP
協議就誕生了。這個協議非常複雜,但可以近似認為,它就是有 確認機制 的UDP
協議,每發出一個數據包都要求 確認。如果有一個數據包 遺失,就收不到 確認,發出方就知道有必要 重發 這個數據包了。因此,TCP
協議能夠確保數據 不會遺失。它的 缺點 是過程 複雜、實現困難、消耗較多的資源。TCP 數據包和UDP
數據包一樣,都是內嵌在IP
數據包的 數據 部分。TCP 數據包沒有 長度限制 ,理論上可以無限長
,但是為了 保證網路的效率,通常TCP
數據包的長度不會超過IP
數據包的長度,以確保單個TCP
數據包不必再分割。
- 應用層 應用程序 收到 傳輸層 的數據,接下來就要進行 解讀。由於互聯網是開放架構,數據來源五花八門,必須事先規定好 格式,否則根本無法解讀。 應用層 的作用,就是規定應用程序的數據格式。
舉例來說,TCP
協議可以為各種各樣的程序傳遞數據,比如Email
、WWW
、FTP
等等。那麼,必須有不同協議規定 電子郵件、網頁、FTP數據 的 格式,這些應用程序協議就構成了 應用層。
這是 最高 的一層,直接面對用戶。它的數據就放在TCP
數據包的 數據 部分。因此,現在的乙太網的數據包就變成下面這樣。
PC
會中 電腦病毒,那麼網路設備中的 交換機、路由器、集線器 等設備也會中 電腦病毒 麼?願意與大家分享交流各種技術,個人公眾賬號[mindev],以及 知識星球[ 極客世界]
推薦閱讀: