Jex’s Note

Network

Link anatomy

  • href: http://example.org:8888/foo/bar?q=baz#bang
  • protocol: http
  • host: example.org:8888
  • hostname: example.org
  • port: 8888
  • pathname: /foo/bar
  • query: q=baz
  • hash: bang

Load Balance

分幾種, 常見的是 L3, L7

L3 是 IP 層, 是以指派 IP 到後面的主機

L7 是 HTTP 層, 分析 Domain 或 Header 再指派到後面的主機, 效率較 L3 快

長連線

飽活封包底層就會做掉了, 建 socket 就會傳心跳 (habit) 給 server 確認它活著

habit 是 tcp 三項交握的 sync 封包

Keep-alive

tcp 沒有 keep-alive 一個 request 就會佔用一條通道

tcp 有 keep-alive 就多個 request 只需做一次三項交握, 都在同一條通道傳送

一個 socket 只能接一個 session, 不能一對多

HTTPS

SSL 憑證加密, 從 Header 到 Body 都是加密的

HTTP method

PUT 與 PATCH 差異

PUT 相當於是 delete + insert, 是對整個資源進行更新

PATCH 是只更新部份的資源

瀏覽器支援 PATCH, PUT 跟 DELETE 嗎?

不支援

HTML 只定義了 GET/POST,

所以 HTML Form 是沒有支援 PUT/DELETE 的

但 XmlHttpRequest (也就是Ajax) 有定義 GET/POST/PUT/PATCH/DELETE/HEAD/OPTIONS

但可以在 HTML Form 裡偷藏 _method 參數, 定義不支援的 method, 送到 server 端再判斷

Etag

第一次 : browser 對 server 發出請求, server 回應 200 ok, 並多加上 header[‘ETag’] = body 以 md5 編碼

browser 會 cache response 及儲存 Etag

第二次 : browser 對 server 發出請求並多帶 headers[‘If-None-match’] = 上面 ETag 的值, server 再算出 ETag 是否值為一樣, 一樣的話會返回 304 Not Modified

browser 收到 304 會從 cache 拿之前 cache 的結果

IP

5 個 CLASS

Class A :   0.xx.xx.xx ~ 127.xx.xx.xx       # 0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx   開頭是 0
Class B : 128.xx.xx.xx ~ 191.xx.xx.xx       # 10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx   開頭是 10
Class C : 192.xx.xx.xx ~ 223.xx.xx.xx       # 110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx   開頭是 110
Class D : 224.xx.xx.xx ~ 239.xx.xx.xx       # 1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx   開頭是 1110
Class E : 240.xx.xx.xx ~ 255.xx.xx.xx       # 1111xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx   開頭是 1111

Public & Private

Class A:10.0.0.0    - 10.255.255.255
Class B:172.16.0.0  - 172.31.255.255
Class C:192.168.0.0 - 192.168.255.255

Port

Web app 開 80 port 遇到 permission denied

只有 root 才可以開小於 1024 的 port,最簡單的解決方法就是先開一個高一點的 port (e.g. 8080),再用 iptable 去 forward 80 -> 8080

iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 1
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8181
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -m mark --mark 1 -j ACCEPT
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 8181 -m mark --mark 1 -j ACCEPT

VPN

讓 Private 可以被特定的連線操作

  • OpenVPN (SSL VPN) or IPsec
  • OpenVPN 安全性會比 IPsec 好

常用的 Http status

  • 301 (Permanent) — Redirects to the site you specified in the Forward To field using a “301 Moved Permanently” HTTP response. The HTTP 301 response code tells user-agents (including search engines) that the location has permanently moved.
  • 302 (Temporary) — Redirects to the site you specified in the Forward To field using a “302 Found” HTTP response. The HTTP 302 response code tells user-agents (including search engines) that the location has temporarily moved.
  • 200 (:ok) : ok. 常用在一般 api
  • 201 (:created) : 新增成功. 在 call create api 時回應
  • 422 (:unprocessable_entity) : Creating a new resource is not successful. create 失敗時回應
  • 204 (:no_content) : Successful responses with no content. 在 call destroy api 時回應
  • 500 : internal server errors # Rails automatically handles server errors and returns a 500 response.
  • 401 : Unauthorized

Server 回覆較常使用的

  • 200 : 成功回覆
  • 400 : Client 發送時引發的錯誤,例如參數有少
  • 401 : 認證錯誤,例如 AccessToken 錯誤
  • 500 : Server 內部發生錯誤,例如 DB 連線錯誤

Show connection status of this server

Show process name, pid and port

$ lsof -i -n -P | grep TCP
Spotify   60924  jex   47u  IPv4 0x5f4ad82c61e46fc7      0t0  TCP 127.0.0.1:4381 (LISTEN)
Spotify   60924  jex   48u  IPv4 0x5f4ad82c620734df      0t0  TCP 127.0.0.1:4371 (LISTEN)

Comments