前言
我们tcpdump抓包时会看到除报文数据外,前面还有一段其他的数据,这段数据分为两部分,ip包头(一般20字节)和tcp包头(一般20字节),一般这两个头长度和为40,我们直接跳过抓取的数据前40字节及为我们需要分析的有效数据。
测试环境为centos7,以下截图使用netcat(yum -y install nc安装)进行测试,服务端192.168.11.19监听9999端口,客户端192.168.17.143。服务端执行nc -l 9999,客户端执行nc?192.168.11.19 9999,直接再终端打字回车键发送。(注:netcat工具发送的tcp包头带有套接字选项,头长度为32字节)
一、以太网帧(64-1518字节,Ethernet II,链路层协议)
1.1 字段分布
1.2?示例解析(tcpdump 加上-XX选项可打印帧头的14字节)
1.3 依据帧大小限制的补位和切片
因为Ethernet II协议的最小长度为64,最大长度为1518,抛开帧头和帧尾的18字节,最小传输单元为46,最大传输单元(MTU)值为1500。通常IP包头长20字节,TCP包头也为20字节,则一般的最小报文段长度为6、最大报文段长度(MSS)为1460。以IP包头20字节TCP包头20字节为例,即当我们发送一个空报文是,协议会自动补6字节空数据(如下图),而当我们发送1MB的数据时协议则会将其切片分成1024*1024/1460=719个包逐个发送。
二、IP包头(IPv4为例,20-60字节)
2.1 字段分布
2.2 示例解析(此处118f对应ip包头结束,后面为tcp包头)
三、 tcp包头(20-60字节,不设置sockopt时就为20字节)
3.1 字段分布
3.2 示例解析
3.3?常见套接字选项
四、tcpdump捕获有效数据
4.1 命令:tcpdump -i ens192 -n -X host 192.168.11.19 and port 9999 -vvv -tttt? ?(指定一个网卡、ip 和端口号进行转包)? 注:此处只使用一个-X选项打印16进制,若使用-XX打印的话还会额外打出以太网帧的一些信息。
4.2 示例(只要读取sequence信息行的length字段,表示有效的数据长度,报文尾部开始读取该长度及为我们抓取的数据)