在生活中,我們經常會聽到「IP」這個詞。我們知道 IP 是一個我們在連上網路的時候,會有的一個位址,也知道查了 IP 你可能會知道一個人在什麼地方、用的是哪裡的網路。但 IP 到底是什麼?
這個問題其實有點複雜,也需要不少的背景知識,我嘗試把最簡單可以理解的部分抽出來,讓大家更好對這個主題有一個想像,但我必須承認自己對這領域的了解也還只在一本書的範圍。希望可以透過這篇文章,把我學到的知識說出來,也希望各位讀者不吝指教。
我們可以把協定想像成一種語言,當兩個完全不同的人,學了同一種語言的話,這兩個人就可以彼此進行交談。在網路的世界裡, TCP/IP 是一些最為重要的協定的總稱,所有採用這些協定的裝置,都可以用這個協定所規範的文法,來知道要怎麼處理來自另一台裝置的資料。
但資料透過網際網路的傳輸其實並沒有這麼簡單,他中間還有一些資料傳輸和轉換的過程。這件事情可以用打電話來想像。
比方說,假設剛剛那兩個會說同一種語言的人,今天沒有辦法直接面對面說話。沒辦法直接對話的這兩個人,就可能得要透過電話通話。
這時洋子說的話如果要讓健太聽到,就要先把洋子發出的聲音,變成電話可以傳輸的訊號,然後經由電話網,傳送到健太手中的電話中,電話會再把這份收到的訊號轉為聲音,而健太聽得懂這個聲音的語言,就懂洋子要說的是什麼了。
這時候如果健太直接收到的是電話的訊號,而沒有轉換成聲音,那麼因為健太和電話用的並不是同一種語言,交流在這裡失敗,他就會不知道洋子說了什麼了。
在網路世界中也是,網路把資料的傳輸需要進行的處理分成了不同的層級,並且每一個層級各自有自己的交流方式,也就是自己的語言(協定)。這些語言只有在相同層級的地方才有辦法互相溝通,彼此之間是看不懂對方的內容的。
這些層級的模型,就是 TCP/IP 模型。TCP/IP 模型依照進行的工作不同,分成了一個有四個階層。分別是應用層、傳輸層、網路層和連結層。
這就很像是在網路國裡面,有四種職業的人,每一種職業都有各自要負責的事情,一起組成一個生產線。而每一種職業裡的人,都會說彼此才懂的話。
我們在說的 IP ,就是在「網路層」裡面職業的其中一種語言。網路層這個職業,會負責把資料送到目的地,在這個職業間傳送的資料叫做「封包」。而這個職業的人,會用 IP 這個協定所說好的內容溝通。
順帶一提,在同一層之內不一定只有一種協定,即便是要處理的大目標相同(把資料送到目的地),也會有一些突發事件,像是對方不在,或者找不到路之類的,這時就會使用其他種協定。我們今天只會討論 IP 這個協定。
知道 IP 是一種在網路層使用,所有人都必須遵守的協定之後,下一個問題就是 IP 的功能是什麼?
IP 協定最主要有三個功能, IP 封包的分割及重組處理、IP 位址、以及路由選擇。
接著,我會一一敘述一下這些功能都是做什麼用的。
實際上在線路裡被運送的東西稱為封包,而運送封包其實是連結層的工作。
在連結層裡,稱為資料連結的連結媒介有很多種,像是光纖纜線、雙絞線等等。
每一種連結媒介,都有自己一次可以傳送多長的資料的限制。也就是說,每一種資料連結的最大傳輸單位(MTU)其實都不相同。這麼一來,在傳輸時如果遇到資料長度太長,資料連結無法處理的時候,就得要進行分割。
IP 規定了怎麼對這些封包進行處理,這些規定,使得資料傳輸過程中,不管各個階段 MTU 的最大值是多少,接收端都可以接收到和傳送端傳送的所有內容。
我們一般聽到要查人家 IP,想要查的其實都是 IP 位址。
IP 位址就是一台主機或路由器在網路層的地址,每一張網路卡都一定會有自己的 IP 位址,而在公有網路的世界裡, IP 位址基本上不會重複。在網路世界,就是用 IP 地址來找路,把資料傳到正確的位置去。
IP 有兩種版本,第一種版本是 IPv4,他是一組由 32 個位元所組成的數字。也就是最多有 2 的 32 次方個 IP 位址可以用,也就是約莫 43 億台電腦可以連接 IP 網路。雖然看起來數量很多,但其實已經用差不多了。為了解決這個問題,所以後來又發明了 IPv6 這個新版本,這個版本有 128 位元,非常非常多個數字可以用。
IPv4 的 IP 位址以 32 位元的二進制數表示,但為了方便人類閱讀,所以將二進制的 32 位元每 8 位元分為一組轉為十進制,共分成四組(32 / 8 = 4),用 .
隔開。
舉例來說,Google 的 IP 位址會是 216.58.197.163
。這實在不是一組會讓人感覺親近的字。
因為 IP 位置太不好記了,所以我們另外發展了一個叫做域名(Domain name)的東西,域名和我們的 IP 位址會有對應關係,我們常見的 google.com
就是這種寫法。
另外,IP 位址實際上不是以主機分,而是以我們前面也提到過的網路卡(NIC)分,一般來說,一張網路卡會分配一個 IP 位址,而路由器通常會有兩個以上的網路卡,所以一個路由器會有兩個以上的 IP 位置。
前面說了 IP 位址以 32 位元的二進制數表示,在這 32 位元的數中,還可以再分為網路部分和主機部分。
大家可以把網路部分想像成一個個社區,稱為區段,同一個區段裡面的主機都要設定成相同網路位址,而每一個區段的網路部分都會不相同。
IP 封包由路由器轉發時,主要依靠的就是網路部分。
一個路由器會有兩個以上的網路位址,只要知道這個資料要去的網路部分,路由器就會慢慢找到正確區段。
關於 IP 位址中哪些部分是網路部分,哪些部分又是主機部分,它們各佔位元這個問題,早期是用 class 來區分,但是後來發現一些區段非常大,大到現實裡很少會有有這個多主機連接的區段,造成不少浪費。所以後來又發展出了子網路遮罩,用子網路遮罩來加長網路部分,使原本的大區段,又可以再分出幾個小區段。
遮罩就是像是 192.168.128.10/24
這種寫法,寫在斜線後的子網路遮罩的意思,就是這個 IP 地址到第幾位元。 以這張圖來說,這裡的子網路遮罩,把 IP 位址中的前 24 個位元都變成了網路部分,這裡就是前三組 8 位元的 10 進制變成了網路層。
至於到底分出了多少個子網路,得要看原本這個位址是在哪一個 Class 底下決定,我們今天不會討論到,有興趣的話大家可以去翻翻我參考的書,連結會在文章最下面。
IPv6 的 IP 位址長度為 128 位元,以16 個位元為一組的單位分割,中間以冒號 :
分隔,並且以 16 進位來顯示。
如果連續出現0,可以直接把0省略,用兩個連續的冒號::表示。
以二進位表示(電腦中)
1111111011011100:1011101010011000:0111011001010100:0011001000010000:1111111011011100:1011101010011000:0111011001010100:0011001000010000
以十六進位表示
FEDC:BA98:7654:3210:FEDC:BA98:7654:3210
以二進制表示
0001000010000000:000000000000000:0000000000000000:0000000000000000:0000000000001000:0000100000000000:0010000000001100:0100000101111010
以 16 進位表示
省略前1080:0:0:0:8:800:200C:417A
省略後1080::8:800:200C:471A
剛剛我們說過,每一台主機或者路由器都會有自己的 IP 位址,大家想想現在幾乎所有人都有自己的電腦,可以造訪的網站也非常多。網路這麼龐大,可以不迷路而順利找到要去的 IP 位址,靠的就是利用路由選擇,決定到目標主機的路徑。
IP 的路由控制,是每次都依照下一個路徑來轉發封包。這就有點像是我要去台南孔廟,但我不知道怎麼去,因此我先到台北車站問站務員,台北車站的站務員不會直接告訴我怎麼到台南孔廟,但會讓我坐車到台南,等到了台南後,我再去問要怎麼到台南孔廟。資料就是用這種每一次都問下一個路由器接下來往哪走的方式,找到自己要去的那個位址。
路由器根據什麼告訴封包下一條路是哪條?
在所有主機和路由器中,都有一個路由表(Routing Table),寫著 IP 位址和路徑的對照。主機和路由器會依照這些對照表,將封包傳送到合適的路徑去。
如果表上沒有要前往的 IP 位址的路徑,則會有另一條預設閘道,總之不是自己這站,也不知道應該要往哪去的人,就先往那裡去。
今天一口氣講了不少東西,希望我有表達清楚 IP 到底在做什麼,也希望大家看得開心。