gracekrcx / weekly-notes

4 stars 0 forks source link

[2019-10-19] 網路基礎概念 - 2 #12

Open gracekrcx opened 4 years ago

gracekrcx commented 4 years ago

『網站』的背後是什麼?

server(伺服器)

  1. browser 發一個 request 給 server --> server 處理之後 --> 再發一個 response 給 browser --> browser 再解析出來

  2. 伺服器:一台電腦,有裝伺服器程式,專門處理 request, response


為什麼我們需要協定(protocol)

通訊協定(Communications Protocol,也稱傳輸協定)

網路傳輸協定(Internet Communication Protocol)

  1. 協定就是一個標準,統一的格式,可以以規模化
  2. 協定是為了讓彼此可以溝通所建立的規範

網路是如何傳輸的

  1. 網路是如何傳輸的,OSI 七層協定
  2. 實體層(physical):0 與 1 的位元資料,使用網路電纜傳輸
  3. 應用層(application): browser, ptt

img


由上到下:從 HTTP 協定開始講起

  1. 前端和後端在溝通時,就是透過 HTTP (HyperText Transfer Protocol) 超文本傳輸協定
  2. HTTP是一個用戶端(client)和伺服器端(server)之間請求和應答的標準

令人討厭的 HTTP request 的一生

  1. browser 傳送 HTTP request 到 server (browser -> 製造 request -> 傳給 server)
  2. server 回傳一個 response (server -> 處理 -> 傳 response 回來)

計程車司機:DNS Server

  1. 網路世界傳東西需要寫明 IP 位置,但很多時候我們寫網址
  2. 所以需要一個機制讓網址轉換成 IP 位置:Domain Name System (DNS) Server
  3. /etc/hosts 定義某個 domain name 指向 某一個 IP 設定: 127.0.0.1 github.com browser 在解析 domain 時,就會優先讀取這個檔案的設定把 github.com 導去 127.0.0.1 (原本要導去 aaa.com 的 request 你可以藉由 本地端 設定 hosts 導去別的 IP 位置)

瀏覽器只是另一個程式

  1. 脫離 browser 還是可以發一個 request 還是可以得到 response

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

TCP/IP 是什麼?

  1. 網際網路協議(Internet Protocol Suite,縮寫IPS)是一個網路通訊模型,以及一整個網路傳輸協定家族,為網際網路的基礎通訊架構。它常被通稱為TCP/IP協定套組(TCP/IP Protocol Suite,或TCP/IP Protocols),簡稱TCP/IP。
  2. TCP/IP 是網際網路協議中,兩個核心協定:TCP(傳輸控制協定)和IP(網際網路協定),為該家族中最早通過的標準。
  3. TCP/IP 提供了點對點連結的機制,將資料應該如何封裝、定址、傳輸、路由以及在目的地如何接收,都加以標準化。
  4. 它將軟體通訊過程抽象化為四個抽象層,採取協定堆疊的方式,分別實作出不同通訊協定。
  5. 協議是有分層的,各個協議處理自己需要處理的事情

實現

如今,大多數商業作業系統包括TCP/IP棧並且預設安裝它們,對於大多數用戶來說,沒有必要去探求它們如何實現。TCP/IP包含在所有的商業Unix和Linux發布包中,同樣也包含在Mac OS X、Windows系統和Windows Server中。 網際網路協議

HTTP 協議,是建立在 TCP 協議之上,TCP 協議是建立在 IP 協議之上

HTTP --> TCP --> IP

定飲料 --> 需三次握手 --> 傳紙條協定 定 NBA 即時戰況 --> 不需三次握手 --> 傳紙條協定

TCP/IP (圖片來源:鳥哥的 Linux 私房菜)

img

TCP/IP 模型分層

  1. application layer:(紙條上的內容)
  2. transport layer : TCP, UDP
  3. internet layer : IP (收件人寄件人)
  4. link layer(實體層):(郵差)

TCP 與 UDP

TCP : 是一種連接導向的、可靠的、基於位元組流的傳輸層通訊協定 UDP : 一旦把應用程式發給網路層的資料傳送出去,就不保留資料備份(所以 UDP 有時候也被認為是不可靠的資料報協定),追求快速

TCP 為什麼可靠?

三次握手 (three way handshake)

