當我們向伺服器傳送http請求,獲取資料、修改資訊時,都要建立tcp連線,包括三次握手,四次揮手。
什麼是tcp連線?
為了實現可靠的資料傳輸,tcp要在應用程序之間建立傳輸連線。它是在兩個傳輸使用者之間建立一種邏輯聯絡,使得通訊雙方都確認對方為自己的傳輸端點。
建立連線:
建立連線前,伺服器端首先被動開啟其熟知的埠,對埠進行監聽。當客戶端要和伺服器端建立連線時,發起乙個主動開啟埠的請求,該埠一般為臨時埠,然後進入三次握手的過程:
三次握手:
設主機b執行乙個伺服器程序,它先發出乙個被動開啟命令,告訴它的tcp要準備接收客戶程序的連續請求,然後服務程序就處於聽的狀態。不斷檢測是否有客戶程序發起連續請求,如有,作出響應。設客戶程序執行在主機a中,他先向自己的tcp發出主動開啟的命令,表明要向某個ip位址的某個埠建立運輸連線,過程如下:
1)主機a的tcp向主機b的tcp發出連線請求報文段,其首部中的同步位元syn應置1,同時選擇乙個序號x,表明在後面傳送資料時的第乙個資料位元組的序號是x。
2)主機b的tcp收到連線請求報文段後,如同意,則發揮確認。在確認報文段中應將syn置為1,確認號應為x+1,同時也為自己選擇乙個序號y
3)主機a的tcp收到此報文段後,還要向b給出確認,其確認號為y+1
4)主機a的tcp通知上層應用程序,連線已經建立,當主機b的tcp收到主機a的確認後,也通知上層應用程序,連線建立。
連線釋放
在資料傳輸完畢之後,通訊雙方都可以發出釋放連線的請求。釋放連線的過程為如上圖所示:
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再向其應用程序報告,整個連線已經全部釋放。
注意的問題:
三次握手建立連線時,傳送方再次傳送確認的必要性
主要是為了防止已失效的連線請求報文段突然又傳到了b,因而產生錯誤。假定出現一種異常情況,即a發出的第乙個連線請求報文段並沒有丟失,而是在某些網路結點長時間滯留了,一直延遲到連線釋放以後的某個時間才到達b,本來這是乙個早已失效的報文段。但b收到此失效的連線請求報文段後,就誤認為是a又發出一次新的連線請求,於是就向a發出確認報文段,同意建立連線。假定不採用三次握手,那麼只要b發出確認,新的連線就建立了,這樣一直等待a發來資料,b的許多資源就這樣白白浪費了。
time_wait狀態:
首先呼叫close()發起主動關閉的一方,在傳送最後乙個ack之後會進入time_wait的狀態,也就是說該傳送方會保持2msl時間之後才會回到初始狀態。msl指的是資料報在網路中的最大生存時間。產生這種結果使得這個tcp連線在2msl連線等待期間,定義這個連線的四元組(客戶端ip位址和埠,伺服器ip位址和埠)不能被使用。
產生原因:
為了實現tcp全雙工連線的可靠釋放;假設發起主動關閉的一方(client)最後傳送的ack在網路中丟失,由於tcp協議的重傳機制,執行被動關閉的一方將會重新傳送fin,在該fin到達client之前,client必須維護這條連線狀態,也就是說tcp連線對應的資源不能被立即釋放或者重新分配,直到另一方重發的fin到達後,client重發ack後,經過2msl時間週期沒有再收到另一方的fin之後,該tcp連線才能恢復初始的closed狀態。如果主動關閉方不維護這樣乙個time_wait狀態,那麼當被動關閉一方重發的fin到達時,主動關閉一方的tcp傳輸層會用rst包響應對方,這會被對方認為是有錯誤發生,然而這事實上只是正常的關閉連線過程,並非異常;
為使舊的資料報在網路中因過期而消失。
四次揮手釋放連線時,等待2msl的意義
第一,為了保證a傳送的最有乙個ack報文段能夠到達b。這個ack報文段有可能丟失,因而使處在last-ack狀態的b收不到對已傳送的fin和ack報文段的確認。b會超時重傳這個fin和ack報文段,而a就能在2msl時間內收到這個重傳的ack+fin報文段。接著a重傳一次確認。
第二,就是防止上面提到的已失效的連線請求報文段出現在本連線中,a在傳送完最有乙個ack報文段後,再經過2msl,就可以使本連線持續的時間內所產生的所有報文段都從網路中消失。
tcp的有限狀態機
closed:關閉狀態,沒有連線活動或正在進行。
listen:表示伺服器端的某個socket處於監聽狀態,正在等待連線進入。
syn-sent:已經發出連線請求,等待確認。
syn-rcvd:收到乙個連線請求,尚未確認。
established:連線建立,正常資料傳輸狀態。
fin-wait-1:(主動關閉)已經傳送關閉請求,等待確認。
fin-wait-2:(主動關閉)收到對方關閉確認,等待對方關閉請求。
time-wait:完成雙向關閉,等待所有分組死掉。表示收到了對方的fin報文,並發出ack報文,等待2msl後即可回到closed可用狀態了。如果fin-wait-1狀態下,收到了對方同時帶fin標誌和ack標誌的報文時,可以直接進入到time-wait狀態,無需經過fin-wait-2狀態。
closing:雙方同時嘗試關閉,等待對方確認,比較少見。
close-wait:(被動關閉)收到對方關閉請求,已經確認。需要檢視你是否還有資料傳送給對方,如果沒有的話,那麼你也就可以close這個socket,傳送fin給對方,也就是關閉連線。
last-ack:(被動關閉)等待最後乙個關閉確認,並等待所有分組死掉。它是被動關閉一方在傳送fin報文後,最後等待對方的ack報文。當收到ack報文後,也就可以進入到closed可用狀態了。
計算機網路 乙個完整的TCP連線
當我們向伺服器傳送http請求,獲取資料 修改資訊時,都要建立tcp連線,包括三次握手,四次揮手。什麼是tcp連線?為了實現可靠的資料傳輸,tcp要在應用程序之間建立傳輸連線。它是在兩個傳輸使用者之間建立一種邏輯聯絡,使得通訊雙方都確認對方為自己的傳輸端點。建立連線前,伺服器端首先被動開啟其熟知的埠...
計算機網路 二 TCP連線
客戶端傳送乙個syn給服務端,syn是由乙個演算法計算出來的,同時把syn標誌位置為1 服務端接收之後 傳送ack,ack為客戶端傳送的syn 1,並且傳送自己的syn,並把syn和ack標誌位置為1。跟上面的一樣,ack也是用syn 1表示 這個要從初始化socket和確定序列號和視窗大小 避免歷...
計算機網路 TCP的連線建立
tcp的連線建立又稱為三次握手,謝希仁版教材中成為三報文握手,即客戶端程序與伺服器端程序通過三次報文的傳輸建立了tcp連線。首先tcp首部為 連線流程 注意 序號 自己傳送的報文段的資料的第乙個位置序號。確認ack 僅當ack 1的時候確認號字段才有效,規定建立連線後所有的報文段的ack 1。同步s...