tcp 是提供可靠的傳輸層,它使用的方法之一就是確認從另一端收到的資料。但是資料和確認都可能會丟失。tcp 通過在傳送時設定乙個定時器來解決這個問題。如果當定時器溢位時還沒收到確認,它就會重傳該資料。關鍵在於超時和重傳策略,即怎樣決定超時的時間間隔和如何確定重傳的頻率。
1、tcp 通過以下方式提供可靠性:
◆ 應用程式分割為tcp認為最合適傳送的資料塊。由tcp傳遞給ip的資訊單位叫做報文段。
◆ 當tcp發出乙個報文段後,它啟動乙個定時器,等待目的端確認收到這個報文段。如果不能記時收到乙個確認,它 就重發這個報文段。
◆ 當tcp收到發自tcp連線另一端的資料,它將傳送乙個確認。這個確認不是立即傳送,通常延遲幾分之一秒。
◆tcp將保持它首部和資料的檢驗和。這是乙個端到端的檢驗和,目的是檢測資料在傳輸過程中的任何變化如果收到報文段的檢驗和有差錯,tcp將丟棄這個報文段和不確認收到這個報文段。
◆ 既然tcp報文段作為ip資料報來傳輸,而ip資料報的到達可能失序,因此tcp報文段的到達也可能失序。如果必要,tcp將對收到的資料進行排序,將收到的資料以正確的順序交給應用層。
◆ 既然ip資料報會發生重複,tcp連線端必須丟棄重複的資料。
◆tcp還能提供流量控制,tcp連線的每一方都有固定大小的緩衝空間。tcp的接收端只允許另一端傳送接收端緩衝區所能接納的資料。這將防止較快主機致使較慢主機的緩衝區溢位。
2.對於每個連線,tcp 管理著四個不同的定時器:重傳定時器、堅持定時器、保活定時器 以及 2msl 定時器。
重傳定時器
為了防止丟失資料報文段或確認報文段,當 tcp 傳送報文段時,啟動了特定報文段的重傳計時器,若在計時器超時之前收到對報文段的確認,則撤銷計時器。若收到特定報文段的確認之前計時器已經超時,則重傳該報文,並把計時器復位。這裡最重要的是超時的時間計算,有關該時間的請查閱具體的演算法,這裡不再進行記錄。
堅持定時器
堅持定時器主要是解決零視窗大小通知可能導致的死鎖問題。剛開始接收端向傳送端傳送了乙個零視窗報文段。在不久之後,如果接收端的快取區有一定的空間可以接收資料,此時接收端就會向傳送端傳送了乙個非零視窗大小的報文段(即視窗更新),但是這個非零視窗大小的報文段在傳輸過程中丟失,導致傳送端無法接收到該非零視窗大小的報文段。因此,傳送端就會一直處於等待非零視窗大小的報文端通知,由於接收端已經傳送了非零視窗大小的報文段,而且並不知道該報文段在傳輸過程中丟失,則接收端會一直處於等待接收資料狀態,如果沒有任何措施的話,這個死鎖的局面會一直延續下去。
為了解決上面這個問題,tcp 為每乙個連線設有乙個堅持定時器(也叫持續計數器)。當傳送端收到零視窗的確認時,就啟動堅持計時器,當堅持計時器截止期到時,傳送端就傳送乙個特殊的報文段,叫探測報文段,這個報文段只有乙個位元組的資料。探測報文段有序號,但序號永遠不需要確認,甚至在計算對其他部分資料的確認時這個序號也被忽略。探測報文段提醒接收端,確認已丟失,必須重傳。
堅持計時器的截止期設定為重傳時間的值,但若沒有收到來自接收端的響應,則傳送另乙個探測報文段,並將堅持計時器的值加倍和並復位,傳送端繼續傳送探測報文段,將堅持計時器的值加倍和復位,直到這個值增大到閾值為止(通常為 60 秒)。在此之後,傳送端每隔 60s 就傳送乙個報文段,直到視窗重新開啟為止。
堅持定時器的原理:當 tcp 伺服器收到了客戶端的 0 滑動視窗報文時,啟動乙個定時器來計時,並在定時器溢位的時向客戶端查詢視窗是否已經增大,如果得到非零的視窗就重新開始傳送資料,如果得到零視窗就再開乙個新的定時器準備下一次查詢。
保活定時器
保活定時器是為了應對 tcp 連線雙方出現長時間的沒有資料傳輸的情況。如果客戶端與伺服器建立了 tcp 連線之後,客戶端由於某種原因導致主機故障,則伺服器就不能收到來自客戶端的資料,而伺服器不可能一直處於等待狀態,保活定時器就是用來解決這個問題的。伺服器每收到一次客戶端的資料,就重新設定保活定時器,通常為 2 小時,如果 2 小時沒有收到客戶端的資料,服務端就傳送乙個探測報文,以後每隔75秒傳送一次,如果連續傳送10次探測報文段後仍沒有收到客戶端的響應,伺服器就認為客戶端出現了故障,就可以終止這個連線。
2msl 定時器
2msl 定時器主要是解決以下兩種情況:
time_wait 確保有足夠的時間讓對端收到了ack,如果被動關閉的那方沒有收到 ack,就會觸發被動端重發 fin。因為最後一次確認應答 ack 報文段很有可能丟失,因而使被動關閉方處於在list_ack 狀態的,此時被動關閉方會重發這個 fin+ack 報文段,在這等待的 2msl 時間內主動關閉方重新收到這個被動關閉方重發的 fin+ack 報文段,因此,主動關閉方會重新傳送確認應答資訊,從而重新啟動 2msl 計時器,直到通訊雙方都進入 closed 狀態。如果主動關閉方在 time_wait 狀態不等待一段時間就直接釋放連線並進入 closed 狀態,那麼主動關閉方無法收到來自被動關閉方重發的 fin+ack 報文段,也就不會再傳送一次確認 ack 報文段,因此被動關閉方就無法正常進入closed 狀態。
有足夠的時間讓這個連線不會跟後面的連線混在一起。防止已失效的請求連線出現在本連線中。在連線處於 2msl 等待時,任何遲到的報文段將被丟棄,因為處於 2msl等待的、由該插口(插口是ip和埠對的意思,socket)定義的連線在這段時間內將不能被再用,這樣就可以使下乙個新的連線中不會出現這種舊的連線之前延遲的報文段。
網路基礎 TCP連線
所謂三次握手 three way handshake 是指建立乙個tcp連線時,需要客戶端和伺服器總共傳送3個包。如圖1所示。圖1 三次握手建立tcp連線的各狀態 1 第一次握手 建立連線時,客戶端a傳送syn包 syn 1,seq x 到伺服器b,並進入syn send狀態,等待伺服器b確認。2 ...
tcp網路程式設計基礎
1.tcp客戶端 from socket import 建立socket tcp client socket socket af inet,sock stream 目的資訊 server ip input 請輸入伺服器ip server port int input 請輸入伺服器port 鏈結伺服器...
網路基礎 TCP協議
1 什麼是tcp協議 tcp是傳輸層最重要和最常用的協議 它提供一種面向連線的 可靠的 位元組流資料傳輸服務。2 tcp協議的特性 3 tcp協議的功能 1 tcp建立連線 由客戶端主動發起連線 三次握手建立連線 半開連線 一般將伺服器收到syn而未收到客戶端的ack時的連線狀態稱為半開連線。為什麼...