1. 程式人生 > >TCP keepAlive詳解(TCP心跳包)

TCP keepAlive詳解(TCP心跳包)

TCP keepAlive含義:

在TCP中有一個Keep-alive的機制可以檢測死連線,原理很簡單,TCP會在空閒了一定時間後傳送資料給對方:

1.如果主機可達,對方就會響應ACK應答,就認為是存活的。
2.如果可達,但應用程式退出,對方就發RST應答,傳送TCP撤消連線。
3.如果可達,但應用程式崩潰,對方就發FIN訊息。

4.如果對方主機不響應ack, rst,繼續傳送直到超時,就撤消連線。這個時間就是預設的二個小時。

在一個正常的TCP連線上,當我們用無限等待的方式呼叫下面的Recv或Send的時候:

   ret=recv(s,&buf[idx],nLeft,flags);

   或

   ret=send(s,&buf[idx],nLeft,flags);

   如果TCP連線被對方正常關閉,也就是說,對方是正確地呼叫了closesocket(s)或者shutdown(s)的話,那麼上面的Recv或Send呼叫就能馬上返回,並且報錯。這是由於closesocket(s)或者shutdown(s)有個正常的關閉過程,會告訴對方“TCP連線已經關閉,你不需要再發送或者接受訊息了”。但是,如果是網線突然被拔掉,TCP連線的任何一端的機器突然斷電或重啟動,那麼這時候正在執行Recv或Send操作的一方就會因為沒有任何連線中斷的通知而一直等待下去,也就是會被長時間卡住。這種情形解決的辦法是啟動TCP程式設計裡的keepAlive機制。

    struct TCP_KEEPALIVE inKeepAlive = {0};
    unsigned long ulInLen = sizeof(struct TCP_KEEPALIVE);
    struct TCP_KEEPALIVE utKeepAlive = {0};
    unsigned long ulOutLen = sizeof(struct TCP_KEEPALIVE);
    unsigned long ulBytesReturn = 0;

    inKeepAlive.onoff=1;
    inKeepAlive.keepaliveinterval=5000; //單位為毫秒
    inKeepAlive.keepalivetime=1000;      //單位為毫秒
    ret=WSAIoctl(s, SIO_KEEPALIVE_VALS, (LPVOID)&inKeepAlive, ulInLen, 
                          (LPVOID)&outKeepAlive, ulOutLen, &ulBytesReturn, NULL, NULL);

   此處的keepalivetime表示的是TCP連線處於暢通時候的探測頻率,一旦探測包沒有返回,就以keepaliveinterval的頻率傳送,經過若干次的重試,如果探測包都沒有返回,那麼就得出結論:TCP連線已經斷開,於是上面的Recv或Send呼叫也就能馬上返回,不會無限制地卡住了。

  上圖是對上面文字的說明。亮條之前,TCP處於暢通狀態,KeepAlive是以1000毫秒(keepalivetime的值)的頻率傳送探測包,在傳送到第32個探測包的時候,探測包沒有返回,於是就以5000毫秒(keepalivetime的值)的頻率傳送探測包,重發幾次後,探測包都沒有返回,於是就得出結論:此TCP連線已經斷開了!

對於Win2K/XP/2003,可以從下面的登錄檔項找到影響整個系統所有連線的keepalive引數:


[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]

“KeepAliveTime”=dword:006ddd00
“KeepAliveInterval”=dword:000003e8
“MaxDataRetries”=”5″

  對於實用程式來說,2小時的空閒時間太長。因此,我們需要手工開啟Keepalive功能並設定合理的Keepalive引數。在XP和WIN2003系統上,可以針對單獨的socket來設定,但是在windows 2000,不能單獨設定,如果設定,那麼影響是整個系統的所有socket。


相關推薦

TCP keepAliveTCP心跳

TCP keepAlive含義: 在TCP中有一個Keep-alive的機制可以檢測死連線,原理很簡單,TCP會在空閒了一定時間後傳送資料給對方: 1.如果主機可達,對方就會響應ACK應答,就認為是存活的。 2.如果可達,但應用程式退出,對方就發RST應答,傳送TCP撤消

TCP協議TCP報文、三次握手、四次揮手、TIME_WAIT狀態、滑動視窗、擁塞控制、粘問題、狀態轉換圖

一、TCP報文 【重要的欄位】: 序號:Seq序號,佔32位,用來標識從TCP源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記; 確認序號:Ack序號,佔32位,只有ACK標誌位為1時,確

TCP協議TCP建立連接與斷開連接

