TCP三次握手+数据传输+挥手 抓包分析

TCP三次握手+数据传输+挥手 抓包分析

工具

  • Wireshark
  • 一台linux服务器

TCP三次握手+数据传输+挥手

TCP三次握手+数据传输+挥手 抓包分析_第1张图片

抓包过程:

  1. 在远程服务器(linux)中输入nc -l 8113启动一个8113端口的socket服务器。

  2. 打开Wireshark,在过滤器命令行输入tcp.port == 8113 过滤查看指定端口的TCP数据。TCP三次握手+数据传输+挥手 抓包分析_第2张图片

  3. 在本地客户端(windows子系统的linux)输入nc 120.77.204.248 8113连接远程服务器8113端口,Wireshark中会出现TCP三次握手的数据。

8JP1kF.png

  1. 客户端中输入hello2020 按下回车键,会抓到两个数据包。

8JPMwT.png

8JPt61.png

  1. 重复4步骤输入world,数据包如下。

8JPam6.png

  1. 在客户端按下Ctrl+c正常结束连接退出程序,获取到三个数据包。

8JPBkD.png

抓包分析

注意:

  • ACK和ack(也有写出Ack的)其实是两个东西。Ack是:tcp.nxtseq,而ACK是tcp.flags.ack(在TCP/IP协议中,如果接收方成功的接收到数据,那么会回复一个ACK数据,这个是一个bool值,在确认收到数据的回复中设置为1) ,网上很多配图ACK、ack、Ack混淆一起,误导他人。
  • 在Wireshark中抓包列表中的Seq和Ack其实是一个简写,不是实际值,比如说步骤3中第一条Seq=0,第二条Ack=1(Seq+1),都是为了显示和阅读方便而已,真正的值见下图所示,本文Seq在简化后的值后面注释实际值:TCP三次握手+数据传输+挥手 抓包分析_第3张图片

分析

把获取的10条数据按次序编码1-10,三次握手1-3,两次传输数据4-7,挥手8-10,逐条分析。

  1. SYN=1 Seq=0(4216076034),方向:客户端->服务器,SYN代表请求建立连接,Seq为序列号,客户端请求服务器建立连接,并且发送一个序列号。

  2. SYN=1 Seq=0(1768531804) ack=1(4216076035) ACK=1,方向:服务器->客户端ack为发送过来的Seq+1,SYN=1代表服务器请求向客户端建立连接,ACK=1代表成功接收数据

  3. Seq=1(4216076035) ack=1(1768531805 ACK=1),方向:客户端->服务器,Seq=发送过来的ack ,ack=发送过来的Seq+1


  1. Seq=1(4216076035) ack=1(1768531805) PUSH=1 len=10 ACK=1,方向:客户端->服务器 Seq和ack与上一次发送的一样,PUSH表示这个数据应该被立即发送,而不要等待额外的数据,len="hello2022\n"的长度。

  2. Seq =1(1768531805) ack=11(4216076045) ACK=1 ,方向:服务器->客户端,Ack = Seq + 传递的字节数(len) + 1, 确定数据已经到底,并且告诉接收的数据大小


  1. Seq=11(4216076045) ack=1(1768531805) PUSH=1 len=6 ACK=1 ,方向:客户端->服务器 同上

  2. Seq=1(1768531805) ack=17(4216076051) ACK=1,方向:服务器->客户端


  1. Seq=17(4216076051) ack=1(1768531805) FIN=1 ACK=1,方向:客户端->服务器

  2. Seq=1(1768531805) ack=18(4216076052) FIN=1 ACK=1 ,方向:服务器->客户端

  3. Seq=18(4216076052) ack=2(1768531806) ,方向:客户端->服务器

最后

结合其他文章和本文中数据慢慢理解,文中的抓包数据下载链接:https://www.lanzous.com/iabcbba,用Wireshark软件可以打开,然后过滤器命令行输入tcp.port == 8113就可以了。

你可能感兴趣的:(tcp)