tcp
1.tcp_keepalive_time
int keepAlive = 1; // 開啟keepalive屬性. 預設值: 0(關閉)
int keepIdle = 60; // 如果在60秒内沒有任何資料互動,則進行探測. 預設值:7200(s)
int keepInterval = 5; // 探測時發探測包的時間間隔為5秒. 預設值:75(s)
int keepCount = 2; // 探測重試的次數. 全部逾時則認定連接配接失效..預設值:9(次)
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));
setsockopt(s, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(s, SOL_TCP, TCP_KEEPINTVL, (void*)&keepInterval, sizeof(keepInterval));
setsockopt(s, SOL_TCP, TCP_KEEPCNT, (void*)&keepCount, sizeof(keepCount));
mongodb echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time 預設是7200
1.tcp_keepalive_time and rst Flag in NAT Environment
2.再次了解tcp關閉連接配接出現time_wait的情況
2MSL一般是大于30s,小于4分鐘. 最小也要30s,再大就沒啥意義了
reset封包發送場景:
RST的标志位,這個辨別為在如下幾種情況下會被設定,以下是我了解的情況,可能還有更多的場景,沒有驗證
當嘗試和未開放的伺服器端口建立tcp連接配接時,伺服器tcp将會直接向用戶端發送reset封包
雙方之前已經正常建立了通信通道,也可能進行過了互動,當某一方在互動的過程中發生了異常,如崩潰等,異常的一方會向對端發送reset封包,通知對方将連接配接關閉
當收到TCP封包,但是發現該封包不是已建立的TCP連接配接清單可處理的,則其直接向對端發送reset封包
ack封包丢失,并且超出一定的重傳次數或時間後,會主動向對端發送reset封包釋放該TCP連接配接
另外我們做大量api請求時會遇到下面的問題. Broken pipe和Connection reset by peer . 這其實也是reset的報錯一種.
本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1854649,如需轉載請自行聯系原作者