TCP/IP 網絡基礎(二)網絡層

IP地址和IP協議基本上構成了網絡層的核心和所有。而網絡層又是 TCP/IP 的心臟,或者是精華… 還拿前面的例子來講,數據鏈路層負責網絡內「直連」(廣義的直連也包括經過交換機、集線器等連起來)的設備的通訊,而IP協議(又叫網際協議)負責網絡間的連通。也就是說,數據鏈路層至關於快遞員騎着小電驢在你小區裏面找到你;而IP協議則負責把包裹從北京朝陽區某小區運到上海某小區。瀏覽器

IP協議是無鏈接的。它只提供盡力服務。而更可靠的協議則留待上層實現。安全

IP地址

在網絡層通訊離不開網絡層地址,即IP地址。
IP地址由32位正整數構成,一般用點分十進制表示。如 192.168.0.1.
IP地址分爲兩部分,前面是網絡號,後面是主機號。意思是在同一個網絡內的全部主機的網絡號應該是一致的,而主機號則用來區分是哪臺電腦。根據網絡內能容納多少臺主機又能夠分爲 A、B、C、D等幾類地址,然而如今也不用了,由於出現了子網掩碼。服務器

子網掩碼

子網掩碼就是網絡號部分所有爲1,後面所有爲0. 一樣能夠用點分十進制表示。如 255.255.255.0 表示IP地址的前24位是網絡號。也能夠用 192.168.0.1 /24 這種式子表示一個帶有子網掩碼的IP地址。
簡單地說,路由器根據一個地址的IP部分加上子網掩碼算出網絡號,從而得出該地址是在本網絡內部仍是外部,從而決定如何轉發。網絡

公有(全局)地址和私有地址

規定下面三種地址屬於私有地址:架構

  • 10.0.0.0 /8
  • 172.16.0.0 /12
  • 192.168.0.0 /16

公有地址是全局惟一的,即一個IP只能被一個主機擁有。而私有地址則只須要在網絡內部惟一,不一樣的網絡內的主機的IP地址能夠是相同的私有地址。例如家庭用的路由器的IP地址每每都是 192.168.0.1,連到路由器上的電腦都會被分配一些很相近的IP。
私有地址是爲了解決公有地址耗盡的問題。由於IP地址總共五億左右,遠遠小於互聯網上的主機數。而如今廣泛採用一個網絡只有不多幾個公有IP,網絡內的主機持有私有地址,經過 NAT 實現與外部的通訊。spa

路由控制

有了IP地址這個基礎架構,剩下的就是怎麼樣把數據發送到正確的地址。而IP協議是這樣實現的:
發送方須要知道如下兩個信息:router

  1. 接收方的IP
  2. 本機的路由控制表

路由控制表就是一張表,它告訴咱們碰到哪一種IP就把數據報發送到哪一個路由器上。比較IP地址每每就是匹配它的網絡號。
因爲每一個主機上都有路由控制表(至少有個默認路由,指向網關),每一個路由器也有路由控制表,所以一個報文就會這樣一跳一跳地最終到達目的地。就好像京東上買東西,先是上海倉庫發貨,而後發到上海總運輸站,再到江蘇總運輸站,再到南京XX區物流中心,而後快遞員上門送貨。
下面是一個路由轉發的例子:
routerblog

關於路由咱們只須要知道這麼多。至於路由間是如何商量出一條通道來傳輸數據的,這有專門的路由協議,並不屬於TCP/IP。
爲了更直觀,如下是我用Windows自帶命令 tracert 查看個人電腦到 baidu.com 的路由路徑。
圖片描述
圖中第一跳先找 192.168.0.1 即網關,接着就是三個叫 "adsl-pool.sx.cn"的路由器,能夠猜到是山西電信的路由器(此刻我人在山西)。最後又通過不少跳到達百度的服務器。圖片

IP協議相關技術

