iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 22
1
自我挑戰組

Linux學習系列 第 22

IPv4

以下截圖來自教學
IPv4
http://www.study-area.org/network/network_ip_addr.htm
http://linux.vbird.org/linux_server/0110network_basic.php
https://zh.wikipedia.org/wiki/IPv4

IP封包的組成部份,以及各部件的長度(事實上,真正的封包是由連續的位元依序排列在一起的,之所以分行,完全是因為排版的關係):
https://s3.notfalse.net/wp-content/uploads/2017/02/27195229/ip-framentation-ex.png

Version
版本 (VER)。表示的是IP規格版本,目前的 IP 規格多為版本4 (version 4),所以這裡的數值通常為0x4 (注意:封包使用的數字通常都是十六進位的)。

Internet Header Length
標頭長度 (IHL)。
從 IP 封包規格中看到前面的6行為header,如果Options和Padding沒有設定的話,也就只有5行的長度;每行有32bit;也就是4byte;那麼,5列就是20byte了。20這個數值換成16進位就成了0x14所以。當封包標頭長度為最短的時候,這裡數值會被換算為0x14。

Type of Service
服務類型 (TOS)。這裡指的是IP封包在傳送過程中要求的服務類型,其中一共由8個bit組成,每組bit組合分別代表不同的意思:
內容為『RRRDTRUU』:
RRR:Routine。設定IP順序,預設為0,否則,數值越高越優先
D:若為0表示一般延遲(delay),若為1表示為低延遲;
T:Throughput。若為0表示為一般傳輸量 (throughput),若為1表示為高傳輸量。
R:Reliability。若為 0 表示為一般可靠度(reliability),若為 1 表示高可靠度。
UU:Not Used。保留尚未被使用。

Total Length
封包總長(TL)。以byte做單位來表示該封包的總長度,此數值包括標頭和數據的總和。就是代表封包大小,IP標準的MTU就是65535bytes,就跟Total Length有關(2的16次方-1)

Identification
識別碼 (ID)。IP袋子必須要放在MAC袋子當中。不過,如果IP袋子太大的話,就得先要將IP再重組成較小的袋子然後再放到MAC當中。而當IP重組時,每個來自同一個IP的小袋子就得要有個識別碼以告知接收端這些小袋子其實是來自同一個IP封包才行。

https://ithelp.ithome.com.tw/upload/images/20200610/20111994wMfKbuhZRe.png

Flag
旗標 (FL)。這是當封包在傳輸過程中進行最佳組合時使用的 3 個 bit 的識別記號。
這個地方的內容為『0DM』,其意義為:
0 : 保留,必須為0
D(Don’t Fragment,DF):若為0表示可以分段,若為1表示不可分段
M(More Fragment,MF):當上一個值為 0 時, 0表示此IP為最後分段,若為1表示非最後分段。
如果DF標誌被設定為1(不可分段),但路由要求必須分片封包,此封包會被丟棄。這個標誌可被用於發往沒有能力組裝分片的主機。

Fragment Offset
分割定位 (FO)。當一個大封包在經過一些傳輸單位(MTU)較小的路徑時,會被切割成碎片(fragment) 再進行傳送(這個切割和傳送層的打包有所不同,它是由網路層決定的)。由於網路情況或其它因素影響,其抵達順序並不會和當初切割順序一至的。所以當封包進行切割的時候,會為各片段做好定位記錄,所以在重組的時候,就能夠依號入座了。

https://ithelp.ithome.com.tw/upload/images/20200610/20111994I65o9nqnnu.png

所以就是IP分段要組合成原本的IP,需要:
Total Length(原本的IP的大小)
Identification(IP分段才能知道它是來自哪一個原本的IP)
Flags(知道哪個IP分段是最後一個分段,不然沒辦法確認IP分段到底到哪結束)
Fragment Offset(當要重組的時候,才能組成原本的IP,不然會把手腳顛倒)

