網路的層級
最底層:最後會透過一些實體的東西(例如:我的電腦連接到數據機的網路線、中華電信的海底電纜)把資料傳到 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 443FTP 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


