使用go解析二进制tcp数据包
tcp全名是传输控制协议,tcp协议在ip协议基础上增加了数据包完整性检查等保证传输完整性的机制,使其在现在的数据领域得到了广泛的应用
按照下面的步骤可以快速了解tcp数据包中包含的信息
tcp协议rfc文档解读
rfc参考:https://tools.ietf.org/html/rfc793
核心tcp数据包结构如下
可以看到tcp报文由十余个字段组成,最后一个data字段代表了本次tcp数据报文承载的数据,这个数据一般是应用层的数据,比如http报文数据就是在这个tcp包的data字段中
其中常用字段如下
字段 | 作用 |
---|---|
Source Port | 发包机器的端口号 |
Destination Port | 收包机器的端口号 |
Sequence Number | 包编号 |
Acknowledgment Number | 确认包号 |
urg/ack/psh/rst/syn/fin | 标志位,设置是/否的操作标志 |
Window | 流量控制窗口 |
Checksum | 包完整性校验 |
注意:客户端和服务端使用独立的包编号计数器器
checksum服务端和客户端会分别计算,客户端依靠这个值判断tcp包在传输过程中是否被异常改变/篡改
使用wireshark抓包读懂tcp三次握手,四次挥手
tcp三次握手和四次挥手的描述很多,但是感觉大部分文章看下来很难具象化这个过程,下面使用这个wireshark抓包工具,通过抓取到的数据包来理解一下,能够从另一个角度理解tcp三次握手了
完整案例代码已上传github: https://github.com/neatlife/mytcp
wireshark下载地址:https://www.wireshark.org/download.html
创建案例项目
可以在idea中创建一个maven项目,创建用来测试3次握手和4次挥手的两个模块,创建模块在idea右键菜单里就有:
把握手和挥手分开测试是为了防止客户端在发送过程中,服务端就提前关闭了,然后挥手的部分包可能会丢掉,这个丢包的效果可以自行尝试
编写握手客户端和服务端
服务端
建立一个socket服务器,并在8881端口上监听,核心代码如下:
ServerSocket socket = new ServerSocket(8881);
socket.accept();
TimeUnit.SECONDS.sleep(2);
socket.close();
wireshark在mac远程抓包
wireshark下载:https://www.wireshark.org/download.html
在需要被抓包的机器上安装wireshark
yum install -y wireshark
在mac的命令行中使用命令启动wireshark
ssh root@epoll 'dumpcap -i ens33 -w - -f "not port 22"' | wireshark -k -i -
操作效果如下
也可以直接从wireshark中启动
Copyright © 2015 Theme used GitHub CSS. 访问人/ 次