2020-10-14
TCP/IP的“三次握手”與“四次揮手”詳解:
TCP/IP協議:全稱Transmission Control Protocol/Internet Protocol,傳輸控制協議/網間網協議,是目前世界上應用最為廣泛的協議,其作用域包括網絡層、傳輸層、應用層、物理層和數據鏈路層,TCP/IP協議是Internet最基本的協議,也是我們接觸最多的協議之一。
需要注意的是TCP/IP是由很多協議組成的協議簇,并非一個單一協議,其中包括了TCP協議、IP協議、UDP協議、FTP協議、DNS協議等,其中TCP協議與IP協議最為重要,所以用其名命名。
TCP協議,是面向連接的協議,顧名思義就是在數據發送前和對方建立有效的連接。一個TCP連接必須要經過三次“對話”才能建立起來,我們稱之為建立連接的“三次握手”:
大致就是A發送了一個http請求到B,那么A會主動結束closed狀態,打開一個連接,B被動結束closed狀態,進入LISTEN階段,隨后開始三次握手,首先A向B發送一段TCP報文,表示“請求建立連接”,此時報文中標記位SYN置為1,序號為Seq=x(由A生成,一般為1),隨后A進入SYN-SENT階段;
B在接收到A的報文之后,結束LISTEN階段,然后返回給A一段報文,其中標記位為SYN和ACK,表示“B已收到A的連接請求,當前連接正常,允許建立連接”,序號為Seq=y(由B生成,為幾未知),確認號為Ack=x+1,隨后B進入SYN-RCVD階段;
A在接收到B返回的報文之后,明確了B允許建立連接的答復,結束SYN-SENT階段,再發送一段報文給B,其中標志位為ACK,表示“確認收到同意建立連接信號”,序號為Seq=x+1(表示接收到B確認號),確認號為Ack=y+1(表示接收到B序號),隨后進入ESTABLISHED狀態;
B收到A的報文之后,明確了A已進入確認連接狀態,結束SYN-RCVD階段,也進入ESTABLISHED狀態;
隨后A與B可以進行正常的數據傳輸,這就是“三次握手”的過程,其中A與B雙方的確認號Ack和序號Seq都在對方的基礎上進行計算,這樣保證了TCP報文傳輸的連貫性,一旦出現序號不連貫,則代表某一方發出的TCP報文丟失,需要重新發起連接,其中需要注意的是,在“三次握手”過程中,并沒有應用層的數據,SYN這個標志位只有在TCP建產連接時才會被置1,握手完成后SYN標志位被置0;
通過“三次握手”的這個機制,通過確認號和序號,我們有效的規避了有時服務器會開啟一些無用的連接導致浪費資源和一些無效的連接請求報文突然又傳送到了服務器從而產生錯誤的情況。
既然有建立連接,那么也必然會有釋放連接,釋放連接的過程就叫“四次揮手”:
連接的釋放也是由一方自動發起,當A傳輸完數據后,發出停止TCP連接的請求,同時將控制位FIN置為1,序號Seq=U,隨后A進入FIN-WAIT-1階段,代表半關閉狀態,在這個狀態下,A不能再向B發送數據,但是B還能再向A發送數據;
B在收到A的請求之后,確認了A想要斷開連接的信號,隨后結束ESTABLISHED狀態,進入CLOSE-WAIT狀態,然后返回一段報文,其中標記位為ACK,序號Seq=V,確認號Ack=U+1,隨后B準備斷開與A的連接;
A收到B發送的報文后,確認了B已經收到先前斷開連接的信號,于是結束FIN-WAIT-1階段,進入FIN-WAIT-2階段;
B在準備好斷開與A的連接之后,會再向A發送一段報文,其中標記位為FIN,ACK,序號為Seq=W,確認號為Ack=U+1,表示是在收到A報文的基礎上,將其序號Seq值加1作為本段報文確認號Ack的值,隨后B結束CLOSE-WAIT階段,進入LAST-ACK階段,這個狀態下B不會再向A發送數據,但允許接受A的數據;
A在收到B的報文之后,結束FIN-WAIT-2階段,進入TIME-WAIT狀態,向B發送一段報文,其中標記位為ACK,序號為Seq=U+1,確認號為Ack=W+1,隨后A在TIME-WAIT狀態等待2MSL(即兩個報文最大生存時間);
B在接收到A的報文之后,結束LAST-ACK階段,進入CLOSED階段,正式關閉A與B的通道。
A在等待完2MSL之后,結束TIME-WAIT狀態,進入CLOSED狀態;
以上就是“四次揮手”的過程;
總結
以上是生活随笔為你收集整理的2020-10-14的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: getopt命令
- 下一篇: .htaccess 让域名转向到别一域名