tcp 不對 ack 報文段進行確認, tcp 只確認那些包含有資料的 ack 報文段。 如果更新視窗確認丟失了,則雙方就有可能因為等待對方而使連線終止:接收方等待接收資料(因為它已經向傳送方通告了乙個非 0的視窗),而傳送方在等待允許它繼續傳送資料的視窗更新。為防止這種死鎖情況的發生,傳送方使用乙個堅持定時器 (persist timer)來周期性地 向接收方查詢,以便發現視窗是否已增大。這些從傳送方發出的報文段稱為視窗探查 ( windowprobe )。
堅持定時器的原理是簡單的,當tcp伺服器收到了客戶端的0滑動視窗報文的時候,就啟動乙個定時器來計時,並在定時器溢位的時候向向客戶端查詢視窗是否已經增大,如果得到非零的視窗就重新開始傳送資料,如果得到0視窗就再開乙個新的定時器準備下一次查詢。通過觀察可以得知,tcp的堅持定時器使用1,2,4,8,16……64秒這樣的普通指數退避序列來作為每一次的溢位時間。
具體詳見 …/test/persisttime.cap
如果 tcp 連線的雙方都沒有向對方傳送資料,則在兩個 tcp 模組之間不交換任何資訊。 這意味著我們可以啟動乙個客戶與伺服器建 立乙個連線,然後離去數小時、數天、數個星期或者數月,而連線依然保持。中間路由器可 以崩潰和重啟,**線可以被結束通話再連通,但是只要兩端的主機沒有被重啟,則連線依然保 持建立。
一般這個功能在服務端使用,檢測客戶端的鏈結狀態。當然客戶端也可以使用
在第1種情況下,伺服器的應用程式沒有感覺到保活探查的發生。 tcp 層負責一切。這個 過程對應用程式都是透明的,直至第 2、3或4種情況發生。在這三種情況下,伺服器應用程式 將收到來自它的 tcp 的差錯報告(通常伺服器已經向網路發出了讀操作請求,然後等待來自 客戶的資料。如果保活功能返回乙個差錯,則該差錯將作為讀操作的返回值返回給伺服器)。 在第2種情況下,差錯是諸如「連線超時」之類的資訊,而在第 3種情況則為「連線被對方復 位」。第4種情況看起來像是連線超時,也可根據是否收到與連線有關的 icmp 差錯來返回其他的差錯。
乙個被人們不斷討論的關於保活選項的問題就是兩個小時的空閒時間是否可以改 變。通常他們希望該數值可以小得多,處在分鐘的數量級。這個值通常可以改變,但是在所有系統中,保活間隔時間是系統級的 變數,因此改變它會影響到所有使用該功能的使用者
cat /proc/sys/net/ipv4/tcp_keepalive_time
#保活時間間隔:預設75秒,總共傳送 9 個這樣的探查,每個間隔 75 秒。如果伺服器沒有收到乙個響應,它就認為客戶主機已經關閉並終止連線。
cat /proc/sys/net/ipv4/tcp_keepalive_intvl
#保活探測數:預設9次
cat /proc/sys/net/ipv4/tcp_keepalive_probes
正常保活包,詳見 …/test/keepalive.cap
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-y0jjjuzw-1611729160755)(./img/keepalive.png)]
網路異常保活嘗試包,詳見 …/test/keepalivecrash.cap
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-ekvxrrpm-1611729160757)(./img/keepalivecrash.png)]
異常後網路恢復保活相應包,詳見 …/test/keepalivereset.cap
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-9xj9ybxw-1611729160758)(./img/keepalivereset.png)]
tcp 提供可靠的運輸層。它使用的方法之一就是確認從另一端收到的資料。但資料和確 認都有可能會丟失。 tcp 通過在傳送時設定乙個定時器來解決這種問題。如果當定時器溢位時還沒有收到確認,它就重傳該資料。對任何實現而言,關鍵之處就在於超時和重傳的策略,即怎樣決定超時間隔和如何確定重傳的頻率。
最初的演算法:
r = k1*r+ (1-k1)m //均值
rto = k2*r //均值直接估算 rto
優化後演算法(結合了方差):
err = m-a
a = a+g*err //均值,等同於 a = a+g(m-a)=(1-g)a+gm,和初始演算法一致,g=1-k1
d = d+h(|err|-d) //均值偏差是對標準偏差的一種好的逼近,等同於 d = (1-h)d+h|m-a|
rto = a+4d //均值和偏差同時估算 rot
具體詳見tcp從建立到終止 的 2.3.1 2msl等待狀態 章節
tcp的超時與重傳
tcp的堅持定時器
tcp的保活定時器
tcp的超時與重傳
TCP的定時器
在tcp協議中有的時候需要定期或者按照某個演算法對某個事件進行觸發,那麼這個時候,tcp協議是使用定時器進行實現的。在tcp中,會有四種定時器 這四個定時器都有各自的具體作用。tcp是可靠的,因此,它對於發出去的資訊,沒有得到正常ack反饋的,都會啟動乙個重傳機制。這個重傳機制使用乙個重傳定時器,當...
TCP的定時器
建立連線定時器 connection establishment timer 重傳定時器 retransmission timer 延遲應答定時器 delayed ack timer 堅持定時器 persist timer 保活定時器 keepalive timer fin wait 2定時器 fi...
TCP的定時器
在tcp協議中有的時候需要定期或者按照某個演算法對某個事件進行觸發,那麼這個時候,tcp協議是使用定時器進行實現的。在tcp中,會有四種定時器 這四個定時器都有各自的具體作用。tcp是可靠的,因此,它對於發出去的資訊,沒有得到正常ack反饋的,都會啟動乙個重傳機制。這個重傳機制使用乙個重傳定時器,當...