乙個tcp連線由乙個4元組構成,它們分別是兩個ip位址,兩個埠號。即乙個tcp連線是由一對端點或套接字構成,其中通訊的每一端都由一對(ip位址,埠號)所唯一標識。
乙個tcp連線通常分為3個階段:啟動、資料傳輸和退出
tcp開啟與關閉
下圖是乙個典型的tcp連線的建立和關閉過程:
為了建立乙個tcp連線,需要完成以下步驟:
1.主動開啟者(客戶端)傳送乙個syn報文段(即乙個在tcp頭部的syn欄位位置的tcp/ip資料報),並指明自己想要連線的埠號和它的客戶端初始序列號(即為isn(c))。通常,客戶端還會藉此傳送乙個或多個選項。客戶端傳送的這個syn報文段稱作段1。
2.伺服器也傳送自己的syn報文段作為響應,幷包含了它的初始序列號(isn(s))。該段稱作段2。另外,為了確認客戶端的syn,伺服器將其包含的isn(c)數值加1作為返回的ack數值。因此,每傳送乙個syn,序列號就會自動加1。這樣如果出現丟失的情況,該syn段將會重傳。
3.為了確認伺服器的syn,客戶端將isn(s)的數值加1後作為返回的ack數值,這稱作段3。
通過傳送上述三個報文段就能完成乙個tcp連線的建立,通常稱為三次握手。三次握手的目的不僅在於讓通訊雙方了解乙個連線正在建立,還在於利用資料報的選項來承載特殊的資訊,交換初始序列號。
tcp協議規定通過傳送乙個fin段來發起關閉操作,只有當連線雙方都完成關閉操作後,才構成乙個完整關閉:
1. 連線的主動關閉者傳送乙個fin段指明接受者希望看到自己當前的序列號k。fin段還包含了乙個ack段用於確認對方最近一次發來的資料(記為l)。
2. 連線的被動關閉者將k的數值加1作為響應的ack值,以表明它已經成功接收到主動關閉者傳送的fin。此時,上層的應用程式會被告知連線的另一端已經提出了關閉的請求。通常,這將導致應用程式發起自己的關閉操作。接著,被動關閉者將身份轉變為主動關閉者,並傳送自己的fin。該報文段的序列號為l。
3. 為了完成連線的關閉,最後傳送的報文段還包含乙個ack用於確認上乙個fin。值得注意的是,如果出現fin丟失的情況,那麼傳送方將重新傳輸直到接收到乙個ack確認為止。
綜上所述,建立乙個tcp連線需要3個報文段,而關閉乙個tcp連線需要4個報文段。
tcp半關閉
伯克利套接字的api提供了半關閉操作,應用程式只需要呼叫shutdown()函式來代替基本的close()函式。
首先傳送的兩個報文段與tcp正常關閉完全相同:初始者傳送的fin,接著是接收者回應該fin的ack。由於接收到半關閉的一方仍能傳送資料,當接收半關閉一方完成資料傳送後,它將會傳送乙個fin來關閉本方的連線,同時向發起半關閉的應用程式發出乙個檔案尾指示。當第2個fin被確認後,整個連線完全關閉。
tcp同時開啟與關閉
乙個同時開啟過程需要交換4個報文段,比普通的三次握手增加了乙個。由於通訊雙方都扮演了客戶端與伺服器的角色,因此不能夠將任何一方稱作客戶端或伺服器。
tcp狀態轉換圖
tcp狀態轉換圖。箭頭表示因報文段傳輸、接收以及計時器超時而引發的狀態裝換。紅色粗箭頭表示典型的客戶端行為,綠色虛箭頭表示典型的伺服器行為。
初始化時,tcp從closed狀態啟動。通常根據是執行主動開啟操作還是被動開啟操作,tcp將分別快速轉換到syn_sent或listen狀態。
導向established狀態的兩種轉換與開啟乙個連線相關,從established狀態匯出的兩種轉換則用於終止乙個連線。establishted是通訊雙方傳輸資料的狀態。
fin_wait_1、fin_wait_2以及time_wait狀態用乙個方框括起來(至少是部分被括起來),稱作主動關閉。另外兩個狀態(close_wait、last_ack)被括起來,稱為被動關閉。
TCP連線建立與終止
目錄 tcptcp連線建立 三次握手 tcp連線終止 四次揮手 tcp的狀態變遷圖 tcp是乙個全雙工的 面向連線的 可靠地傳輸協議,所以無論哪一方向另一方傳送資料之前,都需要先在兩者之間建立乙個連線 基於全雙工通訊所以存在tcp的半關閉狀態,也就是說斷開連線必須是雙方都關閉,否則就說這種狀態為半關...
TCP連線的建立與終止
上圖可見tcp三次握手過程。其中需要注意的是步驟一 syn 1且ack 0。syn為1時,源於協議的設計syn和fin各佔乙個位元組的序號。且步驟一和步驟二進行同步請求時,syn為1,之後syn為0。因為網路原因,可能客戶a向伺服器b傳送了乙個syn同步請求連線在網路中滯留了一會。然而客戶a在超時重...
TCP連線的建立與終止
img tcp連線的建立與終止 下面是tcp連線建立與終止的時候的時序圖 img 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線 1 第一次握手 建立連線時,客戶端a傳送syn包 syn j 到伺服器b,並進入syn send狀態,等待伺服器b確認。2 第二次握手 伺服...