青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Benjamin

靜以修身,儉以養(yǎng)德,非澹薄無以明志,非寧靜無以致遠(yuǎn)。
隨筆 - 398, 文章 - 0, 評論 - 196, 引用 - 0
數(shù)據(jù)加載中……

長連接和Keepalive

TCP協(xié)議中有長連接和短連接之分。短連接在數(shù)據(jù)包發(fā)送完成后就會自己斷開,長連接在發(fā)包完畢后,會在一定的時間內(nèi)保持連接,即我們通常所說的Keepalive(存活定時器)功能。
默認(rèn)的Keepalive超時需要7,200,000 milliseconds,即2小時,探測次數(shù)為5次。它的功效和用戶自己實現(xiàn)的心跳機(jī)制是一樣的。開啟Keepalive功能需要消耗額外的寬帶和流量,盡管這微不足道,但在按流量計費(fèi)的環(huán)境下增加了費(fèi)用,另一方面,Keepalive設(shè)置不合理時可能會因為短暫的網(wǎng)絡(luò)波動而斷開健康的TCP連接。

keepalive并不是TCP規(guī)范的一部分。在Host Requirements RFC羅列有不使用它的三個理由:(1)在短暫的故障期間,它們可能引起一個良好連接(good connection)被釋放(dropped),(2)它們消費(fèi)了不必要的寬帶,(3)在以數(shù)據(jù)包計費(fèi)的互聯(lián)網(wǎng)上它們(額外)花費(fèi)金錢。然而,在許多的實現(xiàn)中提供了存活定時器。

一些服務(wù)器應(yīng)用程序可能代表客戶端占用資源,它們需要知道客戶端主機(jī)是否崩潰。存活定時器可以為這些應(yīng)用程序提供探測服務(wù)。Telnet服務(wù)器和Rlogin服務(wù)器的許多版本都默認(rèn)提供存活選項。

個人計算機(jī)用戶使用TCP/IP協(xié)議通過Telnet登錄一臺主機(jī),這是能夠說明需要使用存活定時器的一個常用例子。如果某個用戶在使用結(jié)束時只是關(guān)掉了電源,而沒有注銷(log off),那么他就留下了一個半打開(half-open)的連接。如果客戶端消失,留給了服務(wù)器端半打開的連接,并且服務(wù)器又在等待客戶端的數(shù)據(jù),那么等待將永遠(yuǎn)持續(xù)下去。存活特征的目的就是在服務(wù)器端檢測這種半打開連接。

也可以在客戶端設(shè)置存活器選項,且沒有不允許這樣做的理由,但通常設(shè)置在服務(wù)器。如果連接兩端都需要探測對方是否消失,那么就可以在兩端同時設(shè)置(比如NFS)。



keepalive工作原理:

若在一個給定連接上,兩小時之內(nèi)無任何活動,服務(wù)器便向客戶端發(fā)送一個探測段。(我們將在下面的例子中看到探測段的樣子。)客戶端主機(jī)必須是下列四種狀態(tài)之一:

1) 客戶端主機(jī)依舊活躍(up)運(yùn)行,并且從服務(wù)器可到達(dá)。從客戶端TCP的正常響應(yīng),服務(wù)器知道對方仍然活躍。服務(wù)器的TCP為接下來的兩小時復(fù)位存活定時器,如果在這兩個小時到期之前,連接上發(fā)生應(yīng)用程序的通信,則定時器重新為往下的兩小時復(fù)位,并且接著交換數(shù)據(jù)。

2) 客戶端已經(jīng)崩潰,或者已經(jīng)關(guān)閉(down),或者正在重啟過程中。在這兩種情況下,它的TCP都不會響應(yīng)。服務(wù)器沒有收到對其發(fā)出探測的響應(yīng),并且在75秒之后超時。服務(wù)器將總共發(fā)送10個這樣的探測,每個探測75秒。如果沒有收到一個響應(yīng),它就認(rèn)為客戶端主機(jī)已經(jīng)關(guān)閉并終止連接。

3) 客戶端曾經(jīng)崩潰,但已經(jīng)重啟。這種情況下,服務(wù)器將會收到對其存活探測的響應(yīng),但該響應(yīng)是一個復(fù)位,從而引起服務(wù)器對連接的終止。

