1.模拟客户端和服务器端
我们准备了两台Linux虚拟机,分别是:
192.168.37.90 Client
192.168.37.100 Server
服务器端,我们可以启动一个Python的http服务来模拟。一般的Linux服务只要有Python2都可以运行:
python -m SimpleHTTPServer 8000
输入命令后,启动了一个监听8000端口的HttpServer服务。
客户端,我们直接用curl命令或者telnet
curl http://192.168.37.100:8000
或者
telnet 192.168.37.100 8000
下图,可以看到刚才的curl命令已经成功请求了。
客户端和服务器端都准备好了,现在开始开发我们的监听代码,我们的目标是获取到三次握手和四次分手的网络包。
2.三次握手代码
上一节,我们已经完成了网络包分层的代码,既然是要抓TCP的包,我们这次就关注tcpLayer := packet.Layer(layers.LayerTypeTCP) 这部分。
经过断言后,tcp 变量里面就可以获取到TCP层的所有信息。
我们先看三次握手:
第一次握手,SYN标志位为True,ACK标志位为False
第二次握手,SYN标志位和ACK标志位都为True
第三次握手,SYN标志位为False,ACK标志位为True,同时AckNum确认值是第二次握手SeqNum+1
结合情况,我们可以这样获取:
声明变量SecondSeqNum ,记录第二次握手的序列号。
var SecondSeqNum uint32
tcpLayer := packet.Layer(layers.LayerTypeTCP)
if tcpLayer != nil {
tcp, _ := tcpLayer.(*layers.TCP)
// TCP layer variables:
// S