由下到上:從 TCP/IP 開始談起


Posted by saffran on 2021-02-06

網路的層級

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


#Network







Related Posts

DJI Tello 的基礎操作與套件

DJI Tello 的基礎操作與套件

Reactive Programming 簡介與教學(以 RxJS 為例)

Reactive Programming 簡介與教學(以 RxJS 為例)

Day06:從經典案例看 bytecode

Day06:從經典案例看 bytecode


Comments