4) 客戶端主機(jī)活躍運(yùn)行,但從服務(wù)器不可到達(dá)。這與狀態(tài)2類似,因為TCP無法區(qū)別它們兩個。它所能表明的僅是未收到對其探測的回復(fù)。

 

服務(wù)器不必?fù)?dān)心客戶端主機(jī)被關(guān)閉然后重啟的情況(這里指的是操作員執(zhí)行的正常關(guān)閉,而不是主機(jī)的崩潰)。當(dāng)系統(tǒng)被操作員關(guān)閉時,所有的應(yīng)用程序進(jìn)程(也就是客戶端進(jìn)程)都將被終止,客戶端TCP會在連接上發(fā)送一個FIN。收到這個FIN后,服務(wù)器TCP向服務(wù)器進(jìn)程報告一個文件結(jié)束,以允許服務(wù)器檢測這種狀態(tài)。

在第一種狀態(tài)下,服務(wù)器應(yīng)用程序不知道存活探測是否發(fā)生。凡事都是由TCP層處理的,存活探測對應(yīng)用程序透明,直到后面234三種狀態(tài)發(fā)生。在這三種狀態(tài)下,通過服務(wù)器的TCP,返回給服務(wù)器應(yīng)用程序錯誤信息。(通常服務(wù)器向網(wǎng)絡(luò)發(fā)出一個讀請求,等待客戶端的數(shù)據(jù)。如果存活特征返回一個錯誤信息,則將該信息作為讀操作的返回值返回給服務(wù)器。)在狀態(tài)2,錯誤信息類似于“連接超時”。狀態(tài)3則為“連接被對方復(fù)位”。第四種狀態(tài)看起來像連接超時,或者根據(jù)是否收到與該連接相關(guān)的ICMP錯誤信息,而可能返回其它的錯誤信息。

linux內(nèi)核包含對keepalive的支持。其中使用了三個參數(shù):tcp_keepalive_time(開啟keepalive的閑置時 長)tcp_keepalive_intvlkeepalive探測包的發(fā)送間隔)和tcp_keepalive_probes (如果對方不予應(yīng)答,探測包的發(fā)送次數(shù));在liunx中,keepalive是一個開關(guān)選項,可以通過函數(shù)來使能。具體地說,可以使用以下代碼:
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));

當(dāng)tcp檢測到對端socket不再可用時(不能發(fā)出探測包,或探測包沒有收到ACK的響應(yīng)包),select會返回socket可讀,并且在recv時返回-1,同時置上errnoETIMEDOUT。此時TCP的狀態(tài)是斷開的。



keepalive參數(shù)設(shè)置代碼如下:
// 開啟KeepAlive
BOOL bKeepAlive = TRUE;
int nRet = ::setsockopt(socket_handle, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));
if (nRet == SOCKET_ERROR)
{
return FALSE;
}

// 設(shè)置KeepAlive參數(shù)
tcp_keepalive alive_in                = {0};
tcp_keepalive alive_out                
= {0};
alive_in.keepalivetime                
= 5000;                // 開始首次KeepAlive探測前的TCP空閉時間
alive_in.keepaliveinterval        = 1000;                // 兩次KeepAlive探測間的時間間隔
alive_in.onoff                                = TRUE;
unsigned 
long ulBytesReturn = 0;
nRet 
= WSAIoctl(socket_handle, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in),
&alive_out, sizeof(alive_out), &ulBytesReturn, NULL, NULL);
if (nRet == SOCKET_ERROR)
{
return FALSE;
}

開啟Keepalive選項之后,對于使用IOCP模型的服務(wù)器端程序來說,一旦檢測到連接斷開,GetQueuedCompletionStatus函數(shù)將立即返回FALSE,使得服務(wù)器端能及時清除該連接、釋放該連接相關(guān)的資源。對于使用select模型的客戶端來說,連接斷開被探測到時,以recv目的阻塞在socket上的select方法將立即返回SOCKET_ERROR,從而得知連接已失效,客戶端程序便有機(jī)會及時執(zhí)行清除工作、提醒用戶或重新連接。

