TCP定時器

1. TCP中7種定時器

?TCP中有7中定時器

(1)建立連接定時器(connection-establishment timer)

(2)重傳定時器(retransmission timer)

(3)延遲應答定時器(delayed ACK timer)

(4)堅持定時器(persist timer)

(5)保活定時器(keepalive timers)

(6)FIN_WAIT_2定時器(FIN_WAIT_2 timer)

(7)TIME_WAIT定時器(TIME_WAIT timer,也叫2MSL timer)

2. 建立連接定時器(connection-establishment timer)

這個定時器是在建立連接的時候使用的,TCP建立連接需要3次握手,如圖:

?

建立連接的過程中,在發送SYN時,會啟動一個定時器(默認應該是3秒),如果SYN包丟失了,那么3秒以后會重新發送SYN包(當然還會啟動一個新的定時器,設置成6秒超時),當然也不會一直沒完沒了的發SYN包,在/proc/sys/net/ipv4/tcp_syn_retries可以設置到底要重新發送幾次SYN包。如圖:

3. 重傳定時器(retransmission timer)

重傳定時器在TCP發送數據時設定,在計時器超時后沒有收到返回的確認ACK,發送端就會重新發送隊列中需要重傳的報文段。使用RTO重傳計時器一般有如下規則:
(1)當TCP發送了位于發送隊列最前端的報文段后就啟動這個RTO計時器
(2)如果隊列為空則停止計時器,否則重啟定時器
(3)當計時器超時后,TCP會重傳發送隊列最前端的報文段
(4)當一個或多個報文段被累計確認后,這個貨這些報文段會被清除出隊列
重傳計時器保證了接收端能夠接收到丟失的報文段,繼而保證了接收端交付給接收進程的數據始終是有序完整的。因為接收端永遠不會把一個失序不完整的報文段交付給接收進程。

4. 延遲應答定時器(delayed ACK timer)

延遲應答也被稱為捎帶ACK,這個定時器是在延遲應答的時候使用的。為什么要延遲應答呢?延遲應答是為了提供網絡傳輸的效率。
舉例說明,比如服務端收到客戶端的數據后,不是立刻回ACK給客戶端,而是等一段時間(一般最大200ms),這樣如果服務端要是有數據需要發給客戶端,那么這個ACK就和服務端的數據一起發給客戶端了,這樣比立即給客戶端一個ACK節省了一個數據包。

5. 堅持定時器(persist timer)

TCP通過讓接收方指明希望從發送方接收的數據字節數(即窗口大小)來進行流量控制。如果窗口大小為0會發生什么情況呢?這將有效地阻止發送方傳送數據,直到窗口變為非0為止。接收端窗口變為非0后,就會發送一個確認ACK指明需要的報文段序號以及窗口大小。
如果這個確認ACK丟失了,則雙方就有可能因為等待對方而使連接終止:接收方等待接收數據(因為它已經向發送方通告了一個非0的窗口),而發送方在等待允許它繼續發送數據的窗口更新。為防止這種死鎖情況的發生,發送方使用一個堅持定時器(persist timer)來周期性地向接收方查詢,以便發現窗口是否已增大。這些從發送方發出的報文段稱為窗口探查(window probe)。

6. 保活定時器(keepalive timer)

許多TCP/IP的初學者會很驚奇地發現可以沒有任何數據流通過一個空閑的TCP連接,也就是說,如果TCP連接的雙方都沒有向對方發送數據,則在兩個TCP模塊之間不交換任何信息。
兩個應用進程--客戶進程或服務器進程都沒有使用應用級的定時器來檢測非活動狀態,而這種非活動狀態可以導致應用進程中的任何一個終止其活動。
許多時候服務器希望知道客戶主機是否崩潰并關機或崩潰又重新啟動,許多實現提供的保活定時器可以提供這種能力。
保活功能主要是為服務器應用程序提供的,服務器應用希望知道客戶主機是否崩潰。保活功能試圖在服務器端檢測到這種半開放的連接。

如果一個給定的連接在兩個小時之內沒有任何動作,則服務器就向客戶發送一個探查報文段,客戶主機必須處于一下4個狀態之一:
(1)客戶主機依然正常運行,并從服務器可達。客戶端TCP響應正常,而服務器也知道對方是正常工作的。服務器在兩個時以后將保活定時器復位。如果在兩個小時定時器到時間之前有應用程序的通信量通過此鏈接,則定時器在交換數據后的未來2小時再復位
(2)客戶主機已經崩潰,并且關閉或正在重新啟動。在任何一種情況下,客戶的TCP都沒有響應,服務器將不能夠收到探查的響應。--會返回諸如“連接超時”之類的信息。
(3)客戶主機崩潰并已經重新啟動。這時服務器將收到一個對其保活探查的響應,但是這個響應是一個復位,使得服務器終止這個連接。 -- 會返回諸如“連接被對方復位”
(4)客戶主機正常運行,但是從服務器不可達。與(2)相同。