Time To Live
存活時間 (TTL)。這個TTL的概念,在許多網路協定中都會碰到。當一個封包被賦予TTL值(以秒或跳站數目(hop)為單位),之後就會進行倒數計時。在IP協定中,TTL是以hop為單位,每經過一個router就減一﹐如果封包 TTL值被降為0的時候,就會被丟棄。這樣,當封包在傳遞過程中由於某些原因而未能抵達目的地的時候﹐就可以避免其一直充斥在網路上面。有隻叫做traceroute的程式,就是一個TTL利用實作。

Protocol
協定(PROT)。這裡指的是該封包所使用的網路協定類型。例如﹕ICMP或TCP/UDP等等。要注意的是:這裡使用的協定是網路層的協定,這和上層的程式協定(如﹕FTP﹑HTTP 等)是不同的。可以從Linux的/etc/protocol這個檔案中找到這些協定和其代號
或是維基:https://zh.wikipedia.org/wiki/IP%E5%8D%8F%E8%AE%AE%E5%8F%B7%E5%88%97%E8%A1%A8

Header Checksum
標頭檢驗值(HC)。這個數值主要用來檢錯用的,用以確保封包被正確無誤的接收到。當封包開始進行傳送後,接收端主機會利用這個檢驗值會來檢驗餘下的封包,如果一切看來無誤,就會發出確認信息,表示接收正常。

Source IP Address
來源位址(SA)。就是發送端的IP位址,長度為32bit。

Destination IP Address
目的地位址(DA)。也就是接收端的IP位址,長度為32 bit。

Options & Padding
這兩個選項甚少使用,只有某些特殊的封包需要特定的控制,才會利用到。

IP的Class概念:
二進位:
IP=XXXXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX
十進位:
IP=XXX.XXX.XXX.XXX

二進位:
如果是以“0”開頭的,這是一個A Class的IP
如果是以“10”開頭的,這是一個B Class的IP
如果是以“110”為開頭的,則屬於C Class的IP
十進位:
由 1 到 126 開頭的 IP 是 A Class
由 128 到 191開頭的 IP是 B Class
由 192 到 223 開頭的則為 C Class

A Class的IP:最前面一組數字Net ID,其餘三組Host ID
B Class的IP:前面兩組數字Net ID,另兩組Host ID
C Class的IP:前面三組數字Net ID,剩下的一組Host ID

建一個單一的 IP 網路,得分配相同的 Net ID 給所有主機,而各主機的 Host ID 卻必須是唯一的。如果網路還要連上internet 或其它網路的話,那麼使用的Net ID也必須是唯一的,也就是必需經過註冊才能獲得否則就會造成衝突了。

比如電話號碼,如果是1234567(Host ID) 的話,那麼在相同區號02(Net ID)裡,其他人將不會再使用這個號碼,然而,你不能保證在其它區號05裡面沒有1234567這個號碼﹔然而,若台北使用了區號02的話,屏東就不能使用02而必須改用其它(如08)。無論如何,整個區號加電話號碼必須是唯一的。
所以整個IP位址 (Net ID + Host ID)在 Internet上也必須是唯一的。

有一個很特別的Net ID:127 (即二進位的 01111111)是保留給本機回路測試使用的。不可以被運用於實際的網路中,其中的127.0.0.1則代表任何一台IP主機本身。

就是C:\Windows\System32\drivers\etc\hosts有個
127.0.0.1 localhost

還有一個規則我們還必須遵守的:在指定 Host ID 的時候,換成二進位的話,不可以是全部為0,也不可以是全部為 1。當 Host ID 全部為0的時候,指的是網路本身識別碼;而全部為1的時候,則為該網路的廣播位址,代表的是該網路上的所有主機。

所以當在算Net ID時,要扣掉Net ID:127
所以當在算host ID時,要扣掉2(網路本身識別碼和廣播位址)
https://ithelp.ithome.com.tw/upload/images/20181104/20111994g2Ghk8aqls.png

劃分子網路:
網路都有一定的節點極限的,比如 Ethernet通常最多只能連接1,200台主機,如果您獲得一個B Class的 Net ID,豈不是浪費很多Host ID了嗎?是使用A Class就更浪費

