1.tcp連線的建立
(1)首先是伺服器初始化的過程,從
closed
(關閉)狀態開始通過順序呼叫
socket
、bind
、listen
和accept
原語建立
socket
套接字,進入
listen
(監聽)狀態,等待客戶端的
tcp傳輸連線請求。(2
)客戶端最開始也是從
closed
狀態開始呼叫
socket
原語建立新的
socket
套接字,然後在需要再呼叫
connect
原語,向伺服器傳送乙個將
syn欄位置
1(表示此為同步資料段)的資料段(假設初始序號為
i),主動開啟埠,進入到
synsent
(已傳送連線請求,等待對方確認)狀態。
tcp傳輸連線建立的三次握手過程 (
3)伺服器在收到來自客戶端的
syn資料段後,發回乙個
syn欄位置
1(表示此為同步資料段),
ack欄位置
1(表示此為確認資料段),
ack(確認號)
=i+1
的應答資料段(假設初始序號為
j),被動開啟埠,進入到
syn rcvd
(已收到乙個連線請求,但未進行確認)狀態。這裡要注意的是確認號是i+1,而不是i,表示伺服器希望接收的下一下資料段序號為
i+1。 (
4)客戶端在收到來自伺服器的
syn+ack
資料段後,向伺服器傳送乙個
ack=1
(表示此為確認資料段),序號為
i+1,
ack=j+1
的確認資料段,同時進入
established
(連線建立)狀態,建立單向連線。要注意的是,此時序號為i+1,確認號為j+1,表示客戶端希望收到伺服器的下乙個資料段的序號
j+1。 (
5)伺服器在收到客戶端的
ack資料段後,進入
established
狀態,完成雙向連線的建立。
雙方同時主動連線的
tcp連線建立過程
正常情況下,傳輸連線都是由一方主動發起的,但也有可能雙方同時主動發起連線,此時就會發生連線碰撞,最終只有乙個連線能夠建立起來。因為所有連線都是由它們的端點進行標識的。如果第乙個連線請求建立起乙個由套接字(
x,y)標識的連線,而第二個連線也建立了這樣乙個連線,那麼在
tcp實體內部只有乙個套接字表項。
當出現同時發出連線請求時,則兩端幾乎在同時傳送乙個
syn欄位置
1的資料段,並進入
syn_sent
狀態。當每一端收到
syn資料段時,狀態變為
syn_rcvd
,同時它們都再傳送
syn欄位置1,
ack欄位置
1的資料段,對收到的
syn資料段進行確認。當雙方都收到對方的
syn+ack
資料段後,便都進入
established
狀態。圖
10-39
顯示了這種同時發起連線的連線過程,但最終建立的是乙個
tcp連線,而不是兩個,這點要特別注意。
圖 10-39
同時發起連線的tcp連線建立流程
從圖中可以看出,乙個雙方同時開啟的傳輸連線需要交換4資料段,比正常的傳輸連線建立所進行的三次握手多交換乙個資料段。此外要注意的是,此時我們沒有將任何一端稱為客戶或伺服器,因為每一端既是客戶又是伺服器。
2.tcp連線的釋放
在資料傳輸完畢之後,通訊雙方都可以發出釋放連線的請求。釋放連線的過程為如上圖所示:
1)資料傳輸結束後,主機a的應用程序先向其tcp發出釋放連線請求,不在傳送資料。tcp通知對方要釋放從a到b的連線,將發往主機b的tcp報文段首部的終止位元fin置為1,序號u等於已傳送資料的最後乙個位元組的序號加1。
2)主機b的tcp收到釋放連線通知後發出確認,其序號為u+1,同時通知應用程序,這樣a到b的連線就釋放了,連線處於半關閉狀態。主機b不在接受主機a發來的資料;但主機b還向a傳送資料,主機a若正確接收資料仍需要傳送確認。
3)在主機b向主機a的資料傳送結束後,其應用程序就通知tcp釋放連線。主機b發出的連線釋放報文段必須將終止位元置為1,並使其序號w等於前面已經傳送過的資料的最後乙個位元組的序號加 1,還必須重複上次已傳送過的ack=u+1。
4)主機a對主機b的連線釋放報文段發出確認,將ack置為1,ack=w+1, seq=u+1。這樣才把從b到a的反方向連線釋放掉,主機a的tcp再向其應用程序報告,整個連線已經全部釋放。
2. 雙方主動關閉的
tcp連線釋放流程
與可以雙方同時建立tcp傳輸連線一樣,tcp傳輸連線關閉也可以由雙方同時主動進行(正常情況下都是由一方傳送第乙個fin資料段進行主動連線關閉,另一方被動接受連線關閉),如圖10-41所示。具體描述如下:
同時主動關閉tcp連線的流程
當兩端對應的網路應用層程序同時呼叫close原語,傳送fin資料段執行關閉命令時,兩端均從established狀態轉變為fin wait 1狀態。任意一方收到對端發來的fin資料段後,其狀態均由fin wait 1轉變到closing狀態,並傳送最後的ack資料段。當收到最後的ack資料段後,狀態轉變化time_wait,在等待2msl後進入到closed狀態,最終釋放整個tcp傳輸連線。
3.注意的問題
四次揮手釋放連線時,等待2msl的意義
4.tcp的有限狀態機
連線的建立和釋放所要求的步驟可以用乙個有限狀態機來表達,該狀態機有11種狀態。每一種狀態中都存在一些合法的事件,當合法事件發生的時候,可能需要採取某個動作。當其他事件發生的時候,則報告乙個錯誤。
狀 態描 述
closed
關閉狀態,沒有連線活動或正在進行
listen
監聽狀態,伺服器正在等待連線進入
syn rcvd
收到乙個連線請求,尚未確認
syn sent
已經發出連線請求,等待確認
established
連線建立,正常資料傳輸狀態
fin wait 1
(主動關閉)已經傳送關閉請求,等待確認
fin wait 2
(主動關閉)收到對方關閉確認,等待對方關閉請求
timed wait
完成雙向關閉,等待所有分組死掉
closing
雙方同時嘗試關閉,等待對方確認
close wait
(被動關閉)收到對方關閉請求,已經確認
last ack
(被動關閉)等待最後乙個關閉確認,並等待所有分組死掉
tcp建立與釋放的變遷如圖所示:
伺服器程序變遷的過程(粗虛線)
三次握手,四次揮手
三次握手 three times handshake three way handshake 所謂的 三次握手 即對每次傳送的 資料量是怎樣跟蹤進行協商使 資料段的傳送和接收同步,根據所接收到的資料量而確定的資料確認數及資料傳送 接收完畢後何時撤消聯絡,並建立虛連線。為了提供可靠的傳送,tcp在傳送...
三次握手 四次揮手
在tcp ip 協議中,tcp 協議提供可靠的連線服務,採用三次握手建立乙個連線,如圖1所示。1 第一次握手 建立連線時,客戶端a 傳送syn 包 syn j 到伺服器b 並進入syn send 狀態,等待伺服器b 確認。2 第二次握手 伺服器b 收到syn 包,必須確認客戶a 的syn ack j...
三次握手四次揮手
三次握手與四次揮手分別對應tcp連線建立過程與斷開過程,先上tcp報文格式 三次握手過程 問題1 為什麼要三次握手?答 三次握手的目的是建立可靠的通訊通道,說到通訊,簡單來說就是資料的傳送與接收,而三次握手最主要的目的就是雙方確認自己與對方的傳送與接收機能正常。第一次握手 client什麼都不能確認...