您的位置:首页 > 理论基础 > 计算机网络

解析PCAP包理解TCP/IP

2015-09-18 09:09 477 查看

1.TCP/IP协议各层关系



ICMP是IP协议的附属协议。IP层用它来与其他的主机或者路由器交换错误的报文和其他重要信息。IGMP是Internet组管理协议,它用来把一个UDP数据包多播到多个主机。ARP和RARP是某些网络接口(如以太网和令牌环网)使用的特殊协议,他们用来转换网络接口的物理地址和对应的IP地址。

当目的主机接收到一个以太网数据帧时,数据就开始从协议栈的底部往上升,同时去掉各层封装的报文首部。每层协议盒都要去检查报文首部中的协议标识,确定接收数据的上层协议,这个过程就是分用。



2.IP数据包格式

IP首部长度一般为20字节,由于选项可变,首部实际长度通过4位首部长度进行确定。IP数据包的首部 长度必须为32的倍数,5*4Byte=20Byte。8位协议,6表示TCP,17表示UDP,1表示ICMP,2表示IGMP。





3.TCP和UDP协议

3.1 TCP数据包格式





TCP是可靠连接协议,TCP连接三次握手过程为:
<
4000
span style="white-space:pre;">(1)请求端(客户)发送一个SYN报文段指明客户打算连接的服务器的端口,以及初始化序号ISN,这个SYN段称为报文1;(如:192.168.1.100用端口1300向服务器192.168.2.2的21端口发送一个连接请求,报文序号为0)
(2)服务器发回包含服务器的初始化序号的SYN报文段(报文段2)作为应答。同时将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号;(如:服务器用21端口向客户端端口1300确认刚才的连接请求,这个报文段序号为0,确认序号为客户端发送的报文段序号+1)
(3)客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文进行确认(报文段3)(如:客户端发送一个带序号的报文对刚才发送的报文进行确认,这次发送的报文序列号为1,确认序号为服务器发送的报文段序号+1)。
TCP终止连接的过程,简称四次挥手过程:
四次挥手的原因由于TCP的半关闭造成的。TCP连接是全双工的(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭,这个原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接。当一端收到一个FIN,它必须通知应用层另一端已经终止了那个方向的数据发送。
(1)首先进行关闭的一方(即发送第一FIN,一般是客户端)将执行主动关闭,而另一方(收到这个FIN)执行被动关闭。(如:客户端用端口1300对服务器端口21发送一个序号为192的FIN报文)(ACK,FIN)
(2)当接受方(服务器端)收到关闭方发送的FIN,TCP服务器向应用程序传送一个文件结束符,然后它发回一个ACK,确认序号为收到的序号加1,一个FIN占用一个序号;(如:服务器端口21对客户端端口1300发送一个序号为592的确认报文,它的ACK序号为193(192+1)(ACK)
(3)服务器程序关闭它的连接,它的TCP端发送另一个FIN(如:服务器端又发送一个序号为592的FIN报文,与上一个报文序号、ACK序号与上一个报文一样)(ACK,FIN)
(4)当客户端收到服务器端发送的FIN,客户就必须发回一个确认,并将确认序号设置为收到序号加1(如:客户端端口21发送一个序号为193的确认报文,它的ACK序号为593(592+1))

3.2 UDP报文格式



DNS解析:



域名解析:
查询名部分长度不定,一般为要查询的域名(也会有IP的时候,即反向查询)。此部分由一个或者多个标示符序列组成,每个标示符以首字节数的计数值来说明该标示符长度,每个名字以0结束。计数字节数必须是0~63之间。该字段无需填充字节。例如:03 77 77 77 06 67 6f 6f 67 6c 65 02 63 6e 00 表示www.google.cn
03的3表示后面有3个字符,00表示结尾

4.PCAP报文解析

4.1解析PCAP头



1、时间戳,包括:
秒计时:32位,一个UNIX格式的精确到秒时间值,用来记录数据包抓获的时间,记录方式是记录从格林尼治时间的1970年1月1日 00:00:00 到抓包时经过的秒数;
微秒计时:32位, 抓取数据包时的微秒值。换成北京时间加上时区8
2、数据包长度:32位 ,标识所抓获的数据包保存在pcap文件中的实际长度,以字节为单位。
3、数据包实际长度: 所抓获的数据包的真实长度,如果文件中保存不是完整的数据包,那么这个值可能要比前面的数据包长度的值大。

PCAP头长度24B

4.2 packet包头



Timestamp:时间戳高位,精确到seconds

Timestamp:时间戳低位,精确到microseconds
Caplen:当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。
Len:离线数据长度:网络中实际数据帧的长度,一般不大于caplen,多数情况下和Caplen数值相等。

获取packet的时间TimeStamp,整个包的长度Caplen。
packet长度16B

4.3 以太网帧头



通过类型2B可以判断0x0800为IP,0x0806为ARP,0x8035为RARP

4.4 Host解析

当去掉packet头+以太网帧头+IP头+TCP头以后可以得到type,type可为GET,POST。报文例如:

GET /loldytt/js/qdb.js HTTP/1.1

Host: img.cnsofas.com

Connection: keep-alive

Accept: */*

User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36

Referer: http://www.loldytt.com/
Accept-Encoding: gzip, deflate, sdch

Accept-Language: zh-CN,zh;q=0.8

If-Modified-Since: Mon, 07 Sep 2015 07:01:13 GMT

解析上述报文可得到Host。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: