TCP是什么
TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接(連接導向)的、可靠的、 基于IP的傳輸層協議,
TCP有6種標示:SYN(建立聯機) ACK(確認) PSH(傳送) FIN(結束) RST(重置) URG(緊急)
TCP的三次握手
第一次握手:客戶端向服務器發送請求報文,這時報文首部中的同部位SYN=1,并生成一個隨機序列值seq=n,客戶端進入syn-sent(同步已發送)狀態,等待服務器確認
第二次握手:TCP服務器收到請求報文后,如果同意連接,則發出確認報文,確認報文中應該 ACK=1,SYN=1,確認號ACK=n+1,同時自己也隨機生成一個seq=m,此時服務器進入SYN-RCVD(同步收到)狀態,
第三次握手:TCP客戶端行程收到確認后,還要向服務器給出確認,確認報文的ACK=1,ack=m+1,
TCP的三次握手抓包
使用nc -l localhost 8088 監聽8088埠
客戶端使用nc -v localhost 8088 連接8088埠
再開個終端使用 tcpdump -i lo -vv -nnn tcp port 8088 抓包8088 埠tcp連接
抓包資料

為什么需要三次握手
埠 client發送了一個請求連接的報文,但是網路不好,這個請求沒有立即達到服務端,客戶端沒有收到服務器的確認訊息后,任務該請求報文已失效了,但是過了一會之后server收到報文,還是會像client發送確認的報文,表示同意連接,如果這里不用三次握手,那么只要server發出確認報文,新的連接就
建立了,但其實這個請求client已經任務失效了,不會理睬server的確認資訊,也不會像服務器發出確認的請求,但是server的請求已經建立了,并一直等待client的資料,這樣會浪費server的資源,采用三次握手就是為了防止這種情況的發生,server會因為收不到確認的報文,而不會建立連接,
舉個列子:就好比找作業的時候,你通過手機問面試官,我能去面試嗎,面試官說可以,你收到面試官的確認,然后你在確認面試時間,那就可以愉快的去面試了,
四次揮手
第一次揮手:TCP client發送一個FIN ,用來關閉到服務端的連接,client進入FIN_WAIT_1狀態
client行程發出連接釋放報文,并且停止發送資料,釋放報文首部,FIN=1,其序列號為seq=x
第二次揮手:TCP server 收到FIN 后,發送一個ACK 確認,server進入CLOSE_WAIT狀態,客戶端收到ACK后會進入FIN_WAIT_2狀態
這時候處于半關閉狀態,即客戶端已經沒有資料要發送了,但是服務器若發送資料,客戶端依然要接受
第三次揮手:TCP server 發送一個FIN,用來關閉server到client的連接,server進入LAST_ACK狀態,
服務器將最后的資料發送完畢
第四次揮手:TCP client收到FIN后,client進入TIME_WAIT狀態,接著發送一個ACK給server,server進入CLOSED狀態
TCP連接還沒有釋放,必須經過2∗∗MSL(最長報文段壽命)的時間后,當客戶端撤銷相應的TCB后,才進入CLOSED狀態
四次揮手抓包
開個終端使用 tcpdump -vv -nnn tcp port 80 埠tcp連接
再另一個終端里面使用抓包資料

為什么需要四次揮手
終端為了確保資料能夠完全輸出,關閉連接時,當收到主動方的FIN報文通知時,它僅僅表示主動方是沒有資料需要發送了,但是被動方可能還需要發送資料,所以不會馬上關閉SOCKET,于是被動方只發送ACK確認報文,繼續發送一些資料給主動方,然后再發送FIN報文,此時就可以關閉連接了
一次網頁訪問的抓包

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/77537.html
標籤:C++
上一篇:mapx 動態創建圖層問題
