文章目錄
1.ABNF操作符
先了解巴科斯範式BNF,它是以美國人巴科斯(Backus)和丹麥人諾爾(Naur)的名字命名的一種形式化的語法表示方法,用來描述語法的一種形式體系,是一種典型的元語言。它不僅能嚴格地表示語法規則,而且所描述的語法是與上下文無關的。它具有語法簡單,表示明確,便於語法分析和編譯的特點。而ABNF則是擴展的巴科斯範式,並做了更多的改進,這種元語言的發起原則是描述作爲通信協議(雙向規範)的語言的形式系統,包括HTTP協議。
- 空白字符:用來分隔定義中的各個元素
如: method SP request-target SP HTTP-version CRLF - 選擇 /:表示多個規則都是可供選擇的規則
如:start-line = request-line / status-line - 值範圍 %c##-##
如:OCTAL = “0” / “1” / “2” / “3” / “4” / “5” / “6” / “7” 與 OCTAL = %x30-37 等價 - 序列組合 ():將規則組合起來,視爲單個元素
- 不定量重複 m*n
如: *元素表示零個或更多元素:*( header-field CRLF )
如: 1* 元素表示一個或更多元素,2*4 元素表示兩個至四個元素 - 可選序列 []: 如 [ message-body ]
ABNF (擴充巴科斯-瑙爾範式)核心規則
規則 | 形式定義 | 意義 |
---|---|---|
ALPHA | %x41-5A / %x61-7A | 大寫和小寫ASCII字母(A-Z, a-z) |
DIGIT | %x30-39 | 數字(0-9) |
HEXDIG | DIGIT / “A” / “B” / “C” / “D” / “E” / “F” | 十六進制數字(0-9, A-F, a-f) |
DQUOTE | %x22 | 雙引號 |
SP | %x20 | 空格 |
HTAB | %x09 | 橫向製表符 |
WSP | SP / HTAB | 空格或橫向製表符 |
LWSP | *(WSP / CRLF WSP) | 直線空白(晚於換行) |
VCHAR | %x21-7E | 可見(打印)字符 |
CHAR | %x01-7F | 任何7-位US-ASCII字符,不包括NUL(%x00) |
OCTET | %x00-FF | 8位數據 |
CTL | %x00-1F / %x7F | 控制字符 |
CR | %x0D | 回車 |
LF | %x0A | 換行 |
CRLF | CR LF | 互聯網標準換行 |
BIT | “0” / “1” | 二進制數 |
2.使用telnet 捕獲一個網絡包如下所示
telnet www.baidu.com 80
......
GET / HTTP/1.1 CRLF
Host:www.baidu.com CRLF
CRLF
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 14615
Content-Type: text/html
......
3.評估Web架構的關鍵屬性
性能、可伸縮性、簡單性、可見性、可移植性、可靠性、可修改性
- 性能:吞吐量、開銷
- 用戶感知性能:延遲、完成時間
- 網絡效率:重用緩存、減少交互次數、數據傳輸距離更近、COD
- 可修改性:可進化性、可擴展性、可定製性、可配置性、可重用性
4.爲什麼進行URI編碼
對可能產生歧義性的數據編碼以免發生錯誤。 如不在 ASCII 碼範圍內的字符, ASCII 碼中不可顯示的字符,URI 中規定的保留字符,不安全字符(傳輸環節中可能會被不正確處理),如空格、引號、尖括號等。
- 保留字符
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
- 非保留字符
unreserved = ALPHA / DIGIT / “-” / “.” / “_” / “~”
ALPHA: %41-%5A and %61-%7A
DIGIT: %30-%39
-: %2D .: %2E _: %5F
~: %7E,某些實現將其認爲保留字符
- URI的百分號編碼
(1) 直接"%" HEXDIG HEXDIG
編碼
(2) 非 ASCII 碼字符(例如中文):建議先 UTF8 編碼,再 US-ASCII 編碼
(3) 對 URI 合法字符,編碼與不編碼是等價的
5.netstat命令查看 TCP 狀態
-a: 顯示所有連接和偵聽端口。
-n: 以數字形式(如 IP 地址)顯示地址和端口號。
-r: 顯示路由表。
-s: 顯示每個協議的統計信息。
-b(Windows)/-p(Linux) : 顯示對應的可執行程序名字。
6.超時時間與緩衝隊列
- 應用層 connect 超時時間調整
- 緩衝隊列
(1)服務器端SYN_RCV 狀態:
net.ipv4.tcp_max_syn_backlog:SYN_RCVD 狀態連接的最大個數
net.ipv4.tcp_synack_retries:被動建立連接時,發SYN/ACK的重試次數
(2)客戶端SYN_SENT狀態:
net.ipv4.tcp_syn_retries = 6 主動建立連接時,發 SYN 的重試次數 net.ipv4.ip_local_port_range = 32768 60999 建立連接時的本地端口可用範圍
(3)ACCEPT隊列設置
7.三次握手中的性能優化與安全問題
(1) 什麼是Fast Open降低時延
所謂的Fast Open就是指在第一次建立三次握手的時候由服務器負責爲客戶端生成cookie,其中由關於tcp連接的相關信息如源端口、目的端口、目的 ip、序號、 應答序號、對方窗口大小、己方窗口大小等,這樣在第二次進行tcp連接是就可以直接基於cookie更快的通信,避免了三次握手,詳情見下圖:
如何打開TCP Fast Open
net.ipv4.tcp_fastopen:系統開啓 TFO 功能
- 0:關閉
- 1:作爲客戶端時可以使用 TFO
- 2:作爲服務器時可以使用 TFO
- 3:無論作爲客戶端還是服務器,都可以使用 TFO
(2) 如何應對 SYN 攻擊
攻擊者短時間僞造不同 IP 地址的 SYN 報文,快速佔滿 SYN(backlog) 隊列,使 服務器不能爲正常用戶服務的現象叫做SYN攻擊。
通常通過限制SYN隊列大小與SYN_RCVD 狀態連接的最大個數,以及超出處理能力時,對新來的 SYN 直接回包 RST,丟棄連接的方法來解決SYN攻擊。
(3) 什麼是TCP_DEFER_ACCEPT
指三次握手完畢之後並不立即將accept隊列中的連接請求立即交給上層應用程序處理,而是直到有數據來臨時才交給上層應用程序處理。