這時候可以用Sub-net Mask,不然預設的Host ID太多了,像是A Class就有16777214個Host ID,B Class就有65534個Host ID,所以把一些Host ID拿來當
Sub-net ID(子網路,就是原本的Net ID切割的網路),就是Sub-net Mask

範例:
IP (139.175.152.254)為例子
是屬於B class
所以預設的Net Mask是:
11111111.11111111.00000000.00000000
如果借用了Host ID的其中三個bit來當Sub-net ID的話
將原來的Net Mask和Sub-net Mask做一個 OR 的運算:
11111111.11111111.00000000.00000000
OR
00000000.00000000.11100000.00000000
得出:
11111111.11111111.11100000.00000000
所以實際的Net Mask就是11111111.11111111.11100000.00000000
十進位就是: 255.255.224.0

所以因為借用的ID有3個 bit,可以將原來的B Class網路切割為8個子網路,而Sub-net ID則分別從000到111這8個組合

本來是16個 bit的Host ID只剩下13個 bit了。也就是說:在每個子網路裡面,最多只能有2的13次方- 2 = 8,190台主機

不分等級的IP:
IP是139.175.152.254,而Net Mask則為255.255.255.0。是否用錯了net mask呢﹖
139.175.152.254是屬於b class,所以Net Mask應該為255.255.0.0,但為什麼是255.255.255.0?
Subnet-->增加net
Supernet-->增加host
所以只要Subnet或Supernet就不用管原本預設的A、B、C class了,這樣就是
不分等級 IP,所用的技術叫CIDR (Classless Inter-Domain Routing)
例如: 192.168.1.1的Net Mask是255.255.255.0,可以表示成192.168.1.1/24
如果要增加3個net,就是192.168.1.1/27
增加3個host就是192.168.1.1/21

"公共 IP" 與 "私有 IP ":
要將網路連上 Intetnet 的時候,必須先註冊好 Net ID,如果該 ID已經被使用了,就必須選用另外的 ID 了。負責 Internet IP註冊的機構叫做InterNIC (Network Information Center),他們的網路位址是http://www.internic.net 。不過,實際上的運作,一般機構或個人是不太可能直接從InterNIC上註冊 IP 的,而是經ISP分配下來。這些經過合法授權使用的 IP ,稱之為公共 IP( Public IP )

然而,由於 Internet 的爆炸性成長,IP 的位址買少見少,而且在很多機構裡,也不是所有機器都有必要使用註冊的 IP 位址。於是,就在 A、B、C 這三個層級裡面,各劃出一些位址範圍保留給私有位址所用,它們分別是﹕
10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255

所以在電腦查到的IP通常都是10.xxx.xxx.xxx或是192.168.xxx.xxx就是私有IP,而http://dir.twseo.org/ip-check.php 所查詢的就是公有IP

關於 公有IP 和 私有IP 和 Network Address Translation
https://www.youtube.com/watch?v=E8mgXJZBgg4

ISP給的IP就是Public IP address,然後這個Public IP address是給路由器,所以只要是連接路由器的裝置都是一樣的Public IP address,像是如果電腦、手機、筆電都是連同一個路由器,那這3個的Public IP address都是一樣的:
https://ithelp.ithome.com.tw/upload/images/20200813/20111994JjEzpsbaxx.png

在電腦查到的IP通常都是10.xxx.xxx.xxx或是192.168.xxx.xxx就是私有IP,不用擔心這些IP被別的伺服器使用,因為給一般人使用的伺服器不會使用私有IP,而是使用公有IP。也就是說在測試網頁伺服器的時候,IP地址如果是10.xxx.xxx.xxx或是192.168.xxx.xxx,是不用擔心連到外面世界的網路:
https://ithelp.ithome.com.tw/upload/images/20200813/20111994xnxOA306Bn.png

如圖,當一台電腦要連一個網頁伺服器時,是不能像圖片這樣從私有IP直接連到網頁伺服器。
https://ithelp.ithome.com.tw/upload/images/20181104/20111994vt9NWQtpan.png
https://ithelp.ithome.com.tw/upload/images/20181104/201119947hGvjB2tQJ.png

