tcp_を正しく理解するfin_timeoutはいったいどんな役割を果たしていますか?

3529 ワード

tcp_fin_timeout TIME_WAIT TCPディレクトリ構造の正確な理解tcp_fin_timeoutはいったいどんな役割を果たしていますか?TCP接続中TIME_WAIT状態、tcp_fin_timeoutの誤った理解、ulimitパラメータとtcpのtime waitパラメータを批改する.
ulimitパラメータとtcpのtime waitパラメータを批改する
ulimitパラメータとtcpのtime waitパラメータを変更する
1.linux下tcpのTIME_WAITパラメータ調整
Netstat-na|awk'/^tcp/{++S[$NF]}END{for(i in S)print i,S[i]}'ネットワークノードのtcp接続状態を調べ,システムに大量のTIME_が存在することを発見した場合WAIT状態の接続は、カーネルパラメータを調整することで解決します.
vi /etc/sysctl.conf
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.tcp_keepalive_time = 1200
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000

次に、次のコマンドを実行してパラメータを有効にします:/sbin/sysctl-p
TCPパラメータの説明:
net.ipv4.tcp_syncookies=1はSYN Cookiesを開くことを示す.SYN待機キューオーバーフローが発生した場合、cookiesを有効にして処理し、少量のSYN攻撃を防ぐことができ、デフォルトは0で、閉じることを示す.
net.ipv4.tcp_tw_reuse=1は再利用をオンにします.TIME-WAIT socketsを新しいTCP接続に再使用することを許可し、デフォルトは0で、オフを示します.
net.ipv4.tcp_tw_recycle=1はTCP接続中のTIME-WAITソケットの高速回収をオンにし、デフォルトは0でオフにします.
net.ipv4.tcp_fin_timeout=30は,ソケットがエンド要求によりクローズされた場合,このパラメータがFIN−WAIT−2状態に保持される時間を決定することを示す.
net.ipv4.tcp_keepalive_time=1200は、keepaliveが起用されると、TCPがkeepaliveメッセージを送信する頻度を示す.デフォルトは2時間で、20分に変更されました.
net.ipv4.ip_local_port_range=1024 65000は、外部に接続するためのポート範囲を表します.デフォルトでは、32768~61000が小さく、1024~65000に変更されます.
net.ipv4.tcp_max_syn_backlog=8192はSYNキューの長さを表し、デフォルトは1024で、キューの長さを8192に増やし、接続待ちのネットワーク接続数を増やすことができます.
net.ipv4.tcp_max_tw_buckets=5000はシステムがTIME_を保持していることを示します.WAITソケットの最大数がこの数字を超えるとTIME_WAITソケットはすぐに消去され、警告メッセージが印刷されます.デフォルトは180000で、5000に変更されました.
Apache、Nginxなどのサーバでは、上の数行のパラメータでTIME_をうまく減らすことができます.WAITソケットの数ですが、Squidにはあまり効果がありません.このパラメータはTIME_を制御します.WAITソケットの最大数は、Squidサーバが大量のTIME_WAITソケットが引きずって死ぬ.
上記の4回の握手は、クライアントセグメントがアクティブに閉じ、サーバがパッシブに閉じるプロセスを説明しています.一般的なプロセスは次のとおりです.
クライアントはFINメッセージセグメントを送信し、FIN_に入るWAIT_1ステータス.サーバ側はFINメッセージセグメントを受け取り、ACK表示確認を送信し、CLOSE_に入るWAIT状態.クライアントはFINの確認メッセージを受け取り、FIN_に入るWAIT_2ステータス.サーバ側はFINメッセージ側を送信し、LAST_に入るACKステータス.クライアントはFINメッセージを受け取り、FINのACKを送信し、同時にTIME_に入る.WAITステータス、TIME_を起動WAITタイマー、タイムアウト時間を2 MSLに設定します.サーバ側はFINのACKを受け取り,CLOSED状態に入る.クライアントはk時間以内に対端のいかなる応答を受け取っていないで、TIME_WAITがタイムアウトし、CLOSED状態になります.2.linux下ulimitパラメータ調整
vi/etc/security/limits.conf work soft nofile 65535 work hard nofile 65535
ulimit-SHn 65536 ulimit-n TCP接続中TIME_WAIT状態
tcp_fin_timeout
対tcp_fin_timeoutの誤った理解
秀嶺メールで言及されたtcpを検索します.retrans_collapseの時、意外にも1段のドキュメントを発見して、ドキュメントの言い方によると、長い間私はtcp_に対してfin_timeoutの理解はすべて間違っています!
ここにバックアップしてから、ドキュメントのソースを確認します.http://www.pgsqldb.org/mwiki/index.php/Linux%E5%86%85%E6%A0%B8%E5%8F%82%E6%95%B0
ドキュメントの内容:
Linuxの短い接続への負荷能力の向上
大量の短い接続が存在する場合、LinuxのTCPスタックは一般的に大量のTIME_を生成する.WAIT状態のソケット.次のコマンドで見ることができます.
netstat -ant| grep -i time_waitは時々、この数は驚くべきものです.
netstat -ant|grep -i time_wait|wc-lは3,4万を超える可能性があります.このとき、linux kernelのtcp time waitを修正する時間が必要です.短縮すると、sysctlパラメータが使用できるようです./proc/sys/net/ipv 4/tcp_です.fin_timeout、デフォルト値は60、つまり60秒で、多くのネット上の資料はこの数値を低く設定すればnetstatの中のTIME_を減らすことができると言っています.WAIT状態ですが、この言い方は間違っています.
Linuxのカーネルソースコードを真剣に読むことによって、私たちはこの数値が実は出力用であることを発見して、修正した後に本当にカーネルに戻って使用していないで、カーネルの中で本当に使うのは1つのマクロ定義で、$KERNEL/include/net/tcp.hの中には、次の行があります.
#define TCP_TIMEWAIT_LEN(60*HZ)/*how long to wait to destroy TIME-WAIT*state,about 60 seconds*/そしてこのマクロはTCP TIME_を真に制御するWAIT状態のタイムアウト時間です.TIMEを減らしたいならWAIT状態の数(カーネルの操作時間を少し節約)では、この数値を低く設定することができます.私たちのテストによると、10秒に設定するのが適切です.
51 it技術ブログから転載:tcpを正しく理解する_fin_timeoutはいったいどんな役割を果たしていますか?