TCP連接非正常斷開的檢測(KeepAlive探測)

此處的”非正常斷開”指TCP連接不是以優(yōu)雅的方式斷開,如網(wǎng)線故障等物理鏈路的原因,還有突然主機(jī)斷電等原因

有兩種方法可以檢測:1.TCP連接雙方定時發(fā)握手消息 2.利用TCP協(xié)議棧中的KeepAlive探測

第二種方法簡單可靠,只需對TCP連接兩個Socket設(shè)定KeepAlive探測。


在windows下使用,要包含MSTcpIP.h的頭文件。點擊下面的鏈接即可下載這個文件
  MSTcpIP

備注:長連接雖好,但是比較好用但是占用系統(tǒng)資源比較大。個人建議如無特殊需要,用自己的心跳包機(jī)制最好

posted on 2010-02-28 16:04 Benjamin 閱讀(19750) 評論(2)  編輯 收藏 引用 所屬分類: VC

評論

# re: 長連接和Keepalive  回復(fù)  更多評論   

你好, 請問一下 我現(xiàn)在 通過web訪問 apache 然后 apache去交互另外一個server(可能是腳本).需要登錄驗證 然后返回DataInfo.這樣apache接受到信息后 就與另一個server斷開了鏈接。這個server有時候會返回一些必要的信息到apache,但是開始交互的TCP協(xié)議交互完就斷開了。
我先用keepalive 綁定 apache與 交互的另一個server(可能是接口)一直長連接 來實現(xiàn)。
不知道這個可以實現(xiàn)嗎?
2011-08-26 17:45 | veniced

# re: 長連接和Keepalive  回復(fù)  更多評論   

