溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

golang基于websocket通信tcp?keepalive實(shí)例分析

發(fā)布時(shí)間:2022-06-02 09:46:55 來源:億速云 閱讀:295 作者:zzz 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“golang基于websocket通信tcp keepalive實(shí)例分析”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“golang基于websocket通信tcp keepalive實(shí)例分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

    為什么有tcp Keepalive?

    服務(wù)器和客戶端建立tcp連接以后,客戶端/服務(wù)器如何知道對(duì)方是否掛掉了? 

    這時(shí)候TCP協(xié)議提出一個(gè)辦法,當(dāng)客戶端端等待超過一定時(shí)間后自動(dòng)給服務(wù)端發(fā)送一個(gè)空的報(bào)文,如果對(duì)方回復(fù)了這個(gè)報(bào)文證明連接還存活著,如果對(duì)方?jīng)]有報(bào)文返回且進(jìn)行了多次嘗試都是一樣,那么就認(rèn)為連接已經(jīng)丟失,客戶端就沒必要繼續(xù)保持連接了。如果沒有這種機(jī)制就會(huì)有很多空閑的連接占用著系統(tǒng)資源。

    KeepAlive并不是TCP協(xié)議規(guī)范的一部分,但在幾乎所有的TCP/IP協(xié)議棧(不管是Linux還是Windows)中,都實(shí)現(xiàn)了KeepAlive功能。

     RFC1122#TCP Keep-Alives

    tcp Keepalive是否默認(rèn)開啟?

    KeepAlive默認(rèn)情況下是關(guān)閉的,可以被上層應(yīng)用開啟和關(guān)閉

    如何設(shè)置tcp keepalive?

    在Linux內(nèi)核設(shè)置

    KeepAlive默認(rèn)不是開啟的,如果想使用KeepAlive,需要在你的應(yīng)用中設(shè)置SO_KEEPALIVE才可以生效。

    查看當(dāng)前的配置:

    cat /proc/sys/net/ipv4/tcp_keepalive_time
    cat /proc/sys/net/ipv4/tcp_keepalive_intvl
    cat /proc/sys/net/ipv4/tcp_keepalive_probes

    在Linux中我們可以通過修改 /etc/sysctl.conf 的全局配置:

    net.ipv4.tcp_keepalive_time=7200
    net.ipv4.tcp_keepalive_intvl=75
    net.ipv4.tcp_keepalive_probes=9

    添加上面的配置后輸入 sysctl -p 使其生效,你可以使用 sysctl -a | grep keepalive 命令來查看當(dāng)前的默認(rèn)配置

    golang websocket 客戶端默認(rèn)怎么處理tcp keepalive?

    websocket客戶端默認(rèn)是開啟tcp keepalive的

    客戶端調(diào)用的是net/dial的方法DialContext:

    golang基于websocket通信tcp?keepalive實(shí)例分析

    決定是否開啟keepalive,取決于dial的keepalive的值,>>0就開啟

    把客戶端的代碼改造以后,就可以決定是否主動(dòng)開啟了:

    golang基于websocket通信tcp?keepalive實(shí)例分析

    golang websocket 服務(wù)器默認(rèn)怎么處理tcp keepalive?

    websocket服務(wù)器默認(rèn)是開啟tcp keepalive的

    客戶端調(diào)用的是net/tcpsock_posix的tcplistener的accept方法決定的:

    golang基于websocket通信tcp?keepalive實(shí)例分析

    tcplistenser的lc配置文件的keepalive字段>>0就開啟tcp keepalive

    把服務(wù)器改造一下,支持能夠主動(dòng)開關(guān)tcp keepalive:

    golang基于websocket通信tcp?keepalive實(shí)例分析

    讀到這里,這篇“golang基于websocket通信tcp keepalive實(shí)例分析”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI