1.在TCP連接的過程中,有三個階段,分別是建立連接,傳遞數據和斷開連接,通訊時序圖如下所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
2.結合TCP數據報格式分析建立連接的三次握手
??
? ? ? ? ? ? ? ?1)首先客戶端發送一個帶有SYN標志的TCP報文給服務器端,詢問服務器端是否可以通信。其中32位序號為1000,數據大小為0,數據報文的最大長度為1460;
? ? ? ? ? ? ? ?2)服務器端接收到客戶端的數據,回應客戶端,想客戶端發送一個報文,同時攜帶了SYN和ACK標志,其中SYN標志后的數據序號為服務器端給客戶端發送的報文的32位序號為8000,詢問客戶端是否可以通信。ACK后面的數據為服務器端接受客戶端數據后的確認序號(表示1001以前的數據報,服務器端都接收到了)。
? ? ? ? ? ? ? ?3)客戶端再向服務器端發送一個ACK數據報,表示可以通信,此時通信開始。
3.數據傳輸
? ? ? ? ? ?數據傳輸的過程中,可能因為數據太大,超出了數據包可以容納的最大數據,此時會將數據包分包處理,所以數據的傳輸過程并不是服務器和客戶端的一來一回的通信。
4.TCP關閉連接的四次揮手
? ? ? ? ? ? 由于TCP連接采用的是全雙工的方式,因此每個方向都必須單獨關閉,此時指定FIN標志來終止某個方向的連接。收到一個FIN意味著這個方向沒有數據流動,另一個方向仍然可以發送數據(半關閉)。
? ? ? ? ? ?1)客戶端發送FIN請求。
? ? ? ? ? ?2)服務端接收請求并發送ACK來允許請求關閉。
? ? ? ? ? ?3)服務器端向客戶端發送FIN請求關閉連接。
? ? ? ? ? ?4)客戶端發送ACK允許關閉。
5.注意事項
? ? ? ? ? ? TCP通信是面向連接的可靠數據包傳遞,相對于UDP的無連接不可靠報文傳輸而言,數據傳遞更加有保證。但是,TCP和UDP在數據傳輸中,都會出現丟包現象,只是TCP在出現丟包的時候,可以通過ACK后面的確定序號來告訴用戶收到了哪些數據,如果出現丟包,則需要重新發送。
? ? ? ? ? ? TCP規定SYN位和FIN位都要占一個序號,雖然沒有發送數據,但是發送了SYS/FIN位,所以下次發送數據時使用的序號需要+1;