目录
实验环境及工具
ubuntu 虚拟机
wireshark
实验开始
tcp 格式分析
虚拟机使用的是NAT 模式 ,开机后开启apache2 服务, 物理机启动wireshark 并绑定vmnet 8 ,物理机访问虚拟机80端口,
呃 , 看到这么多包,头有点大 , 我们先从头开始,首先http协议的传输层使用TCP协议 , 先来看TCP包的格式。 参考博客,感谢这位大佬的博客贴的他的图,问了没回我。。要是不同意的话,我再换下来。
这幅图 ,对tcp协议有个简单的回顾。TCP 是面向流(数据有顺序)、可靠的传输协议,
源端口地址 : 一个16位字段, 定义了发送这个报文段的主机中应用程序的端口号 。
目的端口号 : 16位字段 , 定义了接收这个报文段的主机中应用程序的端口号 。
序号 : 32位字段 , 定义了指派给本报文段第一个数据字节 的编号 。 Tcp 是 流运输协议 ,为了保证连接性, 要发送的每一个字节都要编上号 。 序号 可以告诉终点, 报文段中的第一个字节是这个序号的哪一个字节。在连接建立时, 双方使用各自的随机数产生器产生一个初始序号(init sequence number)。通常,两个方向上的ISN是不同的。
确认号 : 32位字段, 定义了报文段的接收方期望从对方接收的字节编号。如果报文段的接收方成功地接收了对方发来的编号为x的字节。那么它就返回x+1作为确认号。确认可以和数据捎带一起发送。
首部长度 HLEN : 4位字段, (1~15)指出Tcp首部一共有多少个4字节字。
保留 : 6位字段, 保留今后使用。
控制 : 该6位字段定义了6种不同的控制位或标志, 同一时间可设置一位或多为标志。 这些标志用在tcp流量控制,连接建立,和终止,连接异常终止,及数据传送方式等方面。
URG :紧急至真有效 RST : 连接复位 ACK : 确认是有效的 SYN:同步序号 PSH:请求推送 FIN:终止连接
窗口大小:16位字段, 定义了发送Tcp窗口的大小,以字节位单位,16位,意味着窗口最大长度是65535字节。通常被称为接收窗口,并有接收方来决定。此情况下,发送方必须服从街上方的指示。
检验和 : 16位字段。检验和是强制性的。
紧急指针 :只有紧急标志位置位时,此字段才生效,此时报文段中包含了紧急数据。
选项:在Tcp首部中可以有多达40字节的可选信息。
tcp 三次握手
tcp抓包分析
知道这些后可以来看抓包分析了,
发现并不单纯 ,最外层是个mac帧,内部还有个ip层 , 出去红框和黄线,最后才是tcp数据。这里不对IP数据包和mac帧进行描述。重要的是:源目地端口60257(eb61)、80(0050) 、SYN=1、序号 0x24148920 ,再看服务端回应
源目地端口交换,80 , 60257 ,SYN=1 , ACK=1 确认序号为0x24148921 .,序号为0x43448e42 。
最后一次握手 源目地端口交换 , ACK=1 , 序号0x24148921 , 确认号0x43448e43 , 完成TCP连接。
做完以后发现tcp 三次握手原来也比较简单, 可能是拥塞控制等机制比较复杂吧,
http抓包分析
来看握手成功后的第一个http数据包
返回对该包的确认
响应请求
http格式分析
http 请求
请求行
用来说明请求类型、 访问资源和http版本
如图,请求方式 get , http 版本1.1
请求头部
说明服务附加信息
host = 192.168.149.142
…等等
空行
空行是必须的
请求数据
这里是空的
http 响应
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
状态头
版本和状态
http/1.1 返回状态200 ,ok
消息报头
用来说明客户端要使用的一些附加信息
Date : 生成响应的日期和时间
Content-type;charset : 响应的类型和响应的编码
。。。。。等等
空行(必须的)
响应正文
这个就是数据部分