如圖:router會把私有IP轉成公有IP,有個NAT forwarding table紀錄,然後在連internet。
https://ithelp.ithome.com.tw/upload/images/20181104/20111994eXc28N1MeZ.png

網頁伺服器回應的時候,就會把資料傳到router
https://ithelp.ithome.com.tw/upload/images/20181104/201119943W9vX06Dfl.png

接著router的NAT forwarding table會把公有IP(12.13.14.15)轉成私有IP(192.168.1.3),這樣在整個路徑上看起來就會是40.30.20.10這個伺服器直接回應到192.168.1.3,但事實上,是先經過路由器的公有IP,再到個別電腦的私有IP
https://ithelp.ithome.com.tw/upload/images/20181104/20111994XhGcC61m9l.png

接著講到如果每個裝置都有自己的公有IP,就不用透過router的Network Address Translation,來連到internet了,但那樣是不行的,因為IPV4的位址已經快用盡了,也是因為快用盡才會有Network Address Translation。
但是如果是IPV6的話,就可以每個裝置都有公有IP,因為以地球人口70億人計算,每人平均可分得約4.86×10的28次方(486117667×10的20次方)個IPv6位址,非常多地址可以用。
https://ithelp.ithome.com.tw/upload/images/20181104/20111994OpThgaRj96.png

所以之前看過的IP:192.168.XXX.XXX、10.XXX.XXX.XXX、127.0.0.1、還有http://dir.twseo.org/ip-check.php 的ip地址,大概都知道是什麼意思了。

Network Address Translation更詳細的介紹:

https://www.youtube.com/watch?v=3mTQ8MS4Nr0
NAT分為兩種:
1 Source NAT
2 Destination NAT

1 Source NAT就是前面介紹的NAT
request:改變src的地址
response:改變dest的地址
https://ithelp.ithome.com.tw/upload/images/20200813/20111994YJy7uLoqEM.png

2 Destination NAT
就是相反,原本是從LAN request 到 WAN 的伺服器,現在是從WAN request到LAN的伺服器
所以就是:
request:改變dest的地址
response:改變src的地址
https://ithelp.ithome.com.tw/upload/images/20181104/20111994mOR3vN89ut.png

網路位址轉換(Network Address Translation,縮寫為NAT)又稱網路掩蔽或者IP掩蔽(IP masquerading)
1私有ip是路由器的NAT產生的
2預設是使用Source NAT,也可以使用Destination NAT
3常用在ipv4
https://ithelp.ithome.com.tw/upload/images/20181104/20111994aCB16HBbYd.png
有關Linux的IP Masquerade
http://www.e-infomax.com/ipmasq/howto-trans/zh/ipmasq-HOWTO-zh-2.html

接著講到NAT會改變來源端或目的端的ip位址或是port,所以一些協定會受影響,解決方法就是:
1 NAT device 增加應用層的防火牆
2 應用程式增加NAT 的適應性,像是STUN協定
https://ithelp.ithome.com.tw/upload/images/20181104/20111994McjwIDohDc.png

如圖:private ip 就是這幾個範圍,private ip可以是static或dynamic。DHCP伺服器分配private ip,路由器通常都有DHCP伺服器。
路由器有DHCP Server這項功能,也因此又被稱為「IP分享器」:
https://blog.xuite.net/arcloveangel/lovestore/19111749-%E3%80%90%E6%95%99%E5%AD%B8%E3%80%91%E8%B7%AF%E7%94%B1%E5%99%A8%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-DHCP%28Dynamic+Host+Configuration+Protocol%29
https://ithelp.ithome.com.tw/upload/images/20181104/20111994l6J8LAcwSH.png

接著講到
1IPV6就是希望每個裝置都有自己的public ip,而不用使用NAT
2然後ipv6有更簡單的方法使用類似於NAT的技術
3如果public network改變的話,像是更換ISP,IPV6不需要重新設定。
https://ithelp.ithome.com.tw/upload/images/20181104/20111994jlQtZgPhAq.png

補了一些知識,不然之前的ip位址都不知道代表什麼意義。可能有錯誤的地方。


上一篇
Linux MySQL
下一篇
Linux安裝php和關於架網站
系列文
Linux學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言