TCP協議的三次握手四次揮手

2021-09-02 06:50:43 字數 2958 閱讀 9452

四次揮手

tcp服務端

tcp(transmission control protocol 傳輸控制協議)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,計算機網路osi模型中,它完成第四層傳輸層所指定的功能。
tcp的可靠性體現在他的確認應答機制,每當客戶端發起請求,會向伺服器傳送乙個syn請求,當伺服器接收到這個請求後會向客戶端回應syn+ack,最後客戶端向伺服器回應ack,至此三次握手完畢,成功建立連線。

第一次握手

伺服器先處於closed狀態,呼叫listen後處於監聽狀態,之後呼叫accept阻塞等待客戶端連線

客戶端在socket之後,呼叫connect發起連線請求,向伺服器傳送syn請求,並進入syn_sent狀態,伺服器收到syn請求後進入syn_recv狀態,第一次握手完畢

第二次握手

伺服器進入syn_recv後向客戶端傳送syn+ack資料報,

客戶端接收到資料報之後,connect返回,客戶端進入established狀態,第二次握手完畢

第三次握手

客戶端傳送ack資料報

伺服器接收到資料報之後,accept返回之後分配新的檔案描述符,伺服器進入established狀態,三次握手完畢,雙方可以正常通訊。

tcp為什麼是三次握手不是兩次握手?

如果採用兩次握手,客戶端a給伺服器b傳送了一條請求,但是由於網路原因造成這條請求滯留時間較長,a又傳送了一條請求,b收到請求後傳送響應,此時ab可以正常通訊,通訊完畢後ab關閉。但是這時在網路中滯留的請求報文到達伺服器,伺服器會認為有新的客戶端請求連線,但是客戶端並沒有真正發起請求,造成伺服器資源浪費。

客戶端給伺服器傳送請求,伺服器響應之後傳送給客戶端,但是由於網路問題這個響應報文丟失,客戶端認為連線失敗,伺服器認為連線成功,等待客戶端傳送資料,客戶端重新傳送,但是客戶端這時傳送的並不是資料而是請求連線的請求報文,伺服器接收到之後同樣會響應並開闢新的資源,這就造成了乙個客戶端可能在伺服器上有兩份或者多分資源造成浪費,為了保護伺服器就需要三次握手。

有些惡意客戶端會使用偽造ip傳送多條連線請求,響應永遠到達不了客戶端,伺服器端開闢大量資源不進行釋放,伺服器在等待關閉的連線過程中消耗了資源,如果請求太多造成伺服器資源被耗盡。這就是syn泛洪攻擊。

客戶端(主動關閉方)想要斷開連線,先向伺服器傳送fin包,伺服器接收到客戶端關閉連線的請求會傳送乙個ack包,之後伺服器傳送乙個fin包,客戶端向伺服器傳送ack確認包,雙方斷開連線。

第一次揮手

客戶端(主動關閉方)關閉檔案描述符,發出連線釋放報文,進入fin_wait_1狀態

第二次揮手

伺服器接收到連線釋放報文,read返回0,發出確認報文,ack=1,伺服器進入close_wait狀態,伺服器通知高層應用程序,客戶端向伺服器方向釋放,伺服器傳送的資料客戶端仍然接收

第三次揮手

客戶端收到來自伺服器的ack報文,進入fin_wait_2狀態,等待伺服器傳送連線釋放報文

伺服器間資料處理完畢,向客戶端傳送fin=1的連線釋放報文,伺服器進入last_ack(最後確認)狀態

第四次揮手

客戶端接收到連線釋放報文,發出確認報文,ack=1,客戶端進入time_wait狀態,此時tcp並沒有完全釋放,在2個msl時間之後,客戶端撤銷響應資料,進入closed

伺服器收到客戶端的確認,進入closed,tcp連線斷開

tcp四次揮手中為什麼要有tiem_wait

time_wait保證客戶端傳送的最後乙個ack報文能夠到達伺服器,如果最後乙個ack報文丟失,站在伺服器角度來看,我傳送了ack+fin報文請求斷開連線,客戶端沒有回應,伺服器會認為自己傳送的fin包客戶端沒有收到,於是伺服器會重新傳送乙個請求斷開連線,如果沒有time_wait客戶端直接斷開,可能會影響下一次tcp的連線,導致剛剛建立的連線因為fin包的出現而導致錯誤,所以在等待2個msl時間,確認伺服器已經接收到ack,在這2個msl時間中可以使本連線產生的所有報文段都從網路中消失,這樣新的連線不會出現舊的連線報文。time_wait是為了保護主動關閉方。

1、確保最後乙個報文不會丟失,防止伺服器將空閒連線掛起時間過長

2、達到基本可靠

3、讓連線以前的合法資料消散

當我們在啟動tcp服務端後用ctrl+c終止,當我們再次想要啟動時會顯示:

這裡雖然server應用程式關閉,但是tcp連線並沒有斷開,使用netstat命令檢視

tcp協議規定,主動關閉的一方要處於time_wait狀態等待2個msl時間後才能回到closed狀態,檢視當前系統的msl:

那麼如何解決time_wait狀態引起bind失敗?

可以在伺服器中socket()和bind()之間插入如下**

int opt =1;

setsockopt

(listen_sock, sol_socket, so_reuseaddr,

&opt,

sizeof

(opt)

);

tcp協議三次握手 四次揮手

起初,伺服器和客戶端都為closed狀態。在通訊開始前,雙方都得建立各自的傳輸控制塊 tcb 伺服器建立完tcb後遍進入listen狀態,此時準備接收客戶端發來的連線請求。第一次握手 客戶端向服務端傳送連線請求報文段。該報文段的頭部中syn 1,ack 0,seq x。請求傳送後,客戶端便進入syn...

TCP協議三次握手四次揮手

1.什麼是tcp協議 tcp協議是作用在傳輸層的傳輸控制協議 tcp 提供一種面向連線的 可靠的位元組流服務 在乙個 tcp 連線中,僅有兩方進行彼此通訊。廣播和多播不能用於 tcp tcp 使用校驗和,確認和重傳機制來保證可靠傳輸 tcp 給資料分節進行排序,並使用累積確認保證資料的順序不變和非重...

TCP協議三次握手四次揮手

tcp有哪些過程?a.建立連線 b.資料傳輸 c.終止連線 tcp三次握手和四次揮手的過程?syn,ack是什麼?syn 請求建立連線 含有同步序列號的標誌位的資料,tcp建立連線時,將這個 位 置1 ack 針對syn的確認應答 fin是什麼?fin 傳送端完成傳送任務 位 當tcp完成資料傳輸需...