tcp是面向連線的協議。運輸連線是用來傳送tcp報文的。tcp的運輸連線有三個過程,即建立連線、資料傳輸和連線釋放。
tcp連線建立過程中要解決以下三個問題:
(1)要使每一方都能夠確認對方的存在。
(2)要允許雙方協商一些引數
(3)能夠對運輸實體資源進行分配
tcp連線的建立採用客戶機/伺服器模式,主動發起連線建立的應用程序叫做客戶機,而被動等待連線建立的應用程序叫做伺服器。
tcp首部:
tcp的連線建立:
1.首先,客戶機與伺服器的tcp程序都處於closed(關閉)狀態,當要進行tcp連線時,客戶機主動開啟連線,伺服器被動開啟連線(這是因為服務請求總是由客戶機向伺服器發起,因為想要請求的資源都在伺服器上,所以客戶機想要獲取資源就必須主動向伺服器發起請求,而不能是等待伺服器向自己(客戶機)發起請求)。
2.然後,伺服器的tcp程序先建立傳輸控制塊tcb(傳輸控制塊tcb儲存了每乙個連線中的重要資訊,如:tcp連線表,指向傳送和接收快取的指標,指向重傳佇列的指標,當前的傳送和接收序號,等等),此時,伺服器就處於listen(收聽)狀態。同樣的,客戶機也會首先建立乙個傳輸控制塊tcb傳送給伺服器。這樣,準備工作就做好了。
3.現在就可以開始真正的三次握手了。首先,客戶機先向伺服器傳送連線請求報文段,該報文段中將首部中的同步位syn置為1(只有當syn置為1時,才能表明客戶機想要和伺服器建立連線),並且隨機選擇乙個初始序號x,注意此時的syn資料報中並沒有攜帶資料,但是仍舊要消耗掉乙個序號(意思就是下次客戶機傳送資料的時候,序號為x+1),此時客戶機進入到syn-sent(同步已傳送)狀態。
4.此時,伺服器收到客戶機的請求時,如果同意與該客戶機進行連線,則需要向客戶機傳送確認報文。在傳送報文中需要將syn與ack都置為1(當ack置為1時,表明伺服器同意與客戶機進行連線;同時將syn置為1,表明伺服器想要和客戶機建立連線),並且隨機選擇乙個初始序號y,確認號為x+1(確認號表明伺服器渴望收到的下乙個報文段的第乙個資料位元組的序號,因為之前傳送了x,所以下乙個序號為x+1),注意此時的syn資料報中並沒有攜帶資料,但是也要消耗掉乙個序號(同樣的,也就是說伺服器下次傳送資料的時候,序號為y+1),此時tcp伺服器程序進入到syn-rcvd(同步收到)階段。
5.tcp客戶端收到伺服器的確認後,還要再向伺服器給出確認。確認報文段中ack置為1,確認號為ack=y+1(因為之前伺服器給客戶機傳送的序號為y,因此現在客戶機向伺服器傳送的確認號為ack=y+1,意思是客戶機渴望收到的下乙個報文段的第乙個資料位元組為y+1)此時客戶機的傳送序號為x+1(這是因為剛才剛才客戶機向伺服器傳送連線請求時消耗了序號x,因此此時的序號為x+1)注意:在進行第三次握手時,ack報文段可以攜帶資料,也可以不攜帶資料,如果攜帶資料,則消耗乙個序列,這樣客戶機下次傳送報文段時的序號為x+2,如果不攜帶資料則不消耗序號,下次客戶機傳送報文段時的序號為x+1。這時tcp連線已經建立,客戶機和伺服器都進入到established(已建立連線)狀態。
其實上面的三次握手實質上就相當於是下列的對話:
-客戶機:伺服器,我想要和你建立連線,你同意嗎?(syn=1)
-伺服器:客戶機,我同意和你建立連線(ack=1);我也想和你建立連線,你同意嗎?(syn=1)
-客戶機:伺服器,我同意和你建立連線。(ack=1)
. 其實,在進行第二次握手時(即伺服器向客戶機進行應答時),可以看作時發了兩次包,先回答客戶機的服務請求(ack=1,ack=x+1),然後再向客戶機發出請求(syn=1,seq=y)
常見面試問題:
問:三次握手中,為什麼客戶機最後還要再向伺服器傳送一次確認呢?
答:這是為了防止已失效的連線請求報文段突然又傳到了伺服器。所謂「已失效的連線請求報文段」是這樣產生的。考慮一種正常的情況,客戶機發出連線請求,但因為連線請求報文丟失而未收到確認。於是客戶機再重傳了一次連線請求,後來收到了確認,建立了連線。資料傳輸完後,就釋放了連線。客戶機共傳送了兩個連線請求報文段,其中第乙個丟失,第二個到達了伺服器,沒有所謂的「已失效的連線請求報文段」。
但是如果出現了一種異常情況,即客戶機發出的第乙個報文段並沒有丟失,而是在某個節點上長時間滯留了,直至客戶機向伺服器傳送了第二個報文段並且已經完成資料傳輸釋放了連線,此時,第乙個報文到達伺服器後會被誤以為是客戶機重新發起的一次連線請求,實質上是乙個早已失效的連線請求。如果沒有第三次握手,那麼這個連線就建立了,但是客戶機並不會向伺服器傳送任何請求,這樣連線就會一直持續,白白的消耗網路資源。
tcp的連線釋放:
1.資料傳輸結束後,通訊的雙方都可以釋放連線。此時,客戶機和伺服器都處於established(已建立連線)狀態。
2.假設客戶機請求完資源了,想要釋放連線。首先,客戶機的應用程序先向伺服器發出連線釋放報文段,該報文段中將首部的終止控制位fin置為1(只有當fin置為1時,才能表明客戶機想要和伺服器斷開連線),並且序號為u(注意:此時的u不是隨機產生的,而是之前客戶機傳送的資料的最後乙個位元組的序號加1)。此時客戶機進入到fin-wait-1(終止等待1)狀態,等待伺服器的確認。
3.伺服器收到連線釋放報文後發出確認,在傳送報文中將首部中的ack置為1(ack置為1,表面伺服器同意與客戶機釋放連線),並且產生序號v(注意:此時的v不是隨機產生的,而是之前伺服器傳送的資料的最後乙個位元組的序號加1),並且發出確認號為u+1(確認號表明伺服器渴望收到的下乙個報文段的第乙個資料位元組的序號,因為之前傳送了u,所以下乙個序號為u+1)。此時伺服器就進入close-wait(關閉等待)狀態,客戶機進入fin-wait-2狀態。
此時,從客戶機到伺服器這個方向的連線就被釋放了,也就是說,客戶機已經沒有資料要向伺服器傳送了,但是如果伺服器向客戶機傳送資料,客戶機仍要接收資料。也就是說:從客戶機到伺服器的連線已經被釋放了,但是從伺服器到客戶機的連線還沒被釋放。此時,tcp連線處於半關閉狀態。
4.如果伺服器向客戶機也沒有要傳送的資料的話,那麼伺服器的應用程序就可以向客戶機發出連線釋放報文段(注意此時還是伺服器向客戶機傳送資料),該報文段中將首部的終止控制位fin置為1(只有當fin置為1時,才能表明客戶機想要和伺服器斷開連線),ack也置為1,並且序號為w(重點注意,此時的w不一定等於v+1。如果在客戶機釋放了連線之後,伺服器向客戶機仍舊傳送了一部分資料,那麼此時w不等於v+1,但是如果期間沒有再傳送資料,那麼w就等於v+1。總而言之,這個w等於伺服器上一次傳送的資料的最後乙個位元組加1),並且傳送確認號為u+1(確認號表明伺服器渴望收到的下乙個報文段的第乙個資料位元組的序號,因為之前傳送了u,所以下乙個序號為u+1)。此時伺服器就進入了last-ack(最後確認)狀態。
5.客戶機收到伺服器的連線釋放報文後,必須對此報文進行確認。在該報文段中將ack置為1,確認號為w+1(確認號表明伺服器渴望收到的下乙個報文段的第乙個資料位元組的序號,因為之前傳送了w,所以下乙個序號為w+1),產生序號為u+1(因為上乙個傳送的資料的序號為u)。此時伺服器進入到time-wait(等待時間)狀態。但是,此時tcp連線還沒有被釋放掉。必須經過2msl後伺服器才能進入到closed狀態。(注:msl叫做最長報文段壽命,rfc建議為兩分鐘,也就是說,要經過四分鐘才能進入到closed狀態)。
其實上面的四次揮手實質上就相當於是下列的對話:
-客戶機:伺服器,我想和你斷開連線,你同意嗎?(fin=1)
-伺服器:我同意(ack=1)
(在此期間,伺服器可能還會向客戶機傳送資料,但是客戶機卻不能再向伺服器傳送資料)
-伺服器:客戶機,我想要和你斷開連線,你同意嗎?(fin=1)
-客戶機:我同意。(ack=1)
再等待2msl時間後就真正斷開了連線。
常見面試問題:
問:為什麼客戶機傳送完最後乙個資料後要在time-wait狀態等待 2msl(四分鐘,最長報文段壽命,maximum segment lifttime)的時間呢?
答:第一:為了保證客戶機最後傳送的那個ack報文段能夠到達伺服器。這個ack報文段可能會丟失。因而使處在last-ack狀態的b收不到對已傳送的fin+ack報文段的確認。伺服器會超時重傳這個fin+ack報文段,而客戶機就能在2msl時間內收到這個重傳的fin+ack報文段。接著客戶機重傳一次確認,重新啟動2msl計時器,最後客戶機和伺服器都可以進入到closed(關閉)狀態。如果沒有2msl等待時間,那麼就無法收到重傳的fin+ ack包,無法進入正常的closed狀態。
第二,防止「已失效的連線請求報文段」出現在本連線中。客戶機在傳送完最後乙個ack報文段,再經過時間2msl,就可以使本連線持續的時間內所產生的報文段都從網路中消失。這樣就可以使下乙個新的連線中不會出現這種舊的連線請求報文段。
tcp三次握手和四次握手
建立tcp需要三次握手才能建立,而斷開連線則需要四次握手。整個過程如下圖所示 先來看看如何建立連線的。首先client端傳送連線請求報文,server段接受連線後回覆ack報文,並為這次連線分配資源。client端接收到ack報文後也向server段發生ack報文,並分配資源,這樣tcp連線就建立了...
TCP三次握手和四次握手
ip 網路層 不穩定性。硬體聯絡緊密 傳輸層 1.完全不彌補 udp 無連線不可靠報文傳輸 2.完全彌補 tcp 面向連線的可靠資料報傳遞 tcp傳送資料就包含了tcp三次握手建立連線和關閉連線的四次握手 建立連線用syn傳送,用ack應答 所謂三次握手就是客戶端與伺服器之間的三次應答。伺服器是一直...
TCP 三次握手 四次握手
http常見狀態碼 200 ok 伺服器成功處理了請求 301 302 moved permanently 重定向 response中應該包含乙個location url,說明資源現在所處的位置 304 not modified 未修改 客戶的快取資源是最新的,要客戶端使用快取 404 not fo...