淺談網絡協議(三) 關於IP的一些講解

如何獲取一臺電腦的IP地址?
這是個簡單的問題,稍微折騰過linux系統的人,都知道如何獲取電腦的IP地址。windows上面ipconfig,linux上面是 ifconfigip addr

但是不是所有人都知道 ifconfigip addr 的區別。這裏要涉及到 net-toolsiproute2 的歷史了。

如果你安裝了一個僅有linux內核的系統,發現 ifconfigip addr 指令都不存在,你會怎麼操作?這個時候,你可以自行安裝 net-toolsiproute2 這兩個工具。當然,大多數時候這兩個命令是系統自帶的。

安裝好後,我們來運行一下 ip addr。不出意外,應該會輸出下面的內容。

root@heihei:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3c:c7:2f:79 brd ff:ff:ff:ff:ff:ff
    inet 103.1.153.13/25 brd 103.1.153.127 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2402:c480:8000:1:0:106:f89f:da7c/96 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3cff:fec7:2f79/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:fe:82:cb:41 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:feff:fe82:cb41/64 scope link 
       valid_lft forever preferred_lft forever
5: vethde92e06@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether ca:7b:d4:e4:7e:e9 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::c87b:d4ff:fee4:7ee9/64 scope link 
       valid_lft forever preferred_lft forever

以上顯示了這臺機器上所有的網卡。大部分的網卡都會有一個 IP 地址,但是 IP 並不是必須的。IP 地址是網卡在互聯網世界中的通訊地址,不能有重複的,否則就回引起衝突。

如上輸出的結果,103.1.153.13 就是一個 IP 地址。這個地址被點分隔爲四個部分,每個部分 8 個 bit,所以 IP 地址總共是 32 位。這樣產生的 IP 地址的數量很快就不夠用了。因爲當時設計 IP 地址的時候,低估了計算機的發展,並沒有想到現在會有這麼多計算機!所以現在就有了 IPv6,也就是上面輸出結果裏面 inet6 fe80::216:3cff:fec7:2f79/64。 IPv6有128位的地址,現在是夠了,但是將來會不會少就不好說了。

32 位的 IP 地址還被分成了 5 類,於是就更加不夠了。 1

在網絡地址中,對於 A、B、C 類主要分兩部分,一部分是網絡號,一部分是主機號。區分不同局域網中相同主機號的計算機。

下圖是 A、B、C 三類地址所能包含的主機數量。

2

不同的類型表示網絡的方法也不同 A類:網絡號.主機號.主機號.主機號
B類:網絡號.網絡號.主機號.主機號
C類:網絡號.網絡號.網絡號.主機號

A類網絡地址範圍中,第一字節的第一位必須是0,所以其網絡地址範圍從 00000000-01111111。即0-127。
B類網絡地址範圍中,第一字節的前2位必須是10,所以其網絡地址範圍從 10000000-10111111。即128-191。
C類網絡地址範圍中,第一字節的前3位必須是110,所以其網絡地址範圍從 11000000-11011111。即192-223。

A類網絡用8位表示網絡號,24位表示主機位,B類網絡以16位表示網絡,16位表示主機,C類網絡用24位表示網絡號,8位表示主機位。D類和E類是我們平時不用的,

這裏面有個尷尬的事情,就是 C 類地址能包含的最大主機數量太少了,只有 254 個。而 B 類地址能包含的最大主機數量又太多了。6 萬多臺機器放在一個網絡下面,一般的企業基本達不到這個規模,閒着的地址就是浪費。

無類型域間選路(CIDR) 於是有了一個折中的方式叫作無類型域間選路,簡稱CIDR。這種方式打破了原來設計的幾類地址的做法,將 32 位的 IP 地址一分爲二,前面是網絡號,後面是主機號。從哪裏分呢?你如果注意觀察的話可以看到,103.1.153.13/25,這個 IP 地址中有一個斜槓,斜槓後面有個數字 25。這種地址表示形式,就是 CIDR。後面 25 的意思是,32 位中,前 25 位是網絡號,後 7 位是主機號。那麼子網掩碼與可用網絡則爲:

binary 11111111.11111111.11111111.10000000
ip 255.255.255.128
可用網絡從 11111111.11111111.11111111.10000001 - 11111111.11111111.11111111.11111110
即從103.1.153.1 到 103.1.153.126

伴隨着 CIDR 存在的,一個是廣播地址,103.1.153.127。如果發送這個地址,所有同網段的網絡裏面的機器都可以收到。當主機位是全1時我們將該地址作爲子網廣播地址,則廣播地址爲103.1.153.127。將子網掩碼和 IP 地址按位計算 AND,就可得到網絡號。

公有 IP 地址和私有 IP 地址 在日常的工作中,幾乎不用劃分 A 類、B 類或者 C 類,反而是 CIDR 用得比較多。但是有一點還是要注意的,就是公有 IP 地址和私有 IP 地址。