這部份內容在《圖解TCP/IP》第五章中有完善的講解。一句話來講——僅憑IP沒法完成通訊。好比,你剛剛輸入的baidu.com是什麼鬼?NAT又是怎麼工做的?路由

DNS

這個不用多說了,它提供IP地址與主機名之間的映射。DNS還有域名規範,從根域名往下分紅 org, com, cn 等等… 而域名服務器又是級聯的。DNS協議用UDP實現,其大體工做流程是:如在瀏覽器輸入 www.baidu.com, 主機先找最近的域名服務器(多是電信的某個服務器),若是它不知道,就去問根域名服務器,根域名服務器知道能夠去問百度的域名服務器,因而該域名服務器又去問百度的域名服務器,後者返回一個IP地址,最終被開始的域名服務器返回。
須要提到的就是DNS記錄裏面幾個重要的值。

A IP地址
NS 域名
CNAME 主機別名
PTR IP地址反向解析
MX 郵件

ARP

IP數據報在底層還得通過數據鏈路來傳遞。而數據鏈路只認MAC地址,不認識IP地址。ARP就是地址解析協議——由IP地址解析出MAC地址。它的工做方式也很是簡單:發送方在網絡內廣播:誰是老王?而後老王聽到了迴應:我就是老王,我MAC地址是XXX。

ICMP

ICMP是IP協議實現的一部分,用於網絡診斷和錯誤通知。例如,若是接收方不可達,通過屢次嘗試超時後,路由器會發送ICMP數據報回來,告訴發送方錯誤信息。
ICMP常見的有幾類重要消息。如:

  • 地址不可達;
  • 超時:即IP報頭中的TTL表示跳數,每通過一個路由TTL減一,當變爲0時路由器將回送超時消息,這種方法能夠防止IP消息在網絡中無限傳播,浪費帶寬。tracert的實現就是利用超時消息:先把TTL設爲1,就能獲得第一跳路由回送的超時消息,再每次TTL增長1,這樣就能依次收到路徑上路由器的超時消息。
  • ECHO消息:ping命令的實現原理。

DHCP

很是簡單,就是解決靜態IP配置太麻煩的問題。搭建一個DHCP服務器,新加入網絡的主機就能租用到新的IP,從而可以聯網。路由器通常能配置DHCP功能。

NAT

前面講到網絡內部的主機現在都是私有地址。在網絡內部通訊沒問題,但要想與外界的公有網絡通訊,發送沒問題,接收就有大問題:外部網絡不認識私有地址,不知道發給誰。就好像你給人寫信,發件人地址是「三年二班小王」,人家怎麼給你回信呢?

NAT(狹義上又叫NAPT)的解決方法是:由網關提供一次轉換。每次內部網絡向外請求時,都修改源地址,改成本網關的外部地址加上本身才能認識的端口號,這樣外部網絡也能發消息回來。當收到消息時,再根據端口號轉發到對應的內部主機上。
nat

NAT完美地解決了全局地址不足的問題,也使IPv6的需求不那麼迫切了。只是由於安全緣由,大多數路由器不容許外部網絡主動鏈接內部主機。這個問題就給P2P軟件如QQ、BT下載帶來了困難。而藉助一個外部公網服務器,就能夠實現路由器的「打洞」(學名「NAT穿越」),解決這個問題。詳細描述請自行搜索,這裏簡要敘述下。

假如A、B兩個主機都在內網,顯然任何一臺主機直連對方都是作不到的。但它們鏈接外部的公網服務器就沒問題。如今搭建一臺公網服務器,它和A、B都創建了鏈接。此時A想鏈接B,它就經過服務器告訴B本身想鏈接。而後B就發起一個請求直連A的公網地址加端口號。因爲是外部請求,A的網關會屏蔽這個鏈接,但B已經在B的網關上「打了個洞」。A接着直接請求B的公網地址加端口號,此時就能鏈接成功,從而創建通訊。