在TCP連接建立的時候指定了SO_KEEPALIVE,保活定時器才會有效。如果客戶端和服務端長時間沒有數據交互,那么需要保活定時器來判斷是否對端還活著,但是這個其實很不實用,因為默認是2小時沒有數據交互才探測,時間實在是太長了。如果你真的要確認對端是否活著,那么應該自己實現心跳包,而不是依賴于這個保活定時器。

7. FIN_WAIT_2定時器(FIN_WAIT_2 timer)

主動關閉的一段調用完close之后(即發FIN給被動關閉的一段,并且收到其對FIN的確認ACK)則進入FIN_WAIT_2狀態。如果這個時候因為網絡突然斷掉,被動關閉的一段宕機等原因,導致主動關閉的一段不能收到被動關閉的一段發來的FIN,主動關閉的一端總不能一直等著,占用資源不釋放吧。這個時候就需要FIN_WAIT_2定時器出馬了,如果在該定時器超時的時候,還是沒收到被動關閉一端發來的FIN,那么不好意思,不等了,直接釋放這個連接。FIN_WAIT_2定時器的時間可以從/proc/sys/net/ipv4/tcp_fin_timeout中查看和設置。如圖:

8. TIME_WAIT定時器(TIME_WAIT timer,也叫2MSL timer)

TIME_WAIT是主動關閉連接的一端之后進入的狀態,而不是直接變成CLOSED的狀態,為什么呢?
(1)萬一被動關閉的一端在超時時間內沒有收到最后一個ACK,則會重發最后的FIN,2MSL(報文段最大生存時間)等待時間保證了重發的FIN會被主動關閉的一端收到且重新發送最后一個ACK
(2)另一個原因是在2MSL等待時間內,任何遲到的報文段會被接收并丟棄,防止老的TCP連接的包在新的TCP連接里出現。不可避免,在這個2MSL等待時間呢,不會建立同樣(源IP、源端口、目的IP、目的端口)的連接。

?

轉載于:https://www.cnblogs.com/lujiango/p/10494850.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252200.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252200.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252200.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sql優化大全

1. 優化SQL步驟 1. 通過 show status和應用特點了解各種 SQL的執行頻率 通過 SHOW STATUS 可以提供服務器狀態信息,也可以使用 mysqladmin extende d-status 命令獲得。 SHOW STATUS 可以根據需要顯示 session 級別的統計結果和 global級別的統計結果。 如顯示當前s…

Halcon實現邊緣提取

一、邊緣提取 1、設置ROI興趣區域 2、快速二值化,并連接相鄰區域。 這樣做的目的是進一步減少目標區域,通過二值化將目標區域大概輪廓提取出來 3、提取最接近目標區域的輪廓 常用函數有boundary,gen_contour_region_xld 4、根據自己的需求提取…

軟件工程網絡15個人閱讀作業1 201521123038 游舒婷

軟件工程網絡15個人閱讀作業1 201521123038 游舒婷 1.博客園地址 sakurai3104 2.碼云地址 sakurai3104 3.閱讀與思考 (1)回想一下你初入大學時對網絡工程專業的暢想 當初你是如何做出選擇網絡工程專業的決定的? 填報志愿的時候,大…

18LaTeX學習系列之---LaTeX的參考文獻

目錄 目錄前言(一)簡單的參考文獻1.說明2.源代碼3.輸出效果(二)以文件管理的方式1.說明:2.源代碼:3.輸出效果(三)直接從源網站獲取1.說明2.操作目錄 本系列是有關LaTeX的…

Vue 2.0 v-for 響應式key, index及item.id參數對v-bind:key值造成差異研究

Vue 2.0 v-for 響應式key, index及item.id參數對v-bind:key值造成差異研究 在github上閱覽README.md以獲得最佳閱讀體驗,點這里 v-for響應式key, index及item.id參數對v-bind:key值造成差異研究 實驗背景 通常情況下,我們渲染一個li列表,采用…

halcon edges_sub_pix算子

轉載http://blog.51cto.com/juwen/133003 介紹一下Canny算子: 使用累計直方圖計算兩個閥值。凡是大于高閥值的一定是邊緣; 凡是小于低閥值的一定不是邊緣;如果檢測結果大于低閥值但又小于高閥值,那就要看這個像素的鄰接像素中有…

Python 基礎(常用數據結構)

