網絡協議基礎(一):三次握手中的性能優化與安全問題

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更快的通信,避免了三次握手,詳情見下圖:
fast_open
如何打開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隊列中的連接請求立即交給上層應用程序處理,而是直到有數據來臨時才交給上層應用程序處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章