IP 地址 (Internet Protocol Address)

  1. IP位址分為 IPv4 與 IPv6 兩大類

固定 IP、浮動 IP 與虛擬 IP

  1. 固定 IP:不會變動,可直接打固定 IP 連到這台電腦
  2. 浮動 IP:今天的 IP 位置,和昨天會不一樣
  3. 虛擬 IP(內網 IP):
    1. 可以想成在同一個 wifi 底下(同一個網路底下)
    2. 家裡的 wifi 機器連了 3 台電腦,這 3 台電腦都有自己的內網 IP(虛擬 IP),他們對到的對外 IP 是同一個(可能是浮動 IP 或是固定 IP)。我家的內網 IP,可以跟你家的內網 IP 一樣
    3. 可以透過 IP 連到別人的電腦

虛擬 IP

規劃 IP 時已經預留了三個網段的 IP ,做為內部網域的虛擬 IP 之用。這三個預留的 IP 網段分別是: A Class:10.0.0.0 - 10.255.255.255 B Class:172.16.0.0 - 172.31.255.255 C Class:192.168.0.0 - 192.168.255.255

虛擬IP

Port 的作用(連接埠、端口)

  1. 一台電腦上可以有很多服務(HTTP 服務,mail 服務)
  2. 如果有程式在監聽那個 port就會執行任務
  3. 電腦之間依照網際網路傳輸層 TCP/IP 協定的協定通信,不同的協定都對應不同的埠。This is a list of TCP and UDP port numbers used by protocols of the Internet protocol suite for operation of network applications.

常用 Port

  1. HTTP 80
  2. HTTPS 443 (:443 就是 HTTPS 用的 port)
  3. 21/TCP,UDP : FTP
  4. 22/TCP,UDP : SSH(Secure Shell)

API (Application Programming Interface) 應用程式介面

  1. 透過這個『介面』來溝通
  2. 提供一個介面讓誰誰誰來拿資料
  3. 舉例:知道這台電腦的網路狀況? --> 作業系統有提供一個 api 讓你知道網路狀況,所以你就去呼叫這隻 Api 得到你要的資料
  4. 透過 API 可以讓雙方交換資料

Web API

Web API => HTTP API 透過 HTTP 協定的 API

SDK (Software Development Kit)

東西都包裝好了,可以直接 call function 用 例如:twitter.getTimeline() 如果沒有 SDK 就需要用 HTTP request 的方法去拿到資料


資料格式的選擇

歷久不衰 XML (Extensible Markup Language)

  1. Markup Language 標記語言
    <name>Tim</name>
    <age>25</age>

    name 的欄位中,資料是 “Tim”。

JSON 資料格式 (JavaScript Object Notation)

透過網路交換資料

第一種方式:SOAP

  1. 透過 XML

第二種方式:SOAP 以外的 HTTP API

RESTful 到底是什麼?

  1. 一種『風格』一種建議

第 n 種方式:跳脫 HTTP 的限制

HTTP 只是一個 protocol,除了 HTTP 以外,有其他的 protocol 也在進行資料交換的動作

curl(基於網路協定,對指定URL進行網路傳輸)

// 發一個 request 去 google
curl https://www.google.com  

// 只要 header 資訊
curl -I https://www.google.com  
HTTP/2 200
expires: -1
cache-control: private, max-age=0
content-type: text/html; charset=ISO-8859-1

// 發一個 POST
curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz"}' \
  http://localhost:3000/api/login

-X/--request [GET\|POST\|PUT\|DELETE\|PATCH]  使用指定的 http method 來發出 http request
-H/--header 設定 request 裡所攜帶的 header
-i/--include 在 output 顯示 response 的 header
-d/--data 攜帶 HTTP POST Data 
-v/--verbose 輸出更多的訊息方便 debug
-u/--user 攜帶使用者帳號、密碼
-b/--cookie 攜帶 cookie(可以是參數或是檔案位置)
curl -H 'Authorization: Basic YWRtaW46YWRtaW4xMjM=' \
-H 'origin: lidemy.com' \
-i https://lidemy-http-challenge.herokuapp.com/api/v3/deliver_token

