实验场景:自己电脑开启apache服务器,主页有一个文件上传的表单,用舍友的电脑访问并上传一个小文件,抓包到TCP连接以及上传文件时的数据包进行分析,文件位置:上传文件分析.pcapng,用显示过滤器:tcp&&ip.addr==10.108.203.52,一次对显示的报文进行分析首先分析TCP建立连接的三次握手:1、TCP连接第一次握手summary:994.72569600010.108.203.5210.108.203.50TCP666533→http[SYN]Seq=0Win=65535Len=0MSS=1460WS=256SACK_PERM=1Detail:ABCDEFGHIJKLMNOP128d244c7d262c8600046552208004500200345d044000400632810a6ccb340a6c3cb3219850050a6877d250000000080024ffff864f0000020405b401030308010150402首先分析一下IP报文:在2E~2F位置是标志和片偏移共2B,0x4000即:0100000000000000片偏移全为0,而低2位的为bit1表示这个IP数据包不要分片。在2G位置是TTL:这里0x40即:64,在2H是协议字段这里是0x06:表示后面的是TCP报文正式分析TCP报文:1985源端口号:0x1985即:6533,表示对方浏览器用TCP6553端口访问我的服务器0050目的端口:0x50即:80,表示我的apache服务器是在用TCP8端口a6877d25序号:这个是对方发送同步请求是选用的一个序号,279389725300000000确认号:由于这是第一次连接请求,所以置空为08002分开来说,即:1000000000000010前4bit表示数据偏移,也就是首部的长度,这里是8*4=32B,正好是3C~5B(最后)的字节数。往后6bit做保留置空后面6bit分别来说:第一个,URG:表示紧急激活后面的紧急指针字段,这里为0第二个,ACK:激活确认号字段,因为是第一次请求所以ACK置空为0第三个,PSH:推送,让收到这个TCP报文的TCP处理模块加快上传到应用程序中,这里为0,一般都不用第四个,RST:复位,表示连接出现差错需要重新连接,也用来拒绝非法报文段或拒绝打开第五个,SYN:同步,在连接时用来同步序号,这里为1再加上ACK为0表示这是一个TCP连接请求报文第六个,FIN:终止,用来释放一个连接,表示发送方的数据已经发送完毕,并要求释放链接,这里为0ffff窗口:表示自己能接受的TCP控制窗口,这里0xffff即:65535B,表示自己能接受的发送窗口值为65535B,自己的缓存够用864f检验和:检验包括首部和数据部分,略。0000紧急指针:本报文段中的紧急数据的字节数,这里为0,暂且认为表示的是紧急数据的字节数,紧急数据属于TCP数据字段其后就是普通的数据向下是可选项:020405b4Maximumsegmentsize:1460bytes其中:0x02:类型,这里表示这个是MSSsize设置的选项0x04:长度,这里表示这个可选项的长度是4字节0x05b4:MSSValue,这里表示MSSValue的值是1460,即这个链接传送的TCP数据字段最大字节数是1460个字节,由此来看分配的很紧凑,1460+20(TCP头)+20(IP头)=1500B(MAC帧长度限制)01No-Operation(NOP),不知道什么意思030308Windowscale:8(multiplyby256):不明白什么意思,但是有下面的信息:0x03:Kind:WindowScale(3)0x03:Length:30x08:Shiftcount:801No-Operation(NOP),不知道什么意思01No-Operation(NOP),不知道什么意思0402TCPSACKPermittedOption:True其中:0x04:Kind:SACKPermission(4)0x02:Length:22、TCP连接第二次握手Summary:1024.72674300010.108.203.5010.108.203.52TCP66http→6533[SYN,ACK]Seq=0Ack=1Win=8192Len=0MSS=1460WS=256SACK_PERM=1Detail:ABCDEFGHIJKLMNOP1c8600046552228d244c7d2620800450020034161840004006796d0a6ccb320a6c3cb3400501985c746e0b5a6877d26801242000be410000020405b401030308010150402直接分析TCP报文:0x0050,即:80,源端口,是字节apache服务器的端口0x1985,即:6533,目的端口,对方浏览器连接视同的端口,和上面的分析对应c746e0b5序号:自己Apache服务器选的序号:3343311029a6877d26确认序号:确认的对方下次应该发送的字节序号:2793897254,是上面的值加18012分开来说:0x1000000000010010前4bit位是数据偏移即TCP报文首部数据长度,这里表示32B之后6bit保留置空为0后面的6bit分开来说:第一个:URG,用于激活下面的紧急指针字段,这里没有激活第二个:ACK,表示是确认的报文,激活确认号字段,这里激活第三个:PSH:置空为0第四个:RST,复位,置空为0第五个:SYN,同步SYN,这里为1结合ACK,表示这是一个对同步求组确认的报文第六个:FIN,这里为02000窗口大小:这里表示对方可用的发送端口是8192B,可见服务器这边的窗口和客户端的窗口值不一样啊be41校验和:略0000紧急指针:置空为0下面是可选项:020405b4MSS选项:Maximumsegmentsize:1460bytes其中:0x02:Kind:MSSsize(2)0x04:Length:40x05b4:MSSValue:146001No-Operation(NOP)030308Windowscale:8(multiplyby256)01No-Operation(NOP)01No-Operation(NOP)0402TCPSACKPermittedOption:True3、TCP连接第三次握手Summary:1034.72766800010.108.203.5210.108.203.50TCP606533→http[ACK]Seq=1Ack=1Win=262144Len=0Detail:ABCDEFGHIJKLMNOP128d244c7d262c8600046552208004500200285d0540004006328c0a6ccb340a6c3cb3219850050a6877d26c746e0b65010404001b150000000000000000先分析IP包,首部2E部分中又包含报文段不能分片的选项,与前面两个一样分析TCP段:1985源端口号:即6553,对方浏览器TCP的端口号0050目的端口号:即80,Apache的TCP端口号a6877d26序号:这里是2793897254和前一个报文的确认号是一样的c746e0b6确认号:这里是3343311029,是上一个序号的值加15010要分开来说:即:0101000000010000其中前4bit位是:5表示首部数据长度是20B,终于是标准的长度了向后6bit保留置空为0后面六个:第一个:0,URG:表示不激活后面的紧急指针字段第二个:1,ACK:表示确认激活确认号字段第三个:0,PSH:表示不推送第四个:0,RST:表示不复位第五个:0,SYN:表示不是同步请求或者同步确认,结合ACK表示这是一个确认报文第六个:0,FIN:表示这不是一个结束相关报文0400窗口大小:这里是0x0400即:1024,表示自己(浏览器)可以接受的窗口值是1024,很奇怪第一次的同步请求的时候还说自己0xffff窗口值呢,怎么现在又突然少了,纳闷!1b15校验和:略0000紧急指针:置空为0000000000000由于报文总长度未达到MAC帧的最小长度46字节故填充这八个字节为04、下面是HTTP请求:Summary:1044.72778100010.108.203.5210.108.203.50HTTP303GET/HTTP/1.1Detail:ABCDEFGHIJKLMNOP128d244c7d262c8600046552208004500201215d064000400631920a6ccb340a6c3cb3219850050a6877d26c746e0b650184040075860000474554202f204854545052f312e310d0a4163636570743a207465678742f68746d6c2c206170706c696361774696f6e2f7868746d6c2b786d6c2c2082a2f2a0d0a4163636570742d4c616e679756167653a207a682d434e0d0a55736510722d4167656e743a204d6f7a696c6c61112f352e30202857696e646f7773204e541220362e333b2054726964656e742f372e13303b2072763a31312e3029206c696b6514204765636b6f0d0a4163636570742d45156e636f64696e673a20677a69702c20641665666c6174650d0a486f73743a203130172e3130382e3230332e35300d0a444e54183a20310d0a436f6e6e656374696f6e3a19204b6565702d416c6976650d0a0d0a首先来分析IP部分:在首部依然有指示本IP报不能分片分析TCP部分:1985源端口号:65530050目的端口号:80a6877d26序号:2793897254,这个和浏览器三次握手中最后发的确认报文用的是同一个序号,看上面的c746e0b6确认序号:3343311029,这个和浏览器三次握手中最后发的确认报文段是同一个确认号5018这个分开来说:0101000000011000前四个bit即5,表示TCP首部数据共20B,标准的首部后面的6bit置空为0向后六个分开说:第一个0,URG,表示不激活紧急指针字段第二个1,ACK,表示激活确认号字段第三个1,PSH,表示推送此报文段,让接收方的TCP模块加快处理这个报文第四个0,RST,表示不复位第五个0,SYN,表示这个不是同步请求或同步确认报文第六个0,FIN,表示这个不是结束相关报文0400窗口值大小:0x0400,即1024B,表示自己(浏览器)能接受的TCP窗口值大小是1024B7586校验和:略0000紧急指针:置空为0Accept:□text/html,applIcatIon/xhtml+xml,*/*\r\n再向下为HTTP部分,分析一下:对应的ASCII码填入即可:474554202f2048545450GET□/□HTTP2f312e310d0a4163636570743a207465/1.1[CR][LF]ACCEPT:□te78742f68746d6c2c206170706c696361xt/html,□applica74696f6e2f7868746d6c2b786d6c2c20tion/xhtml+xml,□2a2f2a0d0a4163636570742d4c616e67*/*[cr][lf]Accept-lang756167653a207a682d434e