1. 程式人生 > >[TimLinux] TCP全連接隊列滿

[TimLinux] TCP全連接隊列滿

最大值 連接 server roc lan The 系統參數 錯誤 www

0. TCP三次握手

該圖來自:TCP SOCKET中backlog參數的用途是什麽?

技術分享圖片

syns queue: 半連接隊列

accept queue: 全連接隊列

控制參數存放在文件:/proc/sys/net/ipv4/tcp_abort_on_overflow中,0:表示如果三次握手第三步的時候全連接隊列滿了,那麽server扔掉client發過來的ack(在server端因為全連接隊列滿了,認為連接還沒有建立起來),1:表示第三步的時候如果全連接隊列滿了,server發送一個reset包給client,表示廢掉這個握手過程和這個連接(client端會拋出異常:connection reset by peer的錯誤)

如果全連接隊列滿了並且tcp_abort_on_overflow=0的話,server過一段時間再次發送syn+ack給client(也就是重試),重試的次數在net.ipv4.tcp_synack_retries參數中配置:sysctl -a 可以查看當前的配置。

1. 查看全連接隊列

$ netstat -s | egrep ‘listen|LISTEN‘

667399 times the listen queue of a socket overflowed ==> 全連接隊列滿了 66739 次

$ ss -lnt ==> 50: 表示監聽的端口上全連接隊列最大為50,第一列Recv-Q表示當前使用了多少

State Recv-Q Send-Q local Address:Port Peer Address:Port

LISTEN 0 50 :3306 *:*

全連接隊列的最大值 = min(backlog, somaxconn)

backlog: 是在socket創建的時候傳入的,somaxconn:是一個os級別的系統參數(cat /proc/sys/net/core/somaxconn)

2. 查看半連接隊列

半連接隊列的大小取決於:max(64, /proc/sys/net/ivp4/tcp_max_syn_backlog),不同的OS會有差異

$ netstat -tn

Active  Internet connections (w/o servers)

Proto  Recv-Q  Send-Q  Local Address  Foreign Address State

tcp0  0     server:8182 client-1:15260  SYNC_RECV

tcp0  28    server:22 client-1:51708  ESTABLISHED

tcp0  0     server:2376  client-1:60269  ESTABLISHED

這個命令顯示的Recv-Q、Send-Q與全連接、半連接沒有關系!

$ ab -n 10000 -c 300 http://172.16.218.128/3.php (ab: apache benchmark性能測試命令)

[TimLinux] TCP全連接隊列滿