武邑網(wǎng)站建設(shè)價(jià)格免費(fèi)合作推廣
問題:在開發(fā)測(cè)試時(shí)發(fā)現(xiàn)斷開與服務(wù)器端口后再次連接時(shí)拒絕連接。
分析:服務(wù)器上查看端口占用情況,假設(shè)端口為8888。
netstat -anp |grep 8888
發(fā)現(xiàn)端口8888端口顯示被占用(ip為本機(jī)ip確定是上次連接)且狀態(tài)為ESTABLISHED,然而實(shí)際上連接已經(jīng)斷開,但是服務(wù)端沒有斷開連接,查看TCP的keepalive配置。
sysctl -a |grep keepalive
發(fā)現(xiàn)為默認(rèn)的配置
-
net.ipv4.tcp_keepalive_time = 7200
-
net.ipv4.tcp_keepalive_probes = 9
-
net.ipv4.tcp_keepalive_intvl = 75
默認(rèn)情況下在連接空閑7200秒即2個(gè)小時(shí)后才會(huì)發(fā)送keepalive探測(cè)包來確認(rèn)連接情況。
解決:通過修改keepalive配置為合適的值(如改為200秒)可以快速釋放端口連接。
臨時(shí)修改,通過echo設(shè)置tcp_keepalive_time。
echo "200" > /proc/sys/net/ipv4/tcp_keepalive_time
永久生效,編輯/etc/sysctl.conf,新增或修改為
net.ipv4.tcp_keepalive_time = 200
然后執(zhí)行命令使修改后的配置生效
sysctl -p