【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】
文章目錄
- 1.首先準備好抓包工具wireshark
- 2.準備一段簡單的socket程序
- 3.打開wireshark工具進行抓包
- 4.舉例了解一下TCP報文段中的ACK和Seq的含義
- 5.流程分析
- 6.為什么要進行三處握手?
1.首先準備好抓包工具wireshark
wirewhark官網下載地址:wirewhark官網下載地址:wirewhark官網下載地址:https://www.wireshark.org/
2.準備一段簡單的socket程序
🏆(1)服務端程序如下
public void server06() throws IOException {try {serverSocket = new ServerSocket(8080);serverSocket.accept();Thread.sleep(Integer.MAX_VALUE);} catch (InterruptedException e) {e.printStackTrace();} finally {serverSocket.close();}}🏆(2)客戶端程序如下
public void client06() throws IOException {try {socket = new Socket("127.0.0.1", 8080);clientOutputStream = socket.getOutputStream();clientOutputStream.write(new byte[]{'1', '2', '3', '4', '5', '6'});} finally {clientOutputStream.close();socket.close();}}3.打開wireshark工具進行抓包
因為我這個是本地程序測試,所以對本地回環/回調接口進行抓包,也就是上圖中的loopback
此時在8080端口沒有抓取到任何數據,因為此時我們的程序還未啟動此時在8080端口沒有抓取到任何數據,因為此時我們的程序還未啟動此時在8080端口沒有抓取到任何數據,因為此時我們的程序還未啟動
先啟動服務端小程序,然后再啟動客戶端小程序
此時再去看wireshark窗口,就會發現抓取了很多包此時再去看wireshark窗口,就會發現抓取了很多包此時再去看wireshark窗口,就會發現抓取了很多包
前三行就是所謂的三次握手的流程前三行就是所謂的三次握手的流程前三行就是所謂的三次握手的流程
4.舉例了解一下TCP報文段中的ACK和Seq的含義
Seq(序號):簡單了說序號就是該報文段首字節的字節流編號。比如,A主機向B主機發送一個大小為500000字節的數據流(報文),最大報文段長度(MSS)為1000字節,所以要為該數據流(報文)構建500個報文段,所以第一個報文段的seq(序號)就是0,第二個報文段的分配序號為1000,第三個2000,以此類推…
ACK(確認序號):它的意思是期望下一次對方發送給我以ACK為起始字節的數據。比如說,B主機發送給A主機一個報文段(范圍為0~1000的所有字節);此時A主機打算發送一個報文段給B,它的目的是期望B主機給它發送1001及以后的數據,那么此時A->B報文段中的ACK=1001
5.流程分析
第一次握手:
首先客戶端向服務端發送SYN標志,目的是告訴服務器我想與你建立連接(此時len = 0代表沒有數據發送)
第二次握手:
第二次發送了SYN和ACK標志位。ACK = 1表示服務端期待下一次客戶端發送給我的序號(seq)是1,seq=0也很好理解,這兩次都沒發送數據肯定是0呀(如果你看完了第4步seq和ack的例子應該很好理解)
第三次握手:
- 此時的Seq=1應該好理解,因為上一次服務端發送給我的ACK=1(期待我發送1及其以后的數據給它),由于len=0,所以本次也不發送任何數據,三處握手不傳輸任何核心數據。
- 此時ACK=1就是我期待服務端下一次發送給我的起始字節序號。
到這里三次握手就結束了,此外你可以看看三次握手之后的傳輸數據流程
相信應該比較容易理解(我代碼中write了6個字節)
注意客戶端的59712端口是系統分配的,我沒有進行顯示bind
6.為什么要進行三處握手?
其實這是因為無論是客戶端還是服務端都無法確認對方能到接收到它的信息。最重要的原因還是防止已經失效的報文段突然又被服務端接收
總結
以上是生活随笔為你收集整理的【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【大白话系列】带你进入网络的世界【都说计
- 下一篇: 《JVM系列》深入浅出类加载机制中<in