实验场景:自己电脑开启apache服务器,主页有一个文件上传的表单,用舍友的电脑访问并上传一个小文件,抓包到TCP连接以及上传文件时的数据包进行分析,文件位置:上传文件分析.pcapng,用显示过滤器:tcp&&ip.addr==10.108.203.52,一次对显示的报文进行分析首先分析TCP建立连接的三次握手:
1、TCP连接第一次握手
summary:
99 4.725696000 10.108.203.52 10.108.203.50 TCP 66 6533 →http [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=256 SACK_PERM=1
首先分析一下IP报文:
在2E~2F位置是标志和片偏移共2B,0x4000即:0100 0000 0000 0000片偏移全为0,而低2位的为bit1表示这个IP数据包不要分片。
在2G位置是TTL:这里0x40即:64,在2H是协议字段这里是0x06:表示后面的是TCP 报文
正式分析TCP报文:
0x1985即:6533,表示对方浏览器用TCP6553端口访问我的服务器
80,表示我的apache服务器是在用TCP8端口
2793897253
分开来说,即:1000 0000 0000 0010
前4bit表示数据偏移,也就是首部的长度,这里是8*4=32B,正好是3C~5B(最后)的字节数。
往后6bit做保留置空
后面6bit分别来说:
第一个,URG:表示紧急激活后面的紧急指针字段,这里为0
第二个,ACK:激活确认号字段,因为是第一次请求所以ACK置空为0
第三个,PSH:推送,让收到这个TCP报文的TCP处理模块加快上传到应用程序中,这里为0,一般都不用
第四个,RST:复位,表示连接出现差错需要重新连接,也用来拒绝非法报文段或拒绝打开
第五个,SYN:同步,在连接时用来同步序号,这里为1再加上ACK为0表示这是一个TCP连接请求报文
第六个,FIN:终止,用来释放一个连接,表示发送方的数据已经发送完毕,
窗口:表示自己能接受的TCP控制窗口,这里0xff ff即:65535B,表示自己能接受的发送窗口值为65535B,自己的缓存够用
0,暂且认为表示的是紧急数据的字节数,紧急数据属于TCP数据字段其后就是普通的数据
其中:
0x02:类型,这里表示这个是MSS size设置的选项
0x04:长度,这里表示这个可选项的长度是4字节
0x05 b4:MSS Value,这里表示MSS Value的值是1460,即这个链接传送的TCP数据字段最大字节数是1460个字节,由此来看分配的很紧凑,1460+20(TCP头)+20(IP头)=1500B(MAC 帧长度限制)
不知道什么意思
:不明白什么意思,但是有下面的信息:
0x03:Kind: Window Scale (3)
0x03:Length: 3
0x08:Shift count: 8
不知道什么意思
不知道什么意思
其中:
0x04:Kind: SACK Permission (4)
0x02:Length: 2
2、TCP连接第二次握手
Summary:
102 4.726743000 10.108.203.50 10.108.203.52 TCP 66 http →6533 [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
直接分析TCP报文:
0x00 50,即:80,源端口,是字节apache服务器的端口
服务器选的序号:3343311029
2793897254,是上面的值加1
0x1000 0000 0001 0010
前4bit位是数据偏移即TCP报文首部数据长度,这里表示32B
之后6bit保留置空为0
后面的6bit分开来说:
第一个:URG,用于激活下面的紧急指针字段,这里没有激活
第二个:ACK,表示是确认的报文,激活确认号字段,这里激活
第三个:PSH:置空为0
第四个:RST,复位,置空为0
第五个:SYN,同步SYN,这里为1结合ACK,表示这是一个对同步求组确认的报文
FIN,这里为0
窗口大小:这里表示对方可用的发送端口是8192B,可见服务器这边的窗口和客户端的窗口值不一样啊
紧急指针:置空为0
MSS选项:Maximum segment size: 1460 bytes
其中:
0x02:Kind: MSS size (2)
0x04:Length: 4
0x05 b4:MSS Value: 1460
3、TCP连接第三次握手
Summary:
103 4.727668000 10.108.203.52 10.108.203.50 TCP 60 6533 →http [ACK] Seq=1 Ack=1 Win=262144 Len=0
Detail:
先分析IP包,首部2E部分中又包含报文段不能分片的选项,与前面两个一样
6553,对方浏览器TCP的端口号
,Apache的TCP端口号
和前一个报文的确认号是一样的
3343311029,是上一个序号的值加1
要分开来说:即:0101 0000 0001 0000
其中前4bit位是:5表示首部数据长度是20B,终于是标准的长度了
向后6bit保留置空为0
后面六个:
第一个:0,URG:表示不激活后面的紧急指针字段
第二个:1,ACK:表示确认激活确认号字段
第三个:0,PSH:表示不推送
第四个:0,RST:表示不复位
第五个:0,SYN:表示不是同步请求或者同步确认,结合ACK表示这是一个确认报文
第六个:0,FIN:表示这不是一个结束相关报文
窗口大小:这里是0x04 00即:1024,表示自己(浏览器)可以接受的窗口值是1024,很
0xff ff窗口值呢,怎么现在又突然少了,纳闷!
帧的最小长度46字节故填充这八个字节为0