Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
gracekrcx opened this issue Oct 19, 2019 · 2 comments
Open

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

gracekrcx opened this issue Oct 19, 2019 · 2 comments
Labels
NET101 NET101

Comments

@gracekrcx
Copy link
Owner

gracekrcx commented Oct 19, 2019

『網站』的背後是什麼?

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
Copy link
Owner Author

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

@gracekrcx gracekrcx added the NET101 NET101 label Jun 12, 2020
@gracekrcx
Copy link
Owner Author

gracekrcx commented Jun 23, 2020

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 背後的功臣

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
NET101 NET101
Projects
None yet
Development

No branches or pull requests

1 participant