TCP連線的建立於釋放

2021-06-22 21:15:40 字數 1362 閱讀 8552

tcp的連線是由三次握手來完成的。

客戶端向伺服器發起連線:

第一次握手,客戶端向伺服器傳送tcp包,syn標誌位置1,初始序號seq=x。

第二次握手,伺服器向客戶端傳送確認包ack應答,ack值為x+1(乙個syn占用乙個序號),同時這個應答包syn為置1,向客戶機傳送連線請求,初始序號seq=y。

第三次握手,客戶端向伺服器傳送連線確認ack應答包。ack值為y+1。在這個確認包中,可以傳送資料了。

那麼tcp連線建立為什麼要三次握手?

tcp是乙個全雙工的通訊協議,假設通訊雙方為a和b,a向b傳送請求,建立a到b的連線後,並不能保證b到a的連線能建立。

如果改為兩次握手,假設a向b傳送連線請求,但是由於某些原因,傳送連線請求沒有到達b;a又傳送了乙個連線請求,這時b收到了,傳送確認建立了連線,通訊結束後斷開。這時a第一次傳送丟失的連線又到達了b,b傳送確認後以為建立了連線。

那麼如果a和b同時向對方傳送連線請求,又是怎樣的呢?

這時將會由四次握手來建立連線。沒有客戶端/伺服器的區別,每一方既是客戶端又是伺服器。

tcp三次握手來建立連線,在伺服器收到連線請求傳送syn-ack後,在收到客戶端ack 前是初始半連線狀態(syn_rcvd),但是這時伺服器已經為連線預留了資源;由於客戶端的syn源ip一般不存在,伺服器超時重發syn-ack,這時偽造的syn包長時間占用未連線佇列,導致一些正常的syn連線請求被丟棄,引起網路堵塞。

因為tcp連線時乙個全雙工的連線,所以每個方向必須單獨關閉。

首先進行關閉的一方執行主動關閉,傳送fin,另一方收到fin後執行被動關閉,傳送乙個ack確認,確認報文段序列號為收到序列號加1,乙個fin將占用乙個序列號。這樣就關閉了乙個方向上的tcp鏈結。另乙個tcp方向上的連線也需要2次這樣的揮手,所以為四次揮手。

最後要說明一下2msl等待時間。檔被動關閉方向主動關閉方傳送fin報文段,主動關閉方傳送ack確認後並不是理解關閉tcp連線,而是要經過乙個2msl的等待。因為主動關閉方的ack確認可能丟失,如果立即關閉,被動方以為主動方還沒有收到,將會超時重發。經過2msl的等待時間,可以確保即使被動方重發fin報文,主動方也可以收到。

附tcp狀態變遷圖:

tcp連線建立於終止

tcp的連線建立 在本機執行如下命令 sudo tcpdump s port 8080 vv n i lo0 tcpdump listening on lo0,link type null bsd loopback capture size 262144 bytes 00 35 50.265450 ...

TCP建立連線與釋放連線

tcp建立連線與釋放連線 tcp建立連線與釋放連線 最近複習準備 計算機網路 考試,感覺tcp協議建立連線與釋放連線這兩個過程比較重要,所以把自己理解的部分寫下來。1.建立連線 三次握手 1 客戶端傳送乙個syn包給伺服器,然後等待應答。2 伺服器端回應給客戶端乙個ack 1 syn 1的tcp資料...

TCP建立連線與釋放連線

tcp建立連線與釋放連線 最近複習準備 計算機網路 考試,感覺tcp協議建立連線與釋放連線這兩個過程比較重要,所以把自己理解的部分寫下來。1.建立連線 三次握手 1 客戶端傳送乙個syn包給伺服器,然後等待應答。2 伺服器端回應給客戶端乙個ack 1 syn 1的tcp資料段。3 客戶必須再次回應伺...