-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
tcp長(zhǎng)連接(tcp長(zhǎng)連接保持多久)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于tcp長(zhǎng)連接的問題,以下是小編對(duì)此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com
本文目錄:
一、tcp長(zhǎng)連接如何實(shí)現(xiàn)
關(guān)于面向 tcp/ip 協(xié)議的可靠連接的網(wǎng)絡(luò) socket 編程,必須要按照 tcp/ip協(xié)議的 server/client 模型進(jìn)行編程和調(diào)試。
二、TCP keepalive 和 http keep-alive 以及心跳?;?/strong>
HTTP的長(zhǎng)連接和短連接本質(zhì)上是TCP長(zhǎng)連接和短連接。
短連接
短連接,顧名思義,與長(zhǎng)連接的區(qū)別就是,客戶端收到服務(wù)端的響應(yīng)后,立刻發(fā)送FIN消息,主動(dòng)釋放連接。也有服務(wù)端主動(dòng)斷連的情況,凡是在一次消息交互(發(fā)請(qǐng)求-收響應(yīng))之后立刻斷開連接的情況都稱為短連接。
長(zhǎng)連接/http keep-alive
也叫持久連接,即一個(gè)TCP連接服務(wù)多次請(qǐng)求,在TCP層握手成功后,不立即斷開連接,并在此連接的基礎(chǔ)上進(jìn)行多次消息(包括心跳)交互,直至連接的任意一方(客戶端OR服務(wù)端)主動(dòng)斷開連接,此過程稱為一次完整的長(zhǎng)連接。
在HTTP/1.0中得到了初步的支持,客戶端在請(qǐng)求header中攜帶Connection:Keep-Alive,即是在向服務(wù)端請(qǐng)求持久連接。如果服務(wù)端接受持久連接,則會(huì)在響應(yīng)header中同樣攜帶Connection: Keep-Alive,這樣客戶端便會(huì)繼續(xù)使用同一個(gè)TCP連接發(fā)送接下來的若干請(qǐng)求。(Keep-Alive的默認(rèn)參數(shù)是[timout=5, max=100],即一個(gè)TCP連接可以服務(wù)至多5秒內(nèi)的100次請(qǐng)求)
HTTP/1.1開始,即使請(qǐng)求header中沒有攜帶Connection: Keep-Alive,傳輸也會(huì)默認(rèn)以持久連接的方式進(jìn)行,只有加入"Connection: close "后,才關(guān)閉。
http keepalive是客戶端瀏覽器與服務(wù)端httpd守護(hù)進(jìn)程協(xié)作的結(jié)果。
TCP中的KeepAlive
TCP協(xié)議的實(shí)現(xiàn)中,提供了KeepAlive報(bào)文,用來探測(cè)連接的對(duì)端是否存活。在應(yīng)用交互的過程中,可能存在以下幾種情況:
客戶端或服務(wù)器意外斷電,死機(jī),崩潰,重啟;
中間網(wǎng)絡(luò)已經(jīng)中斷,而客戶端與服務(wù)器并不知道;
利用保活探測(cè)功能,可以探知這種對(duì)端的意外情況,從而保證在意外發(fā)生時(shí),可以釋放半打開的TCP連接。TCP保活報(bào)文交互過程如下:
因此,KeepAlive并不適用于檢測(cè)雙方存活的場(chǎng)景,這種場(chǎng)景還得依賴于應(yīng)用層的心跳。 應(yīng)用層心跳也具備著更大的靈活性,可以控制檢測(cè)時(shí)機(jī),間隔和處理流程,甚至可以在心跳包上附帶額外信息。
應(yīng)用層心跳是檢測(cè)連接有效性以及判斷雙方是否存活的有效方式 。但是心跳過于頻繁會(huì)帶來 耗電和耗流量 的弊病,心跳頻率過低則會(huì)影響連接檢測(cè)的實(shí)時(shí)性。業(yè)內(nèi)關(guān)于心跳時(shí)間的設(shè)置和優(yōu)化,主要基于如下幾個(gè)因素:
理想的情況下,客戶端應(yīng)當(dāng)以略小于NAT超時(shí)時(shí)間的間隔來發(fā)送心跳包。 根據(jù)微信團(tuán)隊(duì)測(cè)試的一些數(shù)據(jù),一些常用網(wǎng)絡(luò)的NAT超時(shí)時(shí)間如下表所示:
TCP的KeepAlive機(jī)制意圖在于保活、心跳,檢測(cè)連接錯(cuò)誤
如何快速區(qū)分當(dāng)前連接使用的是長(zhǎng)連接還是短連接
1、凡是在一次完整的消息交互(發(fā)請(qǐng)求-收響應(yīng))之后,立刻斷開連接(有一方發(fā)送FIN消息)的情況都稱為短連接;
2、長(zhǎng)連接的一個(gè)明顯特征是會(huì)有心跳消息(也有沒有心跳的情況),且一般心跳間隔都在30S或者1MIN左右,用wireshark抓包可以看到有規(guī)律的心跳消息交互(可能會(huì)存在毫秒級(jí)別的誤差)。
什么時(shí)候用長(zhǎng)連接,短連接?
1、需要頻繁交互的場(chǎng)景使用長(zhǎng)連接,如即時(shí)通信工具(微信/QQ,QQ也有UDP),相反則使用短連接,比如普通的web網(wǎng)站,只有當(dāng)瀏覽器發(fā)起請(qǐng)求時(shí)才會(huì)建立連接,服務(wù)器返回相應(yīng)后,連接立即斷開。
2、維持長(zhǎng)連接會(huì)有一定的系統(tǒng)開銷,用戶量少不容易看出系統(tǒng)瓶頸,一旦用戶量上去了,就很有可能把服務(wù)器資源(內(nèi)存/CPU/網(wǎng)卡)耗盡,所以使用需謹(jǐn)慎。
keep-alive與TIME_WAIT
使用http keep-alvie,可以減少服務(wù)端TIME_WAIT數(shù)量(因?yàn)橛煞?wù)端httpd守護(hù)進(jìn)程主動(dòng)關(guān)閉連接)。道理很簡(jiǎn)單,相較而言,啟用keep-alive,建立的tcp連接更少了,自然要被關(guān)閉的tcp連接也相應(yīng)更少了。
短連接和長(zhǎng)鏈接 圖:
參考: https://caofengbin.github.io/2018/03/16/dhcp-and-nat/#4-%E5%BD%B1%E5%93%8D%E5%BF%83%E8%B7%B3%E9%A2%91%E7%8E%87%E7%9A%84%E5%85%B3%E9%94%AE%E5%9B%A0%E7%B4%A0
https://blog.csdn.net/hengyunabc/article/details/44310193
http://wingjay.com/2018/12/05/android-arch-long-link/
https://www.levicc.com/2018/06/30/yi-dong-duan-wang-luo-you-hua/
能被我參考的都很優(yōu)秀,哈哈
三、TCP/IP, UDP, HTTP, WebSocket, RPC及協(xié)議包結(jié)構(gòu)
WebSocket對(duì)客戶端和服務(wù)端的要求
參考資料
http://www.websocket.org/index.html
https://segmentfault.com/a/1190000012709475
https://www.liaoxuefeng.com/wiki/1022910821149312/1103303693824096
https://www.cnblogs.com/nnngu/p/9347635.html
https://www.cnblogs.com/bianzy/p/5822426.html
https://www.cnblogs.com/jingmoxukong/p/7755643.html (nginx代理WebSocket)
https://segmentfault.com/a/1190000012948613
https://www.jianshu.com/p/42260a2575f8
https://www.jianshu.com/p/45cbc2252c11 (參考資源)
https://www.jianshu.com/p/9e63767c04e1
https://www.jianshu.com/p/e41a329ef353 (握手等過程參考這里)
TCP 標(biāo)志位
TCP狀態(tài)
建立連接協(xié)議(三次握手)
連接終止協(xié)議(四次握手)
https://blog.csdn.net/yangyangye/article/details/38851271 (詳解)
https://blog.csdn.net/zzhongcy/article/details/21992471
1.為什么建立連接協(xié)議是三次握手,而關(guān)閉連接卻是四次握手呢?
2. 為什么不能用兩次握手進(jìn)行連接?
3.為什么TIME_WAIT狀態(tài)還需要等2MSL后才能返回到CLOSED狀態(tài)?
TCP短連接
TCP長(zhǎng)連接
TCP長(zhǎng)/短連接的優(yōu)點(diǎn)和缺點(diǎn)
TCP長(zhǎng)/短連接的應(yīng)用場(chǎng)景
wireshark
https://www.jianshu.com/p/e41a329ef353 (參考這里)
https://www.jianshu.com/p/7c01759c28dd (https加密傳輸參考這里)
使用集線器組成一個(gè)網(wǎng)絡(luò)
使用交換機(jī)組成一個(gè)網(wǎng)絡(luò)
使用路由器連接多個(gè)網(wǎng)絡(luò)(組包, 拆包過程)
通信過程
https://www.jianshu.com/p/209576915459
參考資源
https://www.jianshu.com/p/9e63767c04e1 (各種協(xié)議包結(jié)構(gòu))
https://www.jianshu.com/p/29868fb82890 (TCP三次握手四次揮手)
四、TCP長(zhǎng)連接出現(xiàn)Too many open files,該怎么處理
這是因?yàn)榫W(wǎng)絡(luò)請(qǐng)求過多,也就導(dǎo)致了系統(tǒng)打開的文件過多。每一個(gè)連接都會(huì)當(dāng)成“文件”看待的。
于是用命令
ulimit -a
(效果:查看每個(gè)用戶允許打開的最大文件數(shù))
看到最大文件數(shù)是1024,將其更改大點(diǎn),如
ulimit -n 4096
然后必須重啟下網(wǎng)絡(luò)服務(wù),我用的是WebLogic,重啟之后便沒有出現(xiàn)異常。
導(dǎo)致 Too many open files ,網(wǎng)絡(luò)請(qǐng)求過多是一種可能,但也有可能是程序上的缺陷,如沒有釋放一些文件句柄,程序open了文件卻忘記了在最后close。但我確信工程中沒有用到打開文件這一環(huán)節(jié),因此這個(gè)可能是排除掉了。
用lsof -p [進(jìn)程ID] 可以看到某ID的打開文件狀況。進(jìn)程ID可能用 ps -ef|grep java列出weblogic的進(jìn)程ID,然后用此ID套入lsof -p ID號(hào),咳,一大堆的請(qǐng)求喲,這顯然是網(wǎng)絡(luò)請(qǐng)求過多造成了 Too many open files。適當(dāng)調(diào)整后便已消除這種現(xiàn)象。
以上就是關(guān)于tcp長(zhǎng)連接相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
猜你喜歡
華為云服務(wù)登錄(華為云服務(wù)登錄手機(jī)版)
五線譜音符認(rèn)識(shí)(五線譜音符認(rèn)識(shí)教案)
蘋果手機(jī)怎么下載potato軟件(iphone怎么下載potato)
鑫佰利裝飾公司官網(wǎng)(鑫佰利裝飾公司官網(wǎng)地址)
potato官網(wǎng)版下載(potato官網(wǎng)下載地址)
機(jī)器人品牌十大排行(工業(yè)機(jī)器人品牌排行榜)
朋友圈發(fā)的視頻是怎么制作的(朋友圈發(fā)的視頻是怎么制作的呀)