網路概論


Posted by impala8012 on 2021-01-02

網路再傳送封包時都需要

  • 寫明來源
  • 寫明目的地
  • 經過三次的前置作業,確保雙方都能收發(三項交握)
    A => B :傳送給B
    B => A :B 回應 A 收到
    A => B :把資料送過去
    三項交握

每個封包時都會有 header 跟 body,我們會設定封包 header 的狀態碼標準化
以課程的例子


我們設定封包內的資訊

從訂便當中學會封包因此用封包來解釋protocal
主要需要

  • 標準化內容格式
  • 分為 header 跟 body
  • 用狀態碼標準化結果
  • 用動詞標準化動作


依據每個封包會有不同的服務,再根據不同的服務把封包傳送

根據不同的服務,可以有不同的格式

像是有些封包是即時性的,不需要做確認,只需要一職傳送即可,送丟沒關係,主要考輛是速度=>這是所謂的UDP封包

Protocal (例如HTTP協定)

協定是一個標準,可以統一格式進而規模化。

HTTP

HTTP是一個超文本協定,他是一個全球資訊網的資料通訊的基礎

假設我們有兩端,客戶端(電腦、瀏覽器)跟 server (伺服器)端

  1. 瀏覽器傳 HTTP request 到 server
  2. server 回傳一個 response (只有瀏覽器看得懂)
    瀏覽器 -> 送出 request -> 傳給 server
    server -> 處理 -> 傳 response 回來

DNS

如果我們要傳送封包時,要給IP位址,才能實際傳送封包,然後我們是透過Domain Name Server (DNS) 來得知 IP 位址

透過DNS 把 domain name 跟 IP 位置的轉換
在mac nslookup 來查詢IP位址
自己電腦的local host: 127.0.0.1

瀏覽器其實也是程式的一種,其實不用瀏覽器的話,我們也可以得知那些資訊,瀏覽器只是幫助我們處理那些事情 => 利用 node.js的一個 library-request。我們可以透過request 得到 server 回傳的 response 的內容 (error, status, body)

而 request 和 respone 都會有 header 以及 body。 Header 主要放一些額外的資訊,而body 放的是主要內容。 分別帶著不同的資訊

HTTP Method

GET / POST

在 HTTP request 裡面的動作。
GET: 拿資訊,沒有request body
例如: HTTP 發一個 get request 到 server,server回傳一個 response,發送一個圖片回來
POST:輸入資訊,有request body
例如: HTTP 在一個登入帳號的頁面發一個 post request 到 server,server 回傳結果回來
而 POST 的 request body 裡面放著登入的資訊

其他的 HTTP Method

HTTP method
HEAD方法請求與 GET 方法相同的回應,但它沒有回應主體(response body),主要應用在只想要知道 response 的資訊
PUT 改變資源並取代原本整個內容,未更動的也會被取代掉
PATCH 與 put 相似,但只更改部分內容,原本未更動到的也還在
DELETE 刪除資源

常見的 HTTP Status code 狀態碼

HTTP Status code

2xx成功

200 OK: 請求已成功,請求所希望的回應頭或資料體將隨此回應返回。
204 No Content: 發生於可能我們 Delete 資源成功但回傳 204,可能沒有額外的資源可以說

3xx重新導向

301 Moved Permanently: 永久移到其他的位置
假如我們 Get a.com 這個位置
回傳的狀態是 301 位置是 b.com,而當我們下次再 Get a.com 時,瀏覽器會自動幫我們導到b.com的位置
問一次即可,下次就會自動導入到更改的位置
302 Found: 暫時移到其他的位置
而 302 暫時的,以剛剛例子來說,瀏覽器還是會在問一次要去哪裡諈後才會到b.com裡面

4xx客戶端錯誤

404 Not Found: 這是我們常見的錯誤的狀態碼之一,請求失敗,請求所希望得到的資源未被在伺服器上發現,但允許使用者的後續請求。

5xx伺服器錯誤

500 Internal Server Error: 伺服器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。沒有給出具體錯誤資訊。
502 Bad Gateway: 作為閘道器或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的回應。

實作一個簡易 HTTP Server

我們可以利用node 內建的 "http" library,根據url來決定我們要改什麼樣的 response ,並且提供一些 header 和 status code

var http = require("http");

var server = http.createServer(handleRequest);
function handleRequest(req, res) {
  console.log(req.url);
  if (req.url === "/") {
    res.write("Welcome");
    res.end();
    return;
  }
  if (req.url === "hello") {
    res.write("hello");
    res.end();
    return;
  }
  if (req.url === "/redirect") {
    //瀏覽器會自動幫你轉址到該去的位置
    res.writeHead(302, {
      Location: "/hello",
    });
    res.end();
    return;
  }

  res.writeHead(404);
  res.end();
}

server.listen(5000);

TCP/IP

在網路裡面,一共有分成 7 層,並且每一層都負責不一樣的事情

圖片取自鳥哥鳥哥的 Linux 私房菜
而如果在TCP/IP時 只有四層
應用層 Application : HTTP, HTTPS, FTP,DNS …
傳輸層 Transport : TCP, UDP
網路層 Internet : IPv4, IPv6
鏈結層 Network Access : 乙太網路、Wi-Fi

目前主流來說是以TCP/IP的模型
HTTP 建立在 TCP 上面 ,而 TCP 建立在 IP 上面

圖片取自鳥哥鳥哥的 Linux 私房菜

IP

IP地址的協議又分為 IPV4/IPV6,而其中主要的差別在於IP的地址的不同
每一台電腦都會有一個固定 IP,電腦只會認得由 32 位元所組成的 IP 位址
但除了固定 IP 外,我們每次連接時都會有不一樣的 IP,而那就是浮動 IP,但別人依舊可以連到那個位置。
浮動 IP 好處:假如有一個駭客要攻擊你,但他無法知道你下一次的 IP 位置,因此大部分蠻多的用戶都是浮動IP


裡面的電腦一到電腦三,彼此可以連接彼此,他們在一個內網裡面皆為虛擬 IP,而在公司裏面,會址提供部分的名單可以連接到自家的網路,公司對外有一個固定IP,但對內員工有許多不同的內網 IP。
以虛擬 IP 來說,假如我們要發出一個 request 到 google 的話,對外 google 只看得到數據機給的固定 IP,然後把 respond 回傳回來後,再經由數據機把資料回傳進來。所以彼此中間透過數據機來傳輸

虛擬IP好處: 電信商不用在特定分配一個IP 給每一個人,址需要分配給數據機皆可
通常 192.168.x.x 或者 10.0.x.x 都是虛擬IP,意思是說外面的人連不到這裡面的內網IP

Port 連接埠(端口)

當我們要把資料傳送到一個IP地址時,我們需要給他們特定的port,讓他們傳送到特定的程式
例如: 12.20.77.60:80

常用的 Port

HTTP: 80 預設
HTTPS: 443
FTP : 21
如果再測試的時候,常用的Port有: 3000, 4000, 8080, 8000

TCP 與 UDP

TCP/UDP 兩個位於傳輸層裡面,TCP為一個可靠的連結(三項交握)而 HTTP/FTP接建立在 TCP 上面。
UDP 就像是直播或是視訊,需要的是快速,不在乎對方有沒有收到,偶爾丟一兩個封包沒關係。

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

當我們需要從對方存取某個資料的話,需要透過 API 提供一個介面來讓我們存取,而對方可以控制介面那些資料可以給我們那些不行
API 就像是接收要求的信差,然後告訴系統你要什麼,系統再把回應送回給你

例如: 要怎麼知道網路狀況 => 可以利用作業系統提供的 API 來呼叫
例如: 讀取檔案 => 也是依靠底層作業系統提供的 API
例如: 拿到FB的好友資料 => 串接 FB 的 API
例如: 別人如何在我這裡新增資料 => 提供給別人新增資料的API
因此我們可以得知,透過API可以讓雙方交換資料

API 與 Web API

