這篇文章將為大家詳細(xì)講解有關(guān)Go語言中怎么開啟TCPkeepalive,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
成都創(chuàng)新互聯(lián)公司-云計(jì)算及IDC服務(wù)提供商,涵蓋公有云、IDC機(jī)房租用、四川樂山服務(wù)器托管、等保安全、私有云建設(shè)等企業(yè)級互聯(lián)網(wǎng)基礎(chǔ)服務(wù),咨詢熱線:18982081108TCP keepalive發(fā)送沒有(或者幾乎沒有)包體負(fù)載的 TCP 報文給對端,并且對端會回復(fù) keepaliveACK確認(rèn)包。它不是 TCP 標(biāo)準(zhǔn)的一部分(盡管在RFC1122[4]描述的這樣。
# Idle timecat /proc/sys/net/ipv4/tcp_keepalive_time# Retry intervalcat /proc/sys/net/ipv4/tcp_keepalive_intvl# Ping amountcat /proc/sys/net/ipv4/tcp_keepalive_probes
由于我最近使用 Go 語言比較多,我需要在 Go 語言中運(yùn)用 TCP keepalive。
討論開始之前需要說明,以下內(nèi)容適用于 Linux。我不是百分百確定它是否適用于 OSX,但我?guī)缀蹩梢钥隙ㄋ贿m用于 Windows。
首先,我注意到我在服務(wù)端程序中只使用了net.Conn[6]類型。
這意味著,我們需要使用ListenTCP[8]而不是Listen[10](它們的調(diào)用方式有區(qū)別,ListenTCP使用結(jié)構(gòu)體而不是字符串來表示地址。我們調(diào)用方式大概會像這樣:ListenTCP("tcp", &net.TCPAddr{Port: myClientPort})。如果你不特別指定的話,IP 的默認(rèn)值為0.0.0.0)。之后它會返回我們需要的類型TCPConn。
如果你翻看文檔可能會注意到這兩個相關(guān)的方法:SetKeepAlive[12]。func (c *TCPConn) SetKeepAlive(keepalive bool) error的調(diào)用方式十分簡單:傳入true從而打開 TCP keepalive 機(jī)制。
但是接下來的func (c *TCPConn) SetKeepAlivePeriod(d time.Duration) error就有些令人困惑了。我們用它究竟設(shè)置的是什么?答案可以在這篇文章[14]函數(shù)調(diào)用。我們來看它的實(shí)現(xiàn)。
func (f *File) Fd() uintptr { if f == nil { return ^(uintptr(0)) } // If we put the file descriptor into nonblocking mode, // then set it to blocking mode before we return it, // because historically we have always returned a descriptor // opened in blocking mode. The File will continue to work, // but any blocking operation will tie up a thread. if f.nonblock { f.pfd.SetBlocking() } return uintptr(f.pfd.Sysfd)}
如果文件描述符處于非阻塞模式,會將它修改為阻塞模式。根據(jù)stackoverflow 的這個回答[16],它使得你可以獲取RawConn