標籤:tcp/ip linux 核心參數調整
注:熟練掌握TCP/IP 各串連與中斷流程,及狀態變化;有利網路設定與系統核心TCP串連參數的最佳化.
TCP正常建立和關閉的狀態變化
650) this.width=650;" src="http://dl.iteye.com/upload/attachment/366894/b6f5e19d-5c3a-38e6-ac70-00ff44a92621.jpg" style="border:0px;" />
TCP串連的建立可以簡單的稱為三向交握,而串連的中止則可以叫做 四次握手。
建立串連
在TCP/IP協議中,TCP協議提供可靠的串連服務,採用三向交握建立一個串連。
第一次握手:建立串連時,用戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三向交握:用戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,用戶端和伺服器進入ESTABLISHED狀態,完成三向交握。
完成三向交握,用戶端與伺服器開始傳送資料,也就是ESTABLISHED狀態。
結束串連
TCP有一個特別的概念叫做half-close,這個概念是說,TCP的串連是全雙工系統(可以同時發送和接收)串連,因此在關閉串連的時候,必須關閉傳和送兩個方向上的串連。客戶機給伺服器一個FIN為1 的TCP報文,然後伺服器返回給用戶端一個確認ACK報文,並且發送一個FIN報文,當客戶機回複ACK報文後(四次握手),串連就結束了。
TCP狀態變遷圖
650) this.width=650;" src="http://dl.iteye.com/upload/attachment/365267/42e653f4-27d2-3025-9d77-23ab92df316e.jpg" style="border:0px;" />
這是一個看起來比較複雜的狀態遷移圖,因為它包含了兩個部分---伺服器的狀態遷移和用戶端的狀態遷移,如果從某一個 角度出發來看這個圖,就會清晰許多,這裡面的伺服器和用戶端都不是絕對的,發送資料的就是用戶端,接受資料的就是伺服器。
用戶端的狀態可以用如下的流程來表示:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
以上流程是在程式正常的情況下應該有的流程,從書中的圖中可以看到,在建立串連時,當用戶端收到SYN報文的ACK以後,用戶端就開啟了資料互動地 串連。而結束串連則通常是用戶端主動結束的,用戶端結束應用程式以後,需要經曆FIN_WAIT_1,FIN_WAIT_2等狀態,這些狀態的遷移就是前 面提到的結束串連的四次握手。
伺服器的狀態可以用如下的流程來表示:
CLOSED->LISTEN->SYN收到 ->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
在建立串連的時候,伺服器端是在第三向交握之後才進入資料互動狀態,而關閉串連則是在關閉串連的第二次握手以後(注意不是第四次)。而關閉以後還要 等待用戶端給出最後的ACK包才能進入初始的狀態。
其他狀態遷移
書中的圖還有一些其他的狀態遷移,這些狀態遷移針對伺服器和用戶端兩方面的總結如下
1. LISTEN->SYN_SENT,對於這個解釋就很簡單了,伺服器有時候也要開啟串連的嘛。
2. SYN_SENT->SYN收到,伺服器和用戶端在SYN_SENT狀態下如果收到SYN資料報,則都需要發送SYN的ACK資料報並把自己的狀態 調整到SYN收到狀態,準備進入ESTABLISHED
3. SYN_SENT->CLOSED,在發送逾時的情況下,會返回到CLOSED狀態。
4. SYN_收到->LISTEN,如果受到RST包,會返回到LISTEN狀態。
5. SYN_收到->FIN_WAIT_1,這個遷移是說,可以不用到ESTABLISHED狀態,而可以直接跳轉到FIN_WAIT_1狀態並等待關 閉。
2MSL等待狀態
書中給的圖裡面,有一個TIME_WAIT等待狀態,這個狀態又叫做2MSL狀態,說的是在TIME_WAIT2發送了最後一個ACK資料報以後, 要進入 TIME_WAIT狀態,這個狀態是防止最後一次握手的資料報沒有傳送到對方那裡而準備的(注意這不是四次握手,這是第四次握手的保險狀態)。這個狀態在 很大程度上保證了雙方都可以正常結束,但是,問題也來了。
由於插口的2MSL狀態(插口是IP和連接埠對的意思,socket),使得應用程式在2MSL時間內是無法再次使用同一個插口的,對於客戶程式還好 一些,但是對於服務程式,例如httpd,它總是要使用同一個連接埠來進行服務,而在 2MSL時間內,啟動httpd就會出現錯誤(插口被使用)。為了避免這個錯誤,伺服器給出了一個平靜時間的概念,這是說在2MSL時間內,雖然可以重新 啟動伺服器,但是這個伺服器還是要平靜的等待2MSL時間的過去才能進行下一次串連。
FIN_WAIT_2狀態
這就是著名的半關閉的狀態了,這是在關閉串連時,用戶端和伺服器兩次握手之後的狀態。在這個狀態下,應用程式還有接受資料的能力,但是已經無法發送 資料,但是也有一種可能是,用戶端一直處於FIN_WAIT_2狀態,而伺服器則一直處於WAIT_CLOSE狀態,而直到應用程式層來決定關閉這個狀態
RST,同時開啟和同時關閉
RST是另一種關閉串連的方式,應用程式應該可以判斷RST包的真實性,即是否為異常中止。而同時開啟和同時關閉則是兩種特殊的TCP狀態,發生的 機率很小。
TCP各串連狀態解釋:
LISTEN:偵聽來自遠方連接埠的串連請求
SYN-SENT:再次發送串連請求後等待匹配的串連請求
SYN-RECEIVE:再次收到和發送一個串連請求後等待對方串連誒請求的確認
ESTABLISHED:代表一個開啟的串連
FIN-WAIT-1:等待遠程TCP串連插斷要求,或先前的串連插斷要求的確認
FIN-WAIT-2:從遠程TCP等待串連插斷要求
CLOSE-WAIT:等待從本機使用者發來的串連插斷要求
CLOSEING:等待遠程TCP對串連中斷的確認
LAST-ACK:等待原來的發向遠程TCP的串連插斷要求的確認
TIME-WAIT:等待足夠的時間以確保遠程TCP接收到插斷要求的確認
CLOSED:沒有任何串連狀態
LINUX 系統核心TCP串連參數詳解
所有的TCP/IP參數都位於/proc/sys/net目錄下面:
/proc/sys/net/ipv4/tcp_mem 確定TCP棧應該如何反映記憶體使用量,每個值的單位都是記憶體頁(通常是4KB).第一個值是記憶體使用量的下限;第二個值是記憶體壓力模式開始對緩衝區使用應用壓力的上限;
第三個值是記憶體使用量的上限.在這個層次上可以將報文丟棄,從而減少對記憶體的使用.對於較大的BDP可以增大這些值(注意,其單位是記憶體頁而不是位元組) 調整後: 131072 262144 524288
/proc/sys/net/ipv4/tcp_rmem 為自動調優定義socket使用的記憶體.第一個值是為socket接收緩衝區分配的最少位元組數;第二個值是預設值(該值會被rmem_default覆蓋),緩衝區在系統負載不重的情況下可以增長到這個值;第三個值是接收緩衝區空間的最大位元組數(該值會被rmem_max覆蓋) 調整後: 8760 256960 4088000
/proc/sys/net/ipv4/tcp_wmem 為自動調優定義socket使用的記憶體.第一個值是為socket發送緩衝區分配的最少位元組數;第二個值是預設值(該值會被wmem_default覆蓋),緩衝區在系統負載不重的情況下可以增長到這個值;第三個值是發送緩衝區空間的最大位元組數(該值會被wmem_max覆蓋) 調整後:8760 256960 4088000
/proc/sys/net/ipv4/tcp_keepalive_time TCP發送keepalive探測訊息的間隔時間(秒),用於確認TCP串連是否有效 調整後:1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 探測訊息未獲得響應時,重發該訊息的間隔時(秒). 調整後:30
/proc/sys/net/ipv4/tcp_keepalive_probes 在認定TCP串連失效之前,最多發送多少個keepalive探測訊息. 調整後:3
/proc/sys/net/ipv4/tcp_sack 啟用有選擇的應答(1表示啟用),通過有選擇地應答亂序接收到的報文來提高效能,讓寄件者只發送丟失的報文段,(對於廣域網路通訊來說)這個選項應該啟用,但是會增加對CPU的佔用. 調整後:1
/proc/sys/net/ipv4/tcp_fack 啟用轉寄應答,可以進行有選擇應答(SACK)從而減少擁塞情況的發生,這個選項也應該啟用. 調整後: 1
/proc/sys/net/ipv4/tcp_timestamps TCP時間戳記(會在TCP包頭增加12個位元組),以一種比重發逾時更精確的方法(參考RFC 1323)來啟用對RTT 的計算,為實現更好的效能應該啟用這個選項. 調整後: 1
/proc/sys/net/ipv4/tcp_window_scaling 啟用RFC 1323定義的window scaling,要支援超過64KB的TCP視窗,必須啟用該值(1表示啟用),TCP視窗最大至1GB,TCP串連雙方都啟用時才生效. 調整後: 1
/proc/sys/net/ipv4/tcp_syncookies 表示是否開啟TCP同步標籤(syncookie),核心必須開啟了CONFIG_SYN_COOKIES項進行編譯,同步標籤可以防止一個通訊端在有過多試圖串連到達時引起過載. 調整後: 1
/proc/sys/net/ipv4/tcp_tw_reuse 表示是否允許將處於TIME-WAIT狀態的socket(TIME-WAIT的連接埠)用於新的TCP串連 調整後: 1
/proc/sys/net/ipv4/tcp_tw_recycle 能夠更快地回收TIME-WAIT通訊端. 調整後: 1
/proc/sys/net/ipv4/tcp_fin_timeout 對於本端斷開的socket串連,TCP保持在FIN-WAIT-2狀態的時間(秒).對方可能會中斷連線或一直不結束串連或不可預料的進程死亡. 調整後: 30
/proc/sys/net/ipv4/ip_local_port_range 表示TCP/UDP協議允許使用的本地連接埠號碼 調整後: 1024 65000
/proc/sys/net/ipv4/tcp_max_syn_backlog 對於還未獲得對方確認的串連請求,可儲存在隊列中的最大數目.如果伺服器經常出現過載,可以嘗試增加這個數字. 調整後: 2048
/proc/sys/net/ipv4/tcp_low_latency 允許TCP/IP棧適應在高輸送量情況下低延時的情況,這個選項應該禁用. 調整後: 0
/proc/sys/net/ipv4/tcp_westwood 啟用寄件者端的擁塞控制演算法,它可以維護對輸送量的評估,並試圖對頻寬的整體利用情況進行最佳化,對於WAN 通訊來說應該啟用這個選項. 調整後: 0
/proc/sys/net/ipv4/tcp_bic 為快速長距離網路啟用Binary Increase Congestion,這樣可以更好地利用以GB速度進行操作的連結,對於WAN通訊應該啟用這個選項. 調整後: 1
寫入/etc/sysctl.conf 設定檔:
net.ipv4.tcp_mem = 131072 262144 524288
net.ipv4.tcp_rmem = 8760 256960 4088000
net.ipv4.tcp_wmem = 8760 256960 4088000
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 2048
.......更多的參數最佳化需要進一步去挖掘.....
儲存檔案,使用命令“/sbin/sysctl –p”使之立即生效.
本文出自 “旋木的技術部落格” 部落格,請務必保留此出處http://mrxiong.blog.51cto.com/287318/1531953