@veniced
可以.
2012-06-11 10:59 | BYHH
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久理论片午夜琪琪电影网| 先锋a资源在线看亚洲| 亚洲高清激情| 国产精品毛片va一区二区三区| 久久国产主播| 欧美午夜精品久久久久久孕妇 | 亚洲黑丝在线| 黄色亚洲精品| 香蕉乱码成人久久天堂爱免费| 99国产精品99久久久久久粉嫩| 久久野战av| 久久久久久久久久看片| 亚洲欧美日韩另类| 一区二区亚洲| 午夜精品久久久久| 欧美日韩国产页| 一区二区久久| 欧美~级网站不卡| 亚洲电影在线观看| 亚洲国产va精品久久久不卡综合| 亚洲资源av| 性欧美精品高清| 蜜月aⅴ免费一区二区三区| 久久综合伊人77777麻豆| 国产伦精品一区二区三区免费迷| 一区二区三区四区蜜桃| 亚洲精品欧美极品| 欧美激情第9页| 亚洲精品少妇| 亚洲黄色在线视频| 欧美激情一区二区| 91久久在线观看| 在线亚洲免费| 国产精品九九| 亚洲女同性videos| 久久国内精品自在自线400部| 国产午夜精品久久久久久免费视| 欧美影院在线| 欧美国产免费| 日韩一区二区久久| 国产精品久久久91| 欧美一区二区精品| 美女在线一区二区| 亚洲精品美女91| 欧美日韩精品一二三区| 一区二区三区四区蜜桃| 久久爱91午夜羞羞| 一区二区三区无毛| 欧美韩国日本综合| 一区二区免费在线播放| 亚洲欧美一区二区激情| 国产午夜精品一区二区三区欧美 | 99热免费精品| 欧美午夜不卡在线观看免费 | 亚洲国产成人一区| 欧美黄色aaaa| 亚洲一区国产| 欧美成人精品影院| 一本色道久久综合亚洲精品小说 | 欧美二区在线看| 日韩视频在线你懂得| 国产精品久久福利| 久久国产精品久久国产精品| 欧美电影免费观看高清完整版| av成人手机在线| 国产欧美一区二区三区久久人妖| 久久国产精彩视频| 亚洲精品一区二区三区婷婷月| 欧美一区二区三区喷汁尤物| 黄色国产精品| 欧美视频日韩| 久久一日本道色综合久久| 亚洲精品综合久久中文字幕| 西西人体一区二区| 亚洲精品乱码久久久久久久久| 欧美性理论片在线观看片免费| 亚洲香蕉视频| 久久免费视频在线| 国产精品99久久99久久久二8 | 1204国产成人精品视频| 亚洲一区二区网站| 欧美高清视频www夜色资源网| 亚洲性色视频| 在线观看日韩一区| 欧美视频在线观看免费网址| 久久久久9999亚洲精品| 日韩视频免费观看| 欧美一区二区三区在| 91久久线看在观草草青青| 国产精品免费看片| 欧美日韩国产一区| 久久免费视频在线| 亚洲一区二区网站| 亚洲黄色在线| 麻豆亚洲精品| 久久精品视频网| 亚洲综合视频1区| 国产日韩亚洲欧美| 欧美日韩亚洲一区二区三区在线观看| 欧美中文字幕在线视频| 亚洲第一精品夜夜躁人人爽| 久久黄色级2电影| 亚洲一区二区高清| 日韩午夜激情| 亚洲欧洲日韩在线| 亚洲第一精品久久忘忧草社区| 国产伦精品一区二区三区照片91| 欧美精品一区在线发布| 久久亚裔精品欧美| 久久精品99国产精品酒店日本| 亚洲天堂黄色| 亚洲日本欧美在线| 亚洲国产精品免费| 欧美高清在线一区二区| 老巨人导航500精品| 久久精精品视频| 亚洲欧美日韩一区二区在线 | 久久久精品一区| 亚洲午夜小视频| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美日韩国产综合视频在线观看 | 美女视频黄 久久| 久久九九精品| 久久精品国内一区二区三区| 欧美一区二区视频观看视频| 最新成人av在线| 亚洲日本久久| 99精品国产在热久久婷婷| 激情成人亚洲| 国产毛片久久| 国产亚洲精品久久飘花 | 欧美在线观看一区二区| 欧美一区二区三区在线免费观看| 亚洲欧美日韩直播| 欧美一区二区三区视频在线观看| 欧美一区二区视频网站| 亚洲国产美女| 亚洲免费在线看| 午夜精品影院在线观看| 欧美在线啊v| 久久视频在线免费观看| 欧美成人a∨高清免费观看| 欧美激情欧美激情在线五月| 亚洲成色www8888| 亚洲国产一区在线| 一本色道久久综合狠狠躁篇怎么玩| 一区二区三区高清不卡| 亚洲女人小视频在线观看| 亚洲一区中文| 久久精品国产91精品亚洲| 免费久久99精品国产自| 欧美日韩国内| 国产伦精品一区二区三区| 国语精品中文字幕| 亚洲激情在线观看视频免费| 在线视频日韩| 亚洲精品久久嫩草网站秘色| 国产精品99久久久久久久久久久久| 午夜在线a亚洲v天堂网2018| 久久视频在线视频| 亚洲精品日产精品乱码不卡| 亚洲一区二区在线免费观看视频 | 99精品视频免费观看视频| 亚洲专区免费| 欧美一区二区视频97| 性欧美激情精品| 欧美va天堂在线| 亚洲天堂av图片| 另类av一区二区| 免费亚洲电影在线观看| 99精品欧美一区二区三区| 久久久久高清| 亚洲一二三区精品| 欧美理论片在线观看| 在线免费观看视频一区| 久久狠狠久久综合桃花| 亚洲视频观看| 欧美日韩午夜视频在线观看| 亚洲国产精品一区二区久| 久久偷窥视频| 欧美在线视频不卡| 国产日韩在线视频| 欧美一级网站| 亚洲永久免费精品| 国产精品久久久久久模特 | 亚洲精品视频啊美女在线直播| 久久亚洲一区| 久久国产精品99国产精| 国产日韩一区二区三区在线| 香蕉久久精品日日躁夜夜躁| 一区二区日本视频| 欧美性理论片在线观看片免费| 一区二区三区回区在观看免费视频| 亚洲国产精品久久久久秋霞蜜臀 | 国产精品99久久99久久久二8 | 国产专区欧美专区| 久久久免费精品视频| 久久精品人人做人人综合| 国产午夜精品一区理论片飘花 | 亚洲欧美激情视频在线观看一区二区三区 |