TCP三次握手+数据传输+挥手 抓包分析
工具
- Wireshark
- 一台linux服务器
TCP三次握手+数据传输+挥手
抓包过程:
-
在远程服务器(linux)中输入
nc -l 8113
启动一个8113端口的socket服务器。 -
打开Wireshark,在过滤器命令行输入
tcp.port == 8113
过滤查看指定端口的TCP数据。 -
在本地客户端(windows子系统的linux)输入
nc 120.77.204.248 8113
连接远程服务器8113端口,Wireshark中会出现TCP三次握手的数据。
- 客户端中输入
hello2020
按下回车键,会抓到两个数据包。
- 重复4步骤输入
world
,数据包如下。
- 在客户端按下
Ctrl+c
正常结束连接退出程序,获取到三个数据包。
抓包分析
注意:
- 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在简化后的值后面注释实际值:
分析
把获取的10条数据按次序编码1-10,三次握手1-3,两次传输数据4-7,挥手8-10,逐条分析。
-
SYN=1 Seq=0(4216076034)
,方向:客户端->服务器
,SYN代表请求建立连接,Seq为序列号,客户端请求服务器建立连接,并且发送一个序列号。 -
SYN=1 Seq=0(1768531804) ack=1(4216076035) ACK=1
,方向:服务器->客户端
ack为发送过来的Seq+1,SYN=1代表服务器请求向客户端建立连接,ACK=1代表成功接收数据 -
Seq=1(4216076035) ack=1(1768531805 ACK=1)
,方向:客户端->服务器
,Seq=发送过来的ack ,ack=发送过来的Seq+1
-
Seq=1(4216076035) ack=1(1768531805) PUSH=1 len=10 ACK=1
,方向:客户端->服务器
Seq和ack与上一次发送的一样,PUSH表示这个数据应该被立即发送,而不要等待额外的数据,len="hello2022\n"的长度。 -
Seq =1(1768531805) ack=11(4216076045) ACK=1
,方向:服务器->客户端
,Ack = Seq + 传递的字节数(len) + 1, 确定数据已经到底,并且告诉接收的数据大小
-
Seq=11(4216076045) ack=1(1768531805) PUSH=1 len=6 ACK=1
,方向:客户端->服务器
同上 -
Seq=1(1768531805) ack=17(4216076051) ACK=1
,方向:服务器->客户端
-
Seq=17(4216076051) ack=1(1768531805) FIN=1 ACK=1
,方向:客户端->服务器
-
Seq=1(1768531805) ack=18(4216076052) FIN=1 ACK=1
,方向:服务器->客户端
-
Seq=18(4216076052) ack=2(1768531806)
,方向:客户端->服务器
最后
结合其他文章和本文中数据慢慢理解,文中的抓包数据下载链接:https://www.lanzous.com/iabcbba,用Wireshark软件可以打开,然后过滤器命令行输入tcp.port == 8113
就可以了。
转载:https://blog.csdn.net/qq_17271589/article/details/104898604