客戶端優化
序列號同步
第一次握手的時候,客戶端會向服務端發送鏈接請求的報文,叫SYN,SYN全稱是Synchronize Sequence Numbers,翻譯過來是同步序列號。
創建鏈接的第一件事就是同步序列號。只有同步了序列號纔有保證穩定可靠的傳輸。一個序列號佔四個字節的內存服務器
SYN重試
在第二次握手以前,客戶端會等待服務端返回ACK報文。微信
通常狀況下,ACK報文會在幾毫秒內返回。but,若是客戶端遲遲沒有收到 ACK,客戶端會一直重發 SYN報文,默認是6次
net.ipv4.tcp_syn_retries = 2cookie
第 1 次重試在 1 秒鐘後,接着會以翻倍的方式在第 二、四、八、1六、32 秒共作 6 次重試,最後一次重試會等待 64 秒。若是依然沒有收到 ACK,會終止三次握手。因此,總耗時是 1+2+4+8+16+32+64=127 秒。
咱們能夠根據網絡的穩定性和服務器的繁忙程度修改retries,調整客戶端的三次握手時間上限。能夠適當調低retries,儘早的把錯誤暴露給應用程序。網絡
服務端優化
半鏈接隊列
服務器收到 SYN 報文後會回覆 SYN+ACK 報文。既確認了客戶端的序列號,也把本身的序列號發給客戶端。此時服務端狀態是 SYN_RECV。這個狀態下,服務端必須創建一個 SYN 半鏈接隊列來維護未完成的握手信息,當這個隊列溢出後,服務器將沒法再創建新鏈接。tcp
可是,鏈接創建失敗的緣由有不少。如何甄別出隊列溢出引起的鏈接失敗?能夠經過netstat命令
netstat -s | grep "SYNs to LISTEN"函數
這裏是隊列溢出致使 SYN 被丟棄的個數累加值。若是數值持續增長,應該調大 SYN 半鏈接隊列。
設置 tcp_max_syn_backlog測試
syncookies
若是 SYN 半鏈接隊列已滿,是否是隻能丟棄鏈接?事實上若是開啓 syncookies 功能就能夠在不使用 SYN 隊列的狀況下也能創建鏈接。
net.ipv4.tcp_syncookies = 1。0表示關閉此功能,1表示當半鏈接隊列已滿的狀況下開啓此功能優化
SYN+ACK重試
客戶端接收到服務端發來的 SYN+ACK 報文以後回覆 ACK 去通知服務端,同時客戶端鏈接狀態從 SYN_SENT 轉換爲 ESTABLISHED,表示鏈接創建成功。
服務器端一直等到接收到 ACK 以後,狀態才變爲 ESTABLISHEDspa
but,若是服務端遲遲沒有收到 ACK,就會一直重發 SYN+ACK 報文,tcp_synack_retries 的默認次數是 5 次。第 1 次重試在 1 秒鐘後,接着會以翻倍的方式在第 二、四、八、16秒共作 5 次重試,若仍然沒有收到 ACK,會關閉鏈接,總耗時是63s。
修改重發次數的方法是調整 tcp_synack_retries 參數
net.ipv4.tcp_synack_retries = 6.net
RST 復位
服務器收到 ACK 後表示鏈接創建成功,此時內核會把鏈接從 SYN 半鏈接隊列中移出,再移入 accept 隊列,等待進程調用 accept 函數時把鏈接取出來。若是進程不能及時地調用 accept 函數,就會形成 accept 隊列溢出,致使創建好的 TCP 鏈接被丟棄。此時咱們能夠選擇向客戶端發送 RST 復位報文,告訴客戶端鏈接已經創建失敗。須要將 tcp_abort_on_overflow設置爲 1
一般狀況下,tcp_abort_on_overflow應該設置爲0。由於能夠提升鏈接創建的成功率。只有當accept隊列頻繁溢出的時候,才能設置爲1
accept隊列長度
backlog 參數就能夠設置 accept 隊列的大小
net.core.netdev_max_backlog = 1024
backlog 參數受限於 Linux 隊列長度,這個上限值能夠經過 somaxconn 參數修改
net.core.somaxconn = 262144
經常使用tcp參數配置
net.ipv4.ip_local_port_range = 1024 65500
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.tcp_abort_on_overflow=0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
本文分享自微信公衆號 - 測試驛棧(uhz2008_2008)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。