TCP 三次握手 示意圖
Wireshark 抓包注意事項
爲了演示一個TCP三次握手創建鏈接的過程,咱們經過 Chrome 訪問一個網頁。
已知 HTTP 協議就是創建在TCP連接上的編程
好比訪問如下的網址:
http://toutiao.newmedia139.net/服務器
經過 Cmd 的 ping 命令獲取 這個網站對應的 IP地址 183.136.236.13
socket
肯定 這個IP 有一個很是重要的好處,就是咱們只須要網站
電腦 -> 網站 的數據包spa
網站->電腦 的數據包.net
因此,能夠使用Wireshark的顯示過濾規則,只顯示咱們須要的數據,否則你必定看着滿屏幕的數據抓狂的。3d
過濾規則以下:
ip.src==183.136.236.13 or ip.dst==183.136.236.13blog
截圖:
分析TCP握手包
概覽
經過圖片,能夠看到 先 進行了 TCP 三次傳輸 而後才 開始 HTTP 傳輸圖片
第一次 客戶端發送 SYN 報文 到服務器
第二次 ,服務器接收到 客戶端的SYN 報文,回覆 SYN + ACK 報文
第三次 ,客戶端接收到服務端的 SYN+ACK 報文後,回覆 ACK報文
注意:
這裏有個坑:Wireshark 顯示的 Syn Ack的數目是不許確的ip
理論上,Syn 應該初始值是個隨機數的,後面的要根據初始值增長
TCP 三次握手總結
創建一個穩定的 雙向 鏈接,最少須要 幾回 通訊呢?
以打電話爲例
小明 給小紅 打電話
小明 : 喂,小紅 聽獲得麼?
小紅: 嗯,我聽到你說話了,你能聽到我麼?
小明:我能聽到你。
只有這三個傳輸都正確了,才能保障雙方是 連通的
TCP 四次揮手
因爲TCP鏈接是全雙工的,所以每一個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的鏈接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP鏈接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另外一方執行被動關閉。
CP的鏈接的拆除須要發送四個包,所以稱爲四次揮手(four-way handshake)。客戶端或服務器都可主動發起揮手動做,在socket編程中,任何一方執行close()操做便可產生揮手操做。
(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送。
(2)服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1。和SYN同樣,一個FIN將佔用一個序號。
(3)服務器B關閉與客戶端A的鏈接,發送一個FIN給客戶端A。
(4)客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1。
TCP採用四次揮手關閉鏈接如圖2所示。
抓包截圖
其中 183.136.236.13 是服務器的ip
能夠看到 這一次揮手是由 服務器 發起的
第一次揮手 FIN +ACK
第二次揮手 ACK
第三次揮手 FIN +ACK
第四次揮手 ACK
總結
TCP 因爲是全雙工的,斷開連接須要四次揮手