想要 第一次 客戶端 單向 特點 mar image 端口 二次 TCP是面向連接的、可靠的進程到進程通信的協議。它提供的是全雙工(雙向可傳輸)的服務,每個TCP都有發送緩存和接受緩存,用來臨時存儲數據。 1、TCP報文段:TCP把若幹個字節構成一個分組,稱為報文段(se

TCP/IP --Internet地址結構

IP地址用於識別和定位整個Internet系統(單播地址)中裝置的網路介面。也用於識別多個介面(組播、廣播和任播地址)。 一、IP地址表示 IPv4 32位,點位法 0.0.0.0 二進位制00000000 00000000 00000000 00000000

TCP協議理論篇

1.    與UDP不同的是,TCP提供了一種面向連線的、可靠的位元組流服務。面向連線比較好理解,就是連線雙方在通訊前需要預先建立一條連線,這猶如實際生活中的打電話。助於可靠性,TCP協議中涉及了諸多規則來保障通訊鏈路的可靠性,總結起來,主要有以下幾點:       (1

TCP/IP---ICMP:Internet控制報文協議

基本概念 ICMP(Internet Control Message Protocol,網路控制報文協議),屬於OSI七層模型中的網路層,與IP/UDP同屬一層,可以將其看成IP、UDP協議功能的一個補充,因為以前說過,IP協議是不可靠的,其可靠性需藉

TCP/IP---UDP:使用者資料報協議

什麼是UDP? UDP(User Datagram Protocol),即使用者資料報協議。工作在OSI七層模型的傳輸層,不同於TCP提供可靠的端到端連線,UDP不可靠,無需在客戶和伺服器之間建立一個連線,且沒有超時重發等機制,QQ訊息就是一種顯著的U

TCP/IP -- 基本概念

一、什麼是TCP/IP TCP/IP是一組協議的代名詞,包括許多別的協議,組成了TCP/IP協議簇。TCP/IP 採納了ARPANET參考模型,將協議分為4層。 二、 ARPANET參考模型 編號 名稱 描述/例子 . 7 應用層 實質上是Int

TCP協議含長連線短連線的

1. TCP連線 當網路通訊時採用TCP協議時,在真正的讀寫操作之前,server與client之間必須建立一個連線,當讀寫操作完成後,雙方不再需要這個連線時它們可以釋放這個連線,連線的建立是需要三次握手的,而釋放則需要4次握手,所以說每個連線的建立都是需要資源消耗和時間消耗的 經典的三次握手示意圖: 經

TCP協議TCP Flag標誌位來判斷TCP會話的開始和結束

首先回顧一下TCP標誌位的具體含義。 TCP Flag標誌位(控制位) 一個TCP包的詳細內容: TCP FLAG 標記佔1.5個byte,12bit(4bit+8bit,前半個byte與Header Length公用)。 12bit中前三個bit是保留,預設為全0

Windows下VTK6.0.0安裝CMake使用說明

操作 工具 generate 其中 con htm 目錄下的文件 ima 新建 操作系統:Windows7,用到工具:Visual studio、CMake。 1.準備工作 VTK下載: 下載最新VTK穩定版(6.0.0,截至2013年7月)http://www.vtk

HTTP協議真的很經典

cnp 運用 web應用 media 服務器端 所有 長度 request bad 轉載:http://e7kan.com/?p=264& 引言 HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分布式超媒體信息系統。它於1990年提出,經過幾

PCA 主成分分析 寫給初學者 結合matlab轉載

整數 變量 行為 保持 sum osc 入參 函數 data 一、簡介 PCA(Principal Components Analysis)即主成分分析,是圖像處理中經常用到的降維方法,大家知道,我們在處理有關數字圖像處理方面的問題時,比如經常用的圖像的查詢

HTTP協議狀態碼HTTP Status Code

找不到 work for 條件 暫時 ocs 有效 網絡設備 不同 使用ASP.NET/PHP/JSP 或者javascript都會用到http的不同狀態,一些常見的狀態碼為: 200 – 服務器成功返回網頁 404 – 請求的網頁不存在 503 – 服務不可用 1x

C#漢字轉換拼音技術高性能

rim none pie 存在 asp pub net 如果 pinyin public static class ChineseToPinYin { private static readonly Dictionary<<span class=

TestNG單元測試框架

參數 http () 彈出 內容 name led 大小 2.4 一、TestNG的優點   1.1 漂亮的HTML格式測試報告   1.2 支持並發測試   1.3 參數化測試更簡單   1.4 支持輸出日誌   1.5 支持更多功能的註解 二、編寫TestNG測試

php文件上傳原理含源碼

輸入數據 最大值 cut 產生 har 默認值 接受 上傳文件 tle 1、文件上傳原理   將客戶端的文件上傳到服務器,再將服務器的臨時文件上傳到指定目錄 2、客戶端配置 提交表單 表單的發送方式為post 添加enctype="multipart/form-data"

HTML5+Canvas開發第2版.pdf

繪圖 blog ipa img script 必備 交互式 src 教程 通過HTML5+Canvas開發詳解(第2版),你將學到如何使用Canvas進行繪圖、渲染文字、處理圖像、創建動畫,而這些是開發交互式Web遊戲的必備知識。 本書針對Canvas和HTML5技

sarlinux/unix通用

註意 命令 有效時間 命令行 數組 its 寫到 .html AI 轉載:http://www.toxingwang.com/linux-unix/2027.html sar是linux和unix通用的性能報告工具,常用命令組合如下: sar 命令行的常用格式: sar

操作系統Lab1 boot|kern/debug

segment frame gin tabs program its 內容 AC 描述 總體 : boot kern libs tools boot asm.h bootmain.c bootasm.S asm.h 匯編頭文件 SEG_NULLASM 定義一個空段描述符 S