1. 程式人生 > >TCP為什麼要三次握手?為什麼要有四次揮手的TIME_WAIT?

TCP為什麼要三次握手?為什麼要有四次揮手的TIME_WAIT?

一:首先奉上
TCP三次握手的過程
TCP三次握手的過程
TCP連線釋放的過程:
TCP連線釋放的過程
二:
1。為什麼兩次就建立連線還要三次握手呢?這主要是為了防止已失效的連線請求報文又突然傳遞伺服器。
所謂“防止已失效的連線請求報文又突然傳遞伺服器。”是這樣一種情況:
A客戶端發出連線請求,因為連線請求報文丟失而未等到確認。於是A再次重傳了連線請求,建立了連線。資料傳輸完畢後,釋放了連線。現在假設那第一個請求只是因為網路節點長時間滯留了,使得它在第二個連線釋放後才到達B伺服器,那麼B會以為這是一個新的連線請求,於是就向A發了個連線確認,注意了如果沒有最後一次的確認B會一廂情願的以為連線已經建立

,可人家A同學一看那個B給的是什麼呀!跟自己沒關係,簡單粗暴的丟掉。這時B孩子還傻傻的等著A給他發資料,就這樣,B白白浪費的大把的時光和資源。
那B會一直傻等嗎?當然不是,它的等待也是有限的,答案就是保活計時器。

2.為什麼要有四次揮手的TIME_WAIT的狀態?
(1)第一是為了保證最後一個的一個ACK報文能到達B。這個ACK報文有可能丟失,因而使得處在LAST_ACK狀態得不到對已傳送的FIN+ACK報文的確認,B會超時重傳這個FIN+ACk ,而A就能在這TIME_WAIT時間(2MSL)裡收到這個重傳的報文,A就可以重傳一次確認,如果沒有這個TIME_WAIT, 那B重傳的FIN_ACK,可A早就走了,自然不會再重發確認,這樣B就無法按照正常步驟進入CLOSE 狀態。
(2)第二是防止“已失效的報文連線請求”,A在TIME_WAIT中,經過這2MSL的時間,就可以使本連結持續的時間內產生的所有連線消失,這樣就可以使下一個新的連線中不會出現這樣舊的連線請求報文段。
2.2 聰明的你會發現誰先關閉誰就有一個TIME_WAIT的狀態;
在linux的網路程式設計中,如果伺服器如果先關閉,你會發現,現在想要立馬再次啟動伺服器,就會報錯說這個埠號被佔用著,那就是因為有這個TIME_WAIT,2msl的時間.那麼怎麼解決 ?
解決:setsockopt()函式。在這就不多說了。