TCP協議應該全部開發人員都聽過,至於有沒有搞清楚就不知道了。今天分享一下本身理解的思路。服務器
TCP協議是傳輸層的協議,除了TCP協議以外,應用層仍是UDP協議。相對比,UDP協議不可靠,TCP丟包以後會從新傳輸,UDP不會,並且UDP是無序的。二者之間仍是有不少區別的,UDP也有本身的優勢,好比傳輸速度快。如今大部分都是由TCP協議。網絡
先明白TCP協議做用:性能
爲了在不可靠的網絡上提供可靠的端到端字的傳輸協議,網絡的結構、帶寬、延遲、數據包大小和其餘參數等都有很大的不一樣,TCP的做用是可以動態地適應網絡的這些不一樣,擁有面對各類故障時的健壯性。並且對應的數據包若是已丟失,TCP將會被進行重傳。簡單記憶就是保證數據通訊的完整性和可靠性,防止丟包。cdn
TCP三次握手:開發
三次握手主要的目的是爲了確認兩個應用層都具有收和發的能力。it
第一次握手,發送方發送SYN=一、SEQ=X,證實了發送方能發數據;io
第二次握手,接收方發送SYN=一、ACK=X+一、SEQ=Y,ACK確保了接收方能收數據,SYN確保了接收方能發數據;class
第三次握手,接收方發送ACK=Y+一、SEQ=Z,證實了發送方能接收。lazyload
因此這就是爲何須要三次握手而不是兩次四次五次,大於三次浪費,少於三次不能保證雙方同時具有收和發。gc
固然,三次握手的SYN、ACK、SEQ都有深層次的解釋和意義,好比數據包的組裝、慢啓動等,本身以爲不須要去了解那麼深。三次握手還有一個做用,就是節省服務器的開銷,若是三次握手中間有一個是失敗的,那麼服務器就不會一直等待,浪費性能,而是直接關閉這個鏈接。
TCP四次揮手:
跟三次握手差很少,也是爲了讓發送方和接收方知道數據狀態。
第一次揮手,發送方發送FIN告訴接收方發送完畢,要關閉傳輸;
第二次揮手,接收方發送ACK=FIN+1告訴發送方知道發完了;
第三次揮手,接受方發送FIN告訴發送方,接收完了,要關閉數據傳輸;
第四次揮手,發送方發送ACK告訴接收方知道了。
四次揮手其實不僅僅只有FIN和ACK,還有其餘的數據包,好比STN和SEQ等。這邊只是以FIN和ACK爲主介紹一下。那爲何須要四次呢?由於當發送方告訴接收方發完了的時候,接收方還有可能沒接收完消息,因此只能先回復一部分,告訴發送方已經收到發完了的消息了。當消息徹底接收完畢以後,纔會告訴發送方已經接收完了。
這只是三次握手和四次揮手,TCP協議是很是複雜的,什麼對應的狀態、報文、數據分類、傳輸技術、滑動窗口協議、超時重傳SACK方法等。這邊只是分享了最簡單的三次握手和四次揮手,並且連這兩個部分都只是簡單的介紹。