咱們天天使用互聯網,你是否想過,它是如何實現的?網絡
全世界幾十億臺電腦,鏈接在一塊兒,兩兩通訊。杭州的某一塊網卡送出信號,紐約的另外一塊網卡竟然就收到了,二者實際上根本不知道對方的物理位置,你不以爲這是很 神奇 的事情嗎?架構
互聯網的核心是一系列協議,總稱爲 互聯網協議 Internet Protocol Suite
。它們對 電腦 以及各類 網絡設備 如何 鏈接 和 組網,作出了詳盡的規定。理解了這些協議,就理解了互聯網的原理。socket
下面咱們一塊兒來探索 網絡 的 神祕 吧ui
==========================================================設計
互聯網 的實現,分紅好幾層。每一層都有本身的功能,就像建築物同樣,每一層都靠下一層支持。code
用戶接觸到的,只是最上面的一層,也就是 應用層。根本沒有感受到下面的層。要理解互聯網,必須從 最下層 開始,自下而上理解每一層的功能。orm
如何分層有不一樣的模型,OSI
分爲 七層。TCP-IP
協議羣把互聯網分紅五層
,比較容易解釋。 cdn
如圖所示,最底下的一層叫作 物理層 Physical Layer
,最上面的一層叫作 應用層 Application Layer
,中間的三層分別是 鏈路層 Link Layey
, 網絡層 Network Layer
和 傳輸層 Transport Layer
。越 下面 的層,越靠近 硬件 ;越 上面 的層,越靠近 用戶。blog
每一層都是爲了完成一種功能。爲了實現這些功能,就須要你們都遵照共同的規則。接口
你們都遵照的 規則,就叫作 協議 protocol
。
互聯網 的 每一層,都定義了不少協議。它們是互聯網的核心,咱們依次來探索每一層和每一層所適用的 協議。
物理層是網絡協議的最底層。
電腦要組網,第一件事要幹什麼?固然是先把電腦連起來,能夠用 光纜、電纜、雙絞線、無線電波 等方式。
如圖所示,2臺電腦經過中間媒介的連接就組成了一個最簡單的 區域網 。在這一層中,各類媒介中傳輸的就是咱們熟稱的 比特流,也就是傳送 0 和 1 的電信號。
鏈路層
定義
單純的0和1沒有任何意義,必須規定解讀方式:多少個電信號算一組?每一個信號位有何意義? 這就是 連接層 的功能,它在 實體層 的上方,肯定了 0 和 1 的 分組方式。
以太網協議
早期的時候,每家公司都有本身的電信號分組方式。逐漸地,一種叫作以太網(Ethernet
)的協議,佔據了主導地位。
以太網規定,一組電信號構成一個 數據包,叫作 幀(Frame
)。每一幀分紅兩個部分:標頭(Head
)和 數據(Data
)。
MAC地址
上面提到,以太網數據包的 標頭,包含了 發送者 和 接受者 的信息。那麼,發送者 和 接受者 是如何標識呢?
以太網規定,連入網絡的全部設備,都必須具備 網卡 接口。
數據包必須是從一塊網卡,傳送到另外一塊網卡。網卡 的地址,就是數據包的發送地址和接收地址,這叫作MAC
地址。
廣播
定義地址只是第一步,後面還有更多的步驟。
首先,一塊網卡怎麼會知道另外一塊網卡的MAC
地址?
咱們能夠經過ARP
協議,能夠解決這個問題。
其次,就算有了MAC
地址,系統怎樣才能把數據包準確送到接收方?
回答是以太網採用了一種很 原始 的方式,它不是把數據包準確送到接收方,而是向本網絡內全部 網絡設備 發送,讓每臺網絡設備本身判斷,是否爲接收方。【此處存在漏洞,咱們能夠進行攻擊】
broadcasting
)。MAC
地址、廣播的發送方式,連接層 就能夠在多臺計算機之間傳送數據了。 網絡層
網絡層的由來
以太網協議,依靠MAC
地址發送數據。理論上,單單依靠MAC
地址,杭州的網卡就能夠找到紐約的網卡了,技術上是能夠實現的。
可是,這樣作有一個重大的缺點。以太網 採用 廣播方式 發送數據包,全部成員 人手一包,不只 效率低,並且侷限在發送者所在的 子網絡。
也就是說,若是兩臺計算機不在同一個 子網絡,廣播是傳不過去的。這種設計是合理的,不然互聯網上每一臺計算機都會收到全部包,那會引發災難。
互聯網是無數子網絡共同組成的一個巨型網絡,很像想象上海和洛杉磯的電腦會在同一個子網絡,這幾乎是不可能的。
MAC
地址屬於同一個子網絡,哪些不是。若是是 同一個子網絡,就採用 廣播方式 發送,不然就採用 路由 方式發送。遺憾的是,MAC
地址自己沒法作到這一點。它只與廠商有關,與所處網絡無關。MAC
地址,另外一種是 網絡 地址。兩種地址之間沒有 任何聯繫 ,MAC
地址是綁定在 網卡上 的,網絡地址則
是系統自動分配的或者管理員指定,它們只是隨機組合在一塊兒。MAC
地址則將數據包送到該子網絡中的目標網卡。所以,從邏輯上能夠推斷,一定是先處理 網絡地址 ,而後再處理MAC
地址。 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
,所以它們在同一個子網絡。 IP數據包
根據IP
協議發送的數據,就叫作IP
數據包。不難想象,其中一定包括IP
地址信息。
可是前面說過,以太網數據包 只包含MAC
地址,並無IP
地址的欄位。那麼是否須要修改數據定義,再添加一個欄位呢?
回答是不須要,咱們能夠把IP
數據包直接放進以太網數據包的 數據 部分,所以徹底不用修改以太網的規格。這就是互聯網分層結構的好處:上層的變更徹底不涉及下層的結構
具體來講,IP數據包也分爲 標頭 和 數據 兩個部分。
IP
數據包超過了1500
字節,它就須要分割成 幾個 以太網數據包,分開發送了。 ARP
協議。
由於IP
數據包是放在以太網數據包裏發送的,因此咱們必須同時知道兩個地址,一個是對方的MAC
地址,另外一個是對方的IP
地址。
一般狀況下,對方的IP
地址是已知的,可是咱們不知道它的MAC
地址。
因此,咱們須要一種 機制 ,可以從IP
地址獲得MAC
地址。
MAC
地址,只能把數據包傳送到兩個子網絡鏈接處的 網關(gateway
),讓網關去處理。MAC
地址。MAC
地址這一欄,填的是FF:FF:FF:FF:FF:FF
,表示這是一個 廣播 地址。IP
地址,與自身的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],以及 知識星球[ 極客世界 ]