【網路】TCP協議中的四大定時器
前言
在TCP連線中,有四大定時器來維持連線的正常執行,這四個定時器分別是超時重傳定時器、堅持定時器、保活定時器以及時間等待計時器
超時重傳定時器
所謂超時重傳,是TCP之所以可靠的一點。該定時器就是當一個TCP報文傳送後,啟動該定時器。
如果在規定時間內,沒有收到該報文的確認序號,便重新傳輸該報文,並將超時重傳定時器重置。
如果在規定時間內收到了對應報文的確認,則撤銷該對該報文的超時重傳定時器。
堅持定時器
堅持定時器是為了解決當滑動視窗為0時而造成死鎖的問題。
當A給B傳送報文中的視窗設定為0時,B便知道A現在不便接受資料,所以會進行等待。
這種情況下,如果A的緩衝區又可以收資料了,並給B傳送了一個視窗非0的報文。
此時,如果該報文不幸丟失了,B便不知道可以給A傳送資料了,A也認為自己已經給B說了。
此刻會造成死鎖的問題。
這裡便引入了堅持定時器,當一方收到視窗為0的報文時,便啟動該定時器。
若定時器時間到了,便傳送0視窗探測報文(該報文只有1位元組的資料)。
對方收到該報文後,會告訴其當前的滑動視窗值,如果還是0,則繼續等待。計時器重置,並加倍,最大時間長度為60秒。
若不為0,則打開了死鎖。
保活定時器
當服務端和客戶端建立連線時,服務端便會維護一個保活定時器。用來防止由於客戶端故障而造成TCP連線無法釋放的情況。
當服務端收到客戶端傳送過來的訊息時,便重置該定時器。
如果該定時器計時達到了兩個小時,便會給客戶端以每75秒傳送一個探測報文,連續傳送10次。
若客戶端還沒有進行相應,則和客戶端斷開連線,防止資源的浪費。
時間等待計時器
我們知道,TCP連結終止的時候需要四次揮手。
當主動斷開的一方A收到被動一方B的第三次揮手FIN報文後,A會發送第四次揮手的ACK報文。
此刻,A便啟動該定時器
(1)為了保證客戶端傳送的最後一個ACK報文段能夠到達伺服器。因為這個ACK有可能丟失,從而導致處在LAST-ACK狀態的伺服器收不到對FIN-ACK的確認報文。伺服器會超時重傳這個FIN-ACK,接著客戶端再重傳一次確認,重新啟動時間等待計時器。最後客戶端和伺服器都能正常的關閉。假設客戶端不等待2MSL,而是在傳送完ACK之後直接釋放關閉,一但這個ACK丟失的話,伺服器就無法正常的進入關閉連線狀態。
(2)他還可以防止已失效的報文段。客戶端在傳送最後一個ACK之後,再經過經過2MSL,就可以使本連結持續時間內所產生的所有報文段都從網路中消失。從保證在關閉連線後不會有還在網路中滯留的報文段去騷擾伺服器。