HTTP/1.1 302 Found
Server: Cowboy
Connection: keep-alive
X-Powered-By: Express
Content-Type: text/plain; charset=utf-8
Location: /api/v3/stopover
Vary: Accept
Content-Length: 38
Via: 1.1 vegur
// twitch
curl -H 'Accept: application/vnd.twitchtv.v5+json' \
-H 'Client-ID: uo6dggojyb8d6soh92zknwmi5ej1q2' \
-X GET https://api.twitch.tv/kraken/users?login=dallas,dallasnchains

How do I POST JSON data with Curl from a terminal/commandline to Test Spring REST?

nslookup

解析 domain 的 IP 位置

nslookup google.com
$ nslookup          <==進入 nslookup 查詢畫面
> 120.114.100.20    <==執行反解的查詢
> www.google.com    <==執行正解的查詢

ping

測試可不可以連接到那台 server,會持續送封包

ping google.com

telnet

ping 一個指定的 port,測試這台 server 有沒有開這個 port

telnet 127.0.0.1 80
telnet 127.0.0.1 443

資源引用: reqres.in Linux Curl Command 指令與基本操作入門教學 如何生动形象、切中要点地讲解 OSI 七层模型和两主机传输过程? TCP 三向交握 (Three-way Handshake) 通俗大白話來理解TCP協議的三次握手和四次分手

gracekrcx commented 4 years ago

reqres.in : Test your front-end against a real API

gracekrcx commented 4 years ago

HTTPS

HTTPS : 在 應用層 跟 傳輸層 中間加了一層 SSL 加密憑證 (encryption) SSL: Secure Sockets Layer

HTTP --> SSL --> TCP --> IP

註:由於 SSL 已經不再安全,所以當我們說 SSL(比如說 SSL 憑證)時,大部分情況其實是在說 TLS。

1. HTTPS 基本採用的方案(加密後再傳輸)

  1. server 有非對稱加密的 public key S 和 private key S
  2. browser 對 server 發出請求,server 把 public key S 給 browser
  3. browser 隨機產生『對稱式加密的』private key A,然後用 server 給的 public key S 加密後傳給 server
  4. server 拿到後用 private key S 解密得到 『對稱式加密的』private key A
  5. 這樣 server 和 browser 都有了『對稱式加密的』private key A,之後雙方都用 private key A 加密解密
  6. 當雙方都確認了合法性,之後的請求會使用 session 機制

2. 此時的問題

需要解決的問題,browser 無法確認自己收到的公鑰是 server 自己給的還是『中間人攻擊』,如何證明瀏覽器收到的公鑰一定是安全的公鑰?

3. 網站去跟 CA 機構申請一個身分證

CA 機構:Certificate Authority(數位憑證認證機構)

身分證:digital certificate(數位憑證)

網站在使用 HTTPS 前,需要向“ CA機構 ”申請頒發一份數位憑證,server 把證書傳輸給 browser,browser 從證書裡取公鑰,證書就如身份證一樣,可以證明“該公鑰對應該網站”。這樣就可以解決上方的問題。

4. 如何防止數位憑證被篡改

把證書內容生成一份『簽名』,比對『證書內容』和『簽名』是否一致就能察覺是否被篡改。這種技術就叫數位簽章(数字签名)(Digital Signature)

數位簽章:

  1. 以數學演算法或其他方式運算對其加密而形成的電子簽章。
  2. 一套『數位簽章』通常會定義兩種互補的運算,一個用於簽名,另一個用於驗證。

數位簽章製作過程

  1. CA 擁有非對稱加密的私鑰和公鑰。
  2. CA 對證書明文進行 hash。
  3. 對 hash 後的值用私鑰加密,得到數位簽章。

browser 對數位簽章驗證過程

  1. 拿到數位憑證,得到(1)明文(2)數位簽章
  2. 用 CA 機構的公鑰對『數位簽章」解密,得到『明文的 hash 值』 。
  3. 用數位憑證裡的 hash 算法對『明文』進行 hash。
  4. 比較步驟 2. 的值和步驟 3. 的值是否一致

總結 server 傳送公鑰給 browser 的優化過程

server 為了得到 browser 隨機產生的『對稱式加密 key』

  1. 一開始直接傳公鑰
  2. 再來使用第三方的數位憑證(身分證)
  3. 加上數位簽章(被 hash 過後的數位憑證)

電子憑證 (來源:wiki)

參考文章:

徹底搞懂HTTPS的加密機制 [Security] SSL — HTTPS 背後的功臣