常用數據結構 1)元組 元組是一種靜態的數據結構,無法修改,若要修改只能重新生成新的元組。 輸出結果: 元組元素的獲取是通過索引值去獲得的;例如上面的tup1[0]返回apple;另外你可以直接把tup1一次性賦給多個…

Java IO(二)——RandomAccessFile

一、RandomAccessFile RandomAccessFile類可以說是Java語言中功能最為豐富的文件訪問類,它提供了眾多的文件訪問方法。RandomAccessFile類支持"隨機訪問"方式,可以跳轉到文件的任意位置處讀寫數據。要訪問一個文件的時候,不想把文件…

halcon select_shape_xld按區域大小描繪xld

常用與對xld進行以面積、長、寬進行XLD的選擇操作。 select_shape_xld(XLD : SelectedXLD : Features, Operation, Min, Max : ) XLD:需要選擇的xld SelectedXLD:選擇后的xld Features:面積、長、高等 Operation:and、or等 Min:最小值門…

工業三防手持終端如何選

物聯宇手持終端作為工業級的數據采集器,目前[]()已廣泛應用在物流快遞、生產制造、零售、醫療、公共事業等領域。由于工業環境的復雜性,手持終端在惡劣的環境下作業,在性能、穩定性、電池耐用性上的要求都較高,同時還必須采用一些…

centos7 安裝python3

1.查看是否已經安裝Python CentOS 7.2 默認安裝了python2.7.5 因為一些命令要用它比如yum 它使用的是python2.7.5。 使用 python -V 命令查看一下是否安裝Python 然后使用命令 which python 查看一下Python可執行文件的位置 可見執行文件在/usr/bin/ 目錄下,切換到該…

centos svn 的搭建

一. SVN 簡介 Subversion(SVN) 是一個開源的版本控制系統, 也就是說 Subversion 管理著隨時間改變的數據。 這些數據放置在一個中央資料檔案庫(repository) 中。 這個檔案庫很像一個普通的文件服務器, 不過它會記住每一次文件的變動。 這樣你就可以把檔案恢復到舊的版本, 或是瀏…

halcon邊緣提取和檢測常用方法

轉自:http://blog.csdn.net/Bob_qiuxu/article/details/46924969 一、邊緣提取 1、設置ROI興趣區域 2、快速二值化,并連接相鄰區域。 這樣做的目的是進一步減少目標區域,通過二值化將目標區域大概輪廓提取出來 3、提取最接近目標區域的輪廓…

oracle sqlplus常用命令

轉自:https://www.cnblogs.com/wdx8927304/p/7927613.html 一、sys用戶和system用戶Oracle安裝會自動的生成sys用戶和system用戶(1)、sys用戶是超級用戶,具有最高權限,具有sysdba角色,有create database的權限,該用戶默…

使用css繪制小三角

<div style"width:0;height:0;overflow: hidden;border-top:4px solid transparent;border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid red; "></div>轉載于:https://www.cnblogs.com/boonook/p/8570442.h…

C#與halcon聯合開發——內存溢出

1.對所以的局部零時變量HObject類的使用前后都加Dispose(); 2.對全局的HObject類變量進行如下定義 HObject liveImage null;HObject ExpGet_liveImage(){return liveImage;}void ExpSet_liveImage(HObject obj){if (liveImage ! null)liveImage.Dispose();liveImage obj.Cop…

點擊跳轉到QQ聊天界面

<!--//需要添加好友驗證--><a href"tencent://message/?uinQQ號碼&Site&Menuyes"><img src"需要點擊的圖片" width"80"/></a><!--不需要添加好友驗證--><a href"tencent://message/?Menuyes&am…

學習React的一知半解

① 初探 HMTL的渲染過程 ? 這個結構化文本就是 HTML 文本&#xff0c; HTML 中的每個元素都對應 DOM中某個節點&#xff0c;這樣&#xff0c;因為 HTML 元素的逐級包含關系&#xff0c; DOM 節點自然就構成了一個樹形結構&#xff0c;稱為 DOM 樹 。 ? 瀏覽器為了渲染 HTML 格…

DataTable 轉為ListT集合

public static List<T> HubbleTableToList<T>(this DataTable dt) where T:Class{List<T> _list new List<T>();if (dt null) return _list;T model;foreach (DataRow dr in dt.Rows)//進行循環dataTable行數據{model Activator.CreateInstance<…

工業相機與鏡頭分辨率匹配

// 轉自 奧普特講述工業相機與鏡頭分辨率匹配的技術方案 隨著機器視覺行業的發展&#xff0c;為了更好的滿足廣大客戶選配合適鏡頭的需求&#xff0c;奧普特自動化科技有限公司為您簡述工業相機如何選配合適的鏡頭&#xff0c;以及在相機與鏡頭的分辨率匹配方面的技術方案。 …