簡單來說,私有IP,就是局域網內部用的,不同的局域網內可以重複,C類的私有IP相信很多人都很熟悉。 公有 IP 地址有組織統一分配,你需要去買。如果你搭建一個網站,給你學校或者公司的人使用,讓學校或者公司的網管給你一個 IP 地址就行。但是如果你要一個全世界人都能訪問的網站,那麼你就需要購買一個公有IP。

表格中的 192.168.0.x 是最常用的私有 IP 地址。你家裏有 Wi-Fi,對應就會有一個 IP 地址。一般你家裏地上網設備不會超過 256 個,所以 /24 基本就夠了。有時候我們也能見到 /16 的 CIDR,這兩種是最常見的,也是最容易理解的。

不需要將十進制轉換爲二進制 32 位,就能明顯看出 192.168.0 是網絡號,後面是主機號。而整個網絡裏面的第一個地址 192.168.0.1,往往就是你這個私有網絡的出口地址。例如,你家裏的電腦連接 Wi-Fi,Wi-Fi 路由器的地址就是 192.168.0.1,而 192.168.0.255 就是廣播地址。一旦發送這個地址,整個 192.168.0 網絡裏面的所有機器都能收到。

但是也不總都是這樣的情況。因此,其他情況往往就會很難理解,還容易出錯。比如上述的地址,cidr的主機位就只有7。

舉例:一個容易“犯錯”的 CIDR 我們來看 16.158.165.91/22 這個 CIDR。求一下這個網絡的第一個地址、子網掩碼和廣播地址。

這五類地址中,還有一類 D 類是組播地址。使用這一類地址,屬於某個組的機器都能收到。這有點類似在公司裏面大家都加入了一個郵件組。發送郵件,加入這個組的都能收到。組播地址在後面講述 VXLAN 協議的時候會提到。

繼續來分析IP addr 指令。
在 IP 地址的後面有個 scope,對於 eth0 這張網卡來講,是 global,說明這張網卡是可以對外的,可以接收來自各個地方的包。對於 lo 來講,是 host,說明這張網卡僅僅可以供本機相互通信。

lo 全稱是loopback,又稱環回接口,往往會被分配到 127.0.0.1 這個地址。這個地址用於本機通信,經過內核處理後直接返回,不會在任何網絡中出現。

MAC 地址 在 IP 地址的上一行是 link/ether 00:16:3c:c7:2f:79 brd ff:ff:ff:ff:ff:ff,這個被稱爲MAC 地址,是一個網卡的物理地址,用十六進制,6 個 byte 表示。

MAC 地址號稱全局唯一,不會有兩個網卡有相同的 MAC 地址,而且網卡自生產出來,就帶着這個地址。很多人看到這裏就會想,既然這樣,整個互聯網的通信,全部用 MAC 地址好了,只要知道了對方的 MAC 地址,就可以把信息傳過去。這個問題之前已經說過,就不再這裏說了。

MAC 地址是有一定定位功能,但是範圍非常有限,只在同一網段起作用。例如,從 192.168.0.2/24 訪問 192.168.0.3/24 是可以用 MAC 地址的。一旦跨子網,即從 192.168.0.2/24 到 192.168.1.2/24,MAC 地址就不行了,需要 IP 地址起作用了。

網絡設備的狀態標識 解析完了 MAC 地址,我們再來看 <BROADCAST,MULTICAST,UP,LOWER_UP>。這個叫作net_device flags,網絡設備的狀態標識。

UP 表示網卡處於啓動的狀態;BROADCAST 表示這個網卡有廣播地址,可以發送廣播包;MULTICAST 表示網卡可以發送多播包;LOWER_UP 表示 L1 是啓動的,也即網線插着呢。MTU1500 是指什麼意思呢?是哪一層的概念呢?最大傳輸單元 MTU 爲 1500,這是以太網的默認值。

上一節,我們講過網絡包是層層封裝的。MTU 是二層 MAC 層的概念。MAC 層有 MAC 的頭,以太網規定連 MAC 頭帶正文合起來,不允許超過 1500 個字節。正文裏面有 IP 的頭、TCP 的頭、HTTP 的頭。如果放不下,就需要分片來傳輸。

qdisc pfifo_fast:qdisc 全稱是queueing discipline,排隊規則。內核如果需要通過某個網絡接口發送數據包,它都需要按照爲這個接口配置的 qdisc(排隊規則)把數據包加入隊列。

最簡單的 qdisc 是 pfifo,它不對進入的數據包做任何的處理,數據包採用先入先出的方式通過隊列。pfifo_fast 稍微複雜一些,它的隊列包括三個波段(band)。在每個波段裏面,使用先進先出規則。

三個波段(band)的優先級也不相同。band 0 的優先級最高,band 2 的最低。如果 band 0 裏面有數據包,系統就不會處理 band 1 裏面的數據包,band 1 和 band 2 之間也是一樣。

數據包是按照服務類型(Type of Service,TOS)被分配多三個波段(band)裏面的。TOS 是 IP 頭裏面的一個字段,代表了當前的包是高優先級的,還是低優先級的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章