0
点赞
收藏
分享

微信扫一扫

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】


文章目录

  • ​​1.首先准备好抓包工具wireshark​​
  • ​​2.准备一段简单的socket程序​​
  • ​​3.打开wireshark工具进行抓包​​
  • ​​4.举例了解一下TCP报文段中的ACK和Seq的含义​​
  • ​​5.流程分析​​
  • ​​6.为什么要进行三处握手?​​

1.首先准备好抓包工具wireshark

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_数据​​​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工具进行抓包

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_计算机网络_02


因为我这个是本地程序测试,所以对本地回环/回调接口进行抓包,也就是上图中的loopback

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_数据_03


【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_客户端_04


先启动服务端小程序,然后再启动客户端小程序

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_计算机网络_05

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_计算机网络_06

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_数据_07

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_服务端_08

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_服务端_09


4.举例了解一下TCP报文段中的ACK和Seq的含义

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_客户端_10


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.流程分析

第一次握手:

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_服务端_11



首先客户端向服务端发送SYN标志,目的是告诉服务器我想与你建立连接(此时len = 0代表没有数据发送)第二次握手:

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_计算机网络_12


第二次发送了SYN和ACK标志位。ACK = 1表示服务端期待下一次客户端发送给我的序号(seq)是1,seq=0也很好理解,这两次都没发送数据肯定是0呀(如果你看完了第4步seq和ack的例子应该很好理解)第三次握手:

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_客户端_13

  • 此时的Seq=1应该好理解,因为上一次服务端发送给我的ACK=1(期待我发送1及其以后的数据给它),由于len=0,所以本次也不发送任何数据,三处握手不传输任何核心数据。
  • 此时ACK=1就是我期待服务端下一次发送给我的起始字节序号。
  • 【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_数据_14

到这里三次握手就结束了,此外你可以看看三次握手之后的传输数据流程

【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】_计算机网络_15


相信应该比较容易理解(我代码中write了6个字节)


注意客户端的59712端口是系统分配的,我没有进行显示bind



6.为什么要进行三处握手?

其实这是因为无论是客户端还是服务端都无法确认对方能到接收到它的信息。最重要的原因还是防止已经失效的报文段突然又被服务端接收


举报

相关推荐

0 条评论