Web API 是透過 HTTP 協定的 API,我們會發出 request 後得到 對方的 response

SDK: software development kit(把所有的東西都包裝好)

串接API

附註: 要記得先安裝request npm i request

const request = require("request");
const process = require("process");

console.log(process.argv);
request("https://reqres.in/api/users/" + process.argv[2], function (
  error,
  response,
  body
) {
  console.log(body);
});

How to make HTTP Requests using Node.js Request Module
The Node.js Request Module

純文字與自定義格式

用純文字的好處就是可以定義任何想要的格式但壞處也是相對要怎麼處理這格式

狀態: 良好
沒其他社情
if(Response.body.indexOf("狀態:良好") >=0) {
  ...
}

但一般來說我們會利用XML或者JSON

XML (Extensible Markup Language)

長相與HTML類似,利用標籤的形式不過近年來用JSON比較多

JSON(JavaScript Object Notation)

是一個資料格式,一個基於 JS 物件產生的資料格式,目前看到的資料格式型態都是以 JSON 為主,而且大小又比 XML 小,此外在任何一個程式語言內都可以使用他

const request = require("request");
const process = require("process");

console.log(process.argv);
request("https://reqres.in/api/users/" + process.argv[2], function (
  error,
  response,
  body
) {
  const json = JSON.parse(body); // 回傳一個JSON 格式的字串 轉回成一個JS 的物件
  console.log(json); // 我們可以讀取我們想要的資料了
  console.log(json.data.first_name);
});

const obj = {
  name: "hule",
  job: "none",
};

console.log(JSON.stringify(obj)); // 把obj物件變成JSON格式的字串

SOAP(Simple Object Access Protocol)

Protocol就是一個定義資料交換的格式
SOAP的資料交換都是偷過XML,不過目前已經很少用了
node.js有一個SOAPlibrary

RESTful

是一個風格,並非一個協定

刪除用 Delete 是一個習慣但不是規範,並沒有明確規定依定要用 Delete ,所以其實也可以全部都用 POST ,但會造成困擾

因此 RESTful 創造出一個風格,讓我們好使用 HTTP 給的規格

只要符合 RESTful 風格的,我們都會叫他 RESTful API,目前大多數都是屬於 RESTful API ,把網址還有動詞都有個建議的規範在

拿資料 : GET

API 串接

按照對方一球的格式,丟出一個 request ,根據 response 回來做事情
但我們要注意每個格式,例如UDP格式,或者HTTP格式。因此我們也可以自行根據不同的 Protocol 定義 API 的格式

curl

發一個get 的 request 到我們想要的網址去,並得到 response
指令 curl 網址 > name.html 就可以把裡面的內容下載成HTML黨,然後再開啟就會是我們想要的頁面
curl -I 網址 只要該網址的header,不需要body

ping : 利用丟封包的方式來測試可否連到該網址
telnet: ping 一個指定的port 來看該port 是否開啟,或者用來拿資料
telnet 網址 80 看是否有連到80 port
ptt 就是基於 telnet的協定而製作出來的,預設的 port 為 23

CRUD
C (CREATE) : 新增,對應的就是 POST
R (READ) : 讀取,對應的 GET
U (UPDATE) : 對應的是PUT/PATCH,更新,把原本的資料作修改
D (DELETE) : 對應的就是DELETE,刪除

說明 Method path 參數 範例
回傳所有餐廳資料 GET /restuarants _limit:限制回傳資料數量 /restuarants?_limit=5
回傳單一餐廳資料 GET /restuarants/:id /restuarants/1
刪除餐廳 DELETE /restuarants/:id /restuarants/4
新增餐廳 POST /restuarants name: 餐廳名
更新餐廳 PATCH /restuarants/:id name: 餐廳名

#HTTP #week4 #Network #TCP/IP







Related Posts

for...in、for...of

for...in、for...of

Python Table Manners - pre-commit: git commit 前做完檢查

Python Table Manners - pre-commit: git commit 前做完檢查

製作 Figma Plugin

製作 Figma Plugin


Comments