tcp的建立和終止 三次握手和四次揮手

2021-07-26 16:41:07 字數 2517 閱讀 1171

關於tcp的建立和終止(三次握手和四次揮手)的文章有很多,寫這篇文章只是為了自己能更好的理解tcp協議

一. 三次握手

(1)server做好client連線自己的準備(建立socket,bind繫結埠,listen監聽連線),我們稱之為被動開啟。

(2)client 呼叫connect連線server,此時客戶端會傳送乙個int型syn:j(同步編號),client進入syn_sent狀態

(3)伺服器收到客戶端的請求後,會傳送乙個ack:j+1(相應客戶端的請求),同時自己也會傳送乙個syn:k,進入syn_rcvd狀態

(4)客戶端收到伺服器的應答和syn後傳送ack:k+1進入established狀態,伺服器收到後檢驗 ack編號等於k+1進入established狀態後建立連線。

二.四次揮手

建立乙個連線需要三次握手,而終止乙個連線要經過 4次握手。這由tcp的半關閉(half-closed)造成的。既然乙個tcp連線是全雙工(即資料在兩個方向上能同時傳遞) ,因此每個方向必須單獨地進行關閉。這原則就是當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向連線。當一端收到乙個fin,它必須通知應用層另一端幾經終止了那個方向的資料傳送。傳送fin通常是應用層進行關閉的結果。收到乙個fin只意味著在這一方向上沒有資料流動。

(1)client呼叫close主動關閉連線,傳送乙個fin:m(完成編號)表示資料傳送完成,進入fin_wait_1狀態

(2)server收到client的關閉請求後(被動關閉),tcp關閉client->server的資料通道,並傳送ack:m+1表示收到關閉請求進入close_wait狀態,client收到ack後進入fin_wait_2狀態

(3)一段時間後(這裡server端雖然關閉了接收端但是還可能有未傳送玩的資料(server->client),因此server會繼續傳送未傳送玩的資料),等資料傳送完之後,server會再向client傳送乙個fin:n,進入last_ack狀態

(4)接受到server的fin之後,tcp關閉server->client的資料通道,並傳送ack:n+1,client進入time_wait狀態,最後server收到ack後tcp close進入closed狀態。

這裡我們要注意的是time_wait和close_wait.

首先time_wait是主動關閉連線的一方保持的狀態,對於伺服器來說他本身也可能作為client連線其他的serve,在這個過程中可能由於網路波動或者主動關閉連線,從而進入time_wait的狀態,然後在保持這個狀態2msl(max segment lifetime)時間之後,徹底關閉**資源。為什麼要這麼做?

1.防止上一次連線中的包,迷路後重新出現,影響新連線(經過2msl,上一次連線中所有的重複包都會消失)

2. 可靠的關閉tcp連線。在主動關閉方傳送的最後乙個 ack ,有可能丟失,這時被動方會重新發fin, 如果這時主動方處於 closed 狀態 ,就會傳送rst reset。所以主動方要處於 time_wait 狀態,而不能是 closed 。另外這麼設計time_wait 會定時的**資源,並不會占用很大資源的,除非短時間內接受大量請求或者受到攻擊。在time_wait狀態時兩段的埠不能使用,要等到2msl才能繼續使用,在此期間任何遲到的報文端都將被丟棄,因此如果我們在此期間要馬上重連就要通過設定so_reuseaddr來達到此目的。

最後獻上一張tcp狀態轉化圖

這個對照上面的應該很好理解,不在敘述。

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...