進位制的原理非常簡單
一個 進位代表著使用 個數字來代表一個數
而每位數字都是 的冪次方
以一般的使用的十進位為例
87 這個數字可以被拆成
二進位是在電腦實際在運算時使用的進位系統
只使用 0 跟 1 來表示
87 在二進位中等同
在分析網路或是逆向工程時,我們常用的進位制反而是十六進位
由於我們只有 10 個數字無法呈現十以上的數值
所以使用 A~F 來分別代替 10~15
87 在十六進位中等同
什麼是網路?
通俗的來講
網路就是拿網路線插一插就形成一個網路了
在很久以前
網路是各家資訊公司自己推出的一套硬體
所以每個公司之間的溝通十分麻煩
要有各種軟體在進行每個硬體技術間的轉換
因為這樣的制度實在是很困擾
於是各方大老就共同制定了一項 IEEE 802.3 標準
也就是現在比較會聽到的 乙太網路
在最早期的乙太網路標準 802.3 的 IEEE 10BASE5
網路傳輸的速度被規定在 10Mbps
也就是 10 M bits per second
1 個字母 = 1 byte = 8 bits
1 Mb = 1024 Kb = bits
更後期的 IEEE 100BASE-T
不僅把速度提昇至 100Mbps
更支援了星狀網路
不用再把每一台裝置都各自連起來了
vs
網際網路服務供應商(?)
以台灣來說的話最熟的就是種花電信
對外電纜也基本上都是種花的
OSI 七層模型 | 大致功能 |
---|---|
第7層 應用層 | 應用程式 |
第6層 表達層 | 轉換資訊 |
第5層 會議層 | 建立網路連線 |
第4層 傳輸層 | 資料傳輸及控制 |
第3層 網路層 | 定義網路路由及定址功能 |
第2層 資料連結層 | 在網路之間建立邏輯連結 |
第1層 實體層 | 網路(物理) |
每張網路卡在出廠的時候就被設定了一張身份證
也就是所謂的MAC address
MAC address 共有 6 bytes
分別由 00:00:00:00:00:00 到 FF:FF:FF:FF:FF:FF
有了 MAC,我們就可以分辨出每台電腦了
那要怎麼在網路上知道那台電腦的位置呢?
如果說 MAC address是電腦的身分證的話
那 IP address 就像是一台電腦的地址
而他的格式會長的像這樣
11000000.10101000.00000001.00000001
嘿嘿 事實上 在電腦裡才會長那樣啦
如果轉換成十進制的話會長得像
192.168.1.1
而每個欄位的範圍是從0~255
也就是 0.0.0.0 ~ 255.255.255.255
若是以這樣來規範的話, 總共的 IP 位址只有
約四億個 IP 位址在好幾十年前以為非常夠,但到如今卻發現完全不夠用
於是人們想出了兩種方法,一種是動態 IP,另一種是 IPv6
原本的 IP 則被稱為 IPv4
IPv6 從原本的 4 個 byte 擴展成了 16 個 byte
2001:0db8:02de:0000:0000:0000:0000:0e13
也從原本十進位表示改成了十六進位
若有一個以上的連續位元為 0,則可以使用雙引號省略
2001:0db8:02de::0e13
要從 IPv4 轉換成 IPv6 也非常簡單
將 IPv4 的位置轉換成十六進位,填入至最後 4 個 byte
而前面所有 byte 則變為 0,倒數第 5 跟 6 個 byte 則為 ffff
::ffff:dead:beef
在知道 MAC 與 IP 之間的關係後,就會自然而然地想到一個問題
我們要怎麼把這兩個東東對應起來呢?
這時候 ARP 就派上用場啦
在 command line 打上arp -a
來看看吧
剛才有說過,其實 IP 的數量是有限制的
那當然不能隨便分配啊
不然總有一天會用完的
那如果我們一個班級只有分配到一個IP的話
難道就只有一個人可以上網了嗎
如果只有public IP 要給很多人用的話
需要分配private IP給每個人
通常會是192.168.x.x
(還有10.x.x.x及172.x.x.x)
而一個一個裝置去分配IP實在是太麻煩且繁瑣了
於是 DHCP 就可以來解決這個問題了
一個裝置在發現自己沒有可用的 IP 的時候,會在廣播裡喊出 DHCPDISCOVER
當有 DHCP server 看到之後,會跟該裝置發一個 DHCPOFFER 並帶上提供的 IP 位址
裝置接受到之後,會向廣播再喊 DHCPREQUEST 告訴 DHCP server 我接受這個 IP 了 並發出一個 arp 封包 避免有人的ip跟他重複了
DHCP server 接收到 request 之後 會發出一個 DHCPACK
結束這整個要 IP 的過程 並把 IP 及 MAC 的對應記下來,以便下次可以直接找到
如果剛剛有用 Wireshark 看到 arp 封包的話
可能會看到有裝置在跟 router 的 DHCP server 要IP之後發了一個arp封包來確認沒有跟別人重複
看到這裡你可能會想說
誒? 我平常上網的時候也沒有看到這些什麼IP的啊
那我是怎麼知道這些電腦的地址的
這時候 你就需要去了解一下DNS的東東了
在電腦世界中 用數字代表一個東西是再平常不過的了
但是人類對於記憶這個東西就不太擅長
我們比較偏好於用可以理解的詞語去記憶
像是我們的系網 www.cse.ntou.edu.tw
就是一些有意義的詞語組合而成的
這就稱為Domain Name
而要怎麼從Domain Name轉換到實際的IP呢
DNS Server就是專門做這件事的
他會先從快取中看看有沒有人曾經存取過這個網站,如果有的話就直接回應client快取中的IP
而如果沒有從快取中得到IP的話,則會把Domain Name以點拆開,從最後一個讀起,一個一個伺服器問到實際需要的網址
例如我們的系網:
透過 dig
或是 nslookup
來觀察 DNS query
TCP/IP & UDP/IP | 對應OSI的哪些層 |
---|---|
第4層 應用層 | 應用層 表達層 會議層 |
第3層 傳輸層 | 傳輸層 |
第2層 網路層 | 網路層 |
第1層 資料連結層 | 資料連結層 實體層 |
如果說 Mac address 是在硬體層對應網路介面
則 IP address 則是對應主機的網路位置
而 port 則便用來對應機器上服務的位置
在 TCP 中會有稱為三項握手以及序列號等東西來確保封包傳遞無誤
若在之中有封包遺失則會讓發送者重新傳送
許多通訊協定如 HTTP、SSH 等皆基於 TCP
UDP 則不會確保封包送達,常用於一些遺失一些內容也無所謂的場景,如串流等
許多遊戲為了效率會在 UDP 之上設計自己的封包
我們在瀏覽網頁時常常會需要打上網址,而我們打上的網址其實被稱為 URL
一個 URL 的規格長這樣
一般來說我們只需要指定 protocol、hostname 以及 path 即可
Windows 可以下載 Wireshark來劫持並觀察流量
Linux 則有 tcpdump 可以使用