linux网络编程之TCP三次握手和四次挥手
1.在TCP連接的過程中,有三個(gè)階段,分別是建立連接,傳遞數(shù)據(jù)和斷開連接,通訊時(shí)序圖如下所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
2.結(jié)合TCP數(shù)據(jù)報(bào)格式分析建立連接的三次握手
??
? ? ? ? ? ? ? ?1)首先客戶端發(fā)送一個(gè)帶有SYN標(biāo)志的TCP報(bào)文給服務(wù)器端,詢問服務(wù)器端是否可以通信。其中32位序號為1000,數(shù)據(jù)大小為0,數(shù)據(jù)報(bào)文的最大長度為1460;
? ? ? ? ? ? ? ?2)服務(wù)器端接收到客戶端的數(shù)據(jù),回應(yīng)客戶端,想客戶端發(fā)送一個(gè)報(bào)文,同時(shí)攜帶了SYN和ACK標(biāo)志,其中SYN標(biāo)志后的數(shù)據(jù)序號為服務(wù)器端給客戶端發(fā)送的報(bào)文的32位序號為8000,詢問客戶端是否可以通信。ACK后面的數(shù)據(jù)為服務(wù)器端接受客戶端數(shù)據(jù)后的確認(rèn)序號(表示1001以前的數(shù)據(jù)報(bào),服務(wù)器端都接收到了)。
? ? ? ? ? ? ? ?3)客戶端再向服務(wù)器端發(fā)送一個(gè)ACK數(shù)據(jù)報(bào),表示可以通信,此時(shí)通信開始。
3.數(shù)據(jù)傳輸
? ? ? ? ? ?數(shù)據(jù)傳輸?shù)倪^程中,可能因?yàn)閿?shù)據(jù)太大,超出了數(shù)據(jù)包可以容納的最大數(shù)據(jù),此時(shí)會將數(shù)據(jù)包分包處理,所以數(shù)據(jù)的傳輸過程并不是服務(wù)器和客戶端的一來一回的通信。
4.TCP關(guān)閉連接的四次揮手
? ? ? ? ? ? 由于TCP連接采用的是全雙工的方式,因此每個(gè)方向都必須單獨(dú)關(guān)閉,此時(shí)指定FIN標(biāo)志來終止某個(gè)方向的連接。收到一個(gè)FIN意味著這個(gè)方向沒有數(shù)據(jù)流動,另一個(gè)方向仍然可以發(fā)送數(shù)據(jù)(半關(guān)閉)。
? ? ? ? ? ?1)客戶端發(fā)送FIN請求。
? ? ? ? ? ?2)服務(wù)端接收請求并發(fā)送ACK來允許請求關(guān)閉。
? ? ? ? ? ?3)服務(wù)器端向客戶端發(fā)送FIN請求關(guān)閉連接。
? ? ? ? ? ?4)客戶端發(fā)送ACK允許關(guān)閉。
5.注意事項(xiàng)
? ? ? ? ? ? TCP通信是面向連接的可靠數(shù)據(jù)包傳遞,相對于UDP的無連接不可靠報(bào)文傳輸而言,數(shù)據(jù)傳遞更加有保證。但是,TCP和UDP在數(shù)據(jù)傳輸中,都會出現(xiàn)丟包現(xiàn)象,只是TCP在出現(xiàn)丟包的時(shí)候,可以通過ACK后面的確定序號來告訴用戶收到了哪些數(shù)據(jù),如果出現(xiàn)丟包,則需要重新發(fā)送。
? ? ? ? ? ? TCP規(guī)定SYN位和FIN位都要占一個(gè)序號,雖然沒有發(fā)送數(shù)據(jù),但是發(fā)送了SYS/FIN位,所以下次發(fā)送數(shù)據(jù)時(shí)使用的序號需要+1;
總結(jié)
以上是生活随笔為你收集整理的linux网络编程之TCP三次握手和四次挥手的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大瓷商剧情介绍
- 下一篇: linux网路编程之多进程并发服务器