一直搞不明白爲何TCP鏈接必定須要三次握手和四次揮手。如今終於想明白了。三次握手是爲了創建可靠的鏈接。注意可靠這兩個字。四次揮手是爲了可靠的關閉鏈接,一樣注意可靠這兩個字。html
下面分享一下個人想法和總結:網絡
具體的三次握手和四次揮手的過程能夠查閱下面的連接。tcp
下面來講說「爲何」。性能
第一:爲何是三次握手,不是一次、兩次、四次?htm
爲何不是一次?blog
若是一次就創建鏈接:那麼客戶端怎麼知道服務端接收到了呢?資源
ok,咱們假設一次握手就創建鏈接的狀況,io
客戶端向服務端發送創建鏈接的報文,而後無論服務端有沒有收到報文信息,直接發送數據報文?這種狀況可靠嗎?答案確定是不可靠的,相似與UDP。建效率
立鏈接的報文和數據報文到達服務端的時間沒法肯定,鏈接報文是否丟失也不必定。程序
服務端突然收到一個數據報文會很懵逼。
爲何不是兩次?
因爲網路阻塞,客戶端第一次發送的鏈接沒有及時到達,而後從新發送報文,而後創建通訊,而後通訊結束,而後第一次發送的報文到達了。而後服務端無故端的又激活了,可是客戶端已經不須要在和服務端通訊了。這種狀況是否是浪費服務端資源?
因此兩次也不可靠,爲何不是兩次的緣由下面的參考鏈接也有說。
爲何不是四次?
若是是四次握手:仔細看看第四次要作的是否是和第二次很像?其實非要說四次行不行?我以爲是行的,可是四次就冗餘了,因此其實4次、5次、6次都是能夠的,爲了兼顧性能和可靠性三次就夠了。第四次之後的握手已經能夠用來傳輸數據了
爲何是三次?
由於三次握手恰好完成了兩次一問一答的通訊。說明能夠創建全雙工的通訊了。
下面來講說,爲何是四次揮手?
由於四次最可靠,最順利。
客服端告訴服務端,個人數據發完了。你看看你還有沒有數據要發給我,沒有的話,咱們的通訊就能夠斷了。
服務端也告訴客戶端,個人數據也發完了,咱們一塊兒關閉吧。 你看都順暢,一點都沒有冗餘,也不用等待,你們都順順利利,愉快的快速結束。
咱們來看看一次揮手行不行?
答案是行,其實0次都行。客戶端和服務端都有重試和超時機制,若是觸發了這兩個機制,就會主動關閉。
應用層,也能夠主動關閉tcp而且不發出通訊信息。想一想兩臺電腦同時斷電了?是否是一次揮手也沒有?可是鏈接已經斷了。
因此實際狀況0次揮手,1次揮手,2次揮手,3次揮手都是可能發生。超過四次的揮手就冗餘了,不須要那麼屢次。
因此兼顧性能和可靠性,四次揮手是最合適的。1次、2次、3次都是不可靠的。
爲何A要先進入TIME-WAIT狀態,等待2MSL時間後才進入CLOSED狀態?
解釋是說爲了保證B能收到A的確認應答。這一點我一直有點疑惑,等待2MSL的時間就一直能保證B收到應答了嗎?我認爲是不能的。
咱們想象這個狀況,A向B回覆了應答,可是由於網絡阻塞沒有在規定時間內到達,而後B在向A發送FIN報文,巧了,由於網絡阻塞,到達A的時間,超過了2MSL。這時候客戶端已經關閉了。以前A回覆的應答也由於網絡丟包,消失了。
最後的結果就是客服端關閉了,服務端一直在等待直到超時,而後關閉。
因此我認爲客戶端等待2MSL時間,是爲了盡最大努力確保服務端能夠及時關閉。不是爲了確保服務端必定能夠及時關閉。這是一種取捨。在性能,效率,可靠性之間的取捨。
等待2MSL的時間能夠在必定程序上減小服務端由於網絡阻塞不能及時關閉的狀況。
參考連接:
https://www.zhihu.com/question/24853633/answer/254224088
https://www.cnblogs.com/zxpo/p/5234220.html