網路的層級
最底層:最後會透過一些實體的東西(例如:我的電腦連接到數據機的網路線、中華電信的海底電纜)把資料傳到 server 去
往上一層:作業系統:如何去包裝我的 request、如何加上目的地的 IP 位置
OSI 模型
在網路中,有一個協議叫做「OSI 模型」,又稱為「OSI 七層網路架構」:
有一個組織,把網路標準化,把網路分成七個層級,每一層都負責不同的事情
但是,因為這個 OSI 模型偏理論且太複雜,
因此當我們在實作時,都會去參考另一個模型叫做「TCP/IP」,只會有四層而已
TCP/IP 模型
TCP/IP 模型的四層,分別是:
- 應用層
- 傳輸層
- 網絡層
- 網絡接口層
下面是「OSI 模型和 TCP/IP 模型的對照圖」,可以看到:
TCP/IP 模型其實就是 OSI 模型簡化後的版本,兩個模型提出的目的都是要幫網路分層,來解決網路的一些問題
TCP/IP 模型可以做什麼呢?
參考資料 鳥哥的 Linux 私房菜
在 TCP/IP 模型中,每一層都有相關的通訊協定
協定是有分層的,好處是:只要處理那一層的問題即可,不用去管其他層在做什麼
HTTP 是建立在 TCP 上面,
TCP 又是建立在 IP 上面 (IP 的全名是「Internet Protocol」)
對應到傳紙條故事:
- HTTP 就是「訂便當協定」、FTP 就是「訂飲料協定」
- TCP 就是「三次連接的協定」(確保雙方都能正常收發)
- IP 就是「傳紙條的協定」
「訂便當協定、訂飲料協定」都是建立在「三次連接的協定」上面,
「三次連接的協定」又是建立在「傳紙條的協定」上面
IP 地址
IP 的全名是「Internet Protocol」,就是「網路協定」
IP 這個協定有分為兩個:
- IPv4(Internet Protocol version 4),例如:
192.0.2.235
- IPv6(Internet Protocol version 6),例如:
2001:0db8:86a3:08d3:1319:8a2e:0370:7344
IPv6 主要是為了解決 IPv4 位址枯竭的問題(因為 IPv4 只有四個位數,很快就用完了)
IPv4 和 IPv6 最主要的差異就是:
IP 位置的格式不同
虛擬 IP、浮動 IP 與固定 IP
打開我的電腦中的網路偏好設定,可以看到:
Wi-Fi 已連接到 192.168.0.16 這個 IP 地址
但是,其他人並無法透過 192.168.0.16 這個 IP 地址連到我的電腦
原因是:這個是在內網裡面的虛擬 IP
IP 有分不同類型,下面會介紹 IP 的不同類型以及用途
固定 IP
這是最理想的情況:
一台電腦就是一個 IP 地址
因此,我只要有某人的 IP 地址,我就可以連到他的電腦,每一台電腦都可以“直接的”互相連線
這樣的 IP 地址叫做「固定 IP」:
- IP 不會變
- 每台電腦彼此都可以互相直接連線
例如:
哪裡會有固定 IP 呢?
- 每台 server 都會有一個固定 IP
浮動 IP
每次連接到網路的時候,我的電腦的 IP 位置都會不一樣
為什麼要有浮動 IP 呢?
原因一:
一般用戶根本就不需要有固定的 IP 位置,就算有朋友要跟我連線,這次的 IP 地址跟上次不一樣也沒關係,就把現在的 IP 地址貼給他就好
因此,電信商就可以節省資源,不需要每個用戶都特別給他一個固定 IP
只需要給數據機一個固定 IP 即可
原因二:
如果被駭客知道了我的 IP 位置也沒關係,因為下次我再連線時,IP 位置又會不一樣了,因此駭客無法攻擊我
內網與外網
因此,網路會是像下圖這個樣子:
此模型可以應用在家中:
我家有三台電腦,每台電腦都有一個「虛擬 IP」,
什麼是「虛擬 IP」?
通常,虛擬 IP 會是 192.168 開頭,或是 10 開頭
「虛擬 IP」只存在「內網」裡面,只有連線到同一個 wi-fi(在這個內網裡面)的電腦,可以互相連接到彼此的虛擬 IP
從外面(我朋友家)是無法連到這個虛擬 IP 的(找不到這個地址)
在不同的內網,虛擬 IP 是可以重複的
例如:
在我家,我連到 wi-fi 時,我的 IP 是 192.168.0.20
在小明家,小明連到 wi-fi 時,小明的 IP 也可以是 192.168.0.20
整個內網,會有一個對外的 IP (可能是固定或浮動的)
要怎麼找到我的對外 IP 地址呢?
可以利用一些服務,例如:ExpressVPN,就可以看到這個對外 IP 地址了
當 server 看到我連線時,只會看到我的對外 IP 地址,並不會看到內網的虛擬 IP
也就是說,對 server 來說,家裡的三台電腦都會是同一個 IP 地址
此模型也可以應用在公司
公司會鎖 IP 位置:
為了確保資安,公司會列出一個白名單:只有這些 IP 可以連到我公司的網路
如果公司內每個人對外的 IP 都不同,那就要設定一大堆白名單
因此,公司對外會有一個固定的 IP
但是在公司內網裡面,每個員工都有不同的虛擬 IP
因此,兩個同樣的 IP 並不代表一定是同一台電腦,有可能是兩台電腦在同一個內網底下,所以有同樣的「對外 IP」
虛擬 IP 要怎麼連接到網路?
以上圖的模型為例,流程如下:
假設,我現在要從我的電腦連到 google.com
從 google.com 的角度來看,只會看到數據機的 IP(20.46.77.58),因此回傳的 response 都只會到 20.46.77.58 這個對外 IP(google.com 完全不知道內網裡面有這些虛擬 IP)
數據機收到 response 後,會知道是我發出的 request,數據機就會把這個 response 再傳給我
對內網裡面的電腦來說,也只看得到數據機,所收到的 response 都是從數據機傳來的
Port 的作用
Port 的繁體中文翻譯是「連接埠」,在中國又稱為「端口」
什麼是 port 呢?
要發送 request,必須先有對方的地址
假設,我現在要發送一個 request 到 12.20.77.60 這個 IP 地址去
可是,一台電腦上有提供各式各樣的服務,例如:
- HTTP 的服務
- 信件收發的服務
那我要怎麼讓對方知道我需要哪個服務?
因此,我必須在 IP 後面加上一個 : port 代碼
,代表「我要發送 request 到哪一個 port」,一個 port 就會對應到一個程式
不同的 port 代碼就是為了要讓我們區別「在同一台電腦上的不同服務」
如果有程式在監聽 80
這個 port 的話,就會收到這個 request
常見的 port
以下三個服務都各自有不同的 port
HTTP 80
在連線到 HTTP 時,如果沒有打冒號的話,預設就會是HTTP 80
(因為80
是 HTTP 這個服務在用的 port)HTTPS 443
FTP 21
例如:
https://github.com/Lidemy/mentor-program-4th 這個網址的 IP 地址,在最後面就會加上 :443
,也就是 HTTPS 這個服務所用的 port
自己測試常用的 port
因為很多的 port 都已經有其他服務在用了,我們不能拿來測試,
因此,當我們自己在測試時,常用的 port 就是 3000, 4000, 4001, 8000, 8080 這些比較冷門的 port
TCP 與 UDP
參考資料 網際網路協議
「TCP 與 UDP」就是在 TCP/IP 模型中的「傳輸層」的兩個協議
TCP (可靠連線)
TCP (Transmission Control Protocol) ,是採用「三次握手」的確認機制,來確保雙方都能正常收發(有可靠的連線)
大部分在應用層的服務,例如 HTTP, FTP 都是建立在 TCP 上面,就是因為 TCP 可以保證有可靠的連線
當我需要連線的可靠性時,就會使用 TCP
UDP (快速、即時)
UDP 注重的是「即時、快速」,不在乎對方有沒有收到,因為每隔幾秒就會傳回一次 response,就算有幾次沒收到也沒關係,這時就會採用 UDP 這樣的傳輸協定
例如:視訊的服務,偶爾丟了一兩個封包沒關係(因為在畫面上根本感覺不出來,可能只是零點幾毫秒的頓一下),但要求速度要快,不能 lag
當我需要快速的連線時,就會使用 UDP
淺談三次握手
TCP 是一個可靠的協定,是因為它在連接時,會有一個「三次握手」的流程,透過「三次握手(Three-way Handshake)」(每一次都會傳送一個封包)來確保連接的可靠性
- 第一次:確認 server 可以接收
- 第二次:確認 client 可以發送、接收
- 第三次:確認 server 可以發送
圖片來源 傳輸控制協定
總結
網路會分成四層,
從上到下就是「送出 request」的過程
從下到上就是「回傳 response」的過程
應用層
HTTP/FTP 協定,可以想成是「紙條上的內容」:有可能是訂便當、訂飲料、借籃球等等
傳輸層
在傳輸層,可以選擇「我要怎麼傳輸」
- TCP: 傳紙條時的三次確認(是比較可靠的傳輸方式)
- UDP: 不會做「確認」的動作,就一直傳紙條(是比較快的傳輸方式,但不保證可靠)
無論選擇哪種傳輸方式,最後都會到 IP 這層
網絡層
要寫上 IP 地址
實體層
透過實體的網路電纜、海底電纜,把 request 傳送到 server 或是從 server 傳回 response