keepalive
TCP中可以檢測死連接的機制
keepalive,是在TCP中一個可以檢測死連接的機制。
keepalive原理很簡單,TCP會在空閑了一定時間后發送數據給對方:
1.如果主機可達,對方就會響應ACK應答,就認為是存活的。
2.如果可達,但應用程序退出,對方就發FIN應答,發送TCP撤消連接。
3.如果可達,但應用程序崩潰,對方就發RST消息。
4.如果對方主機不響應ack, rst,繼續發送直到超時,就撤消連接。這個時間就是默認
的二個小時。
uses WinSock2;
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
type
TCP_KeepAlive = record
OnOff: Cardinal;
KeepAliveTime: Cardinal;
KeepAliveInterval: Cardinal
end;
var
Val: TCP_KeepAlive;
Ret: DWord;
begin
Val.OnOff:=1;
Val.KeepAliveTime:=6000; //6s
Val.KeepAliveInterval:=6000; //6s
WSAIoctl(AThread.Connection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4,
@Val, SizeOf(Val), nil, 0, @Ret, nil, nil)
end;
KeepAliveTime 值控制 TCP/IP 嘗試驗證空閑連接是否完好的頻率。如果這段時間內沒有活動,則會發送保持活動信號。如果網路工作正常,而且接收方是活動的,它就會響應。如果需要對丟失接收方敏感,換句話說,需要更快地發現丟失了接收方,請考慮減小這個值。如果長期不活動的空閑連接出現次數較多,而丟失接收方的情況出現較少,您可能會要提高該值以減少開銷。預設情況下,如果空閑連接 7200000 毫秒(2 小時)內沒有活動,Windows 就發送保持活動的消息。通常,1800000 毫秒是首選值,從而一半的已關閉連接會在 30 分鐘內被檢測到。
KeepAliveInterval 值定義了如果未從接收方收到保持活動消息的響應,TCP/IP 重複發送保持活動信號的頻率。當連續發送保持活動信號、但未收到響應的次數超出 TcpMaxDataRetransmissions 的值時,會放棄該連接。如果期望較長的響應時間,您可能需要提高該值以減少開銷。如果需要減少花在驗證接收方是否已丟失上的時間,請考慮減小該值或 TcpMaxDataRetransmissions 值。預設情況下,在未收到響應而重新發送保持活動的消息之前,Windows 會等待 1000 毫秒(1 秒)。
KeepAliveTime 根據你的需要設置就行,比如10分鐘,注意要轉換成MS。
XXX代表這個間隔值得大小