TCP协议的一些总结(三)
八、 抓包实践
1. 用Android自带浏览器访问m.sohu.com
访问DNS服务器221.130.33.60进行DNS解析,将m.sohu.com域名解析成IP:221.179.173.166。
在发送真正的HTTP请求前需要建立TCP连接,上图是与服务器221.179.173.166建立连接前的三次握手。客户端通告窗口为14600字节,发送的TCP数据长度为0,MSS为1460。服务端的通告窗口为5792,SYN ACK的TCP数据长度为0。
发送HTTP请求,从数据中可以看到请求的数据。
上图报文段6为http请求,报文段7为该http请求的ack报文,报文段8为服务器返回的数据的第一个报文段,报文段9为客户端对8的ack,报文段12为服务端的第二个数据报文段,报文段13为12的ack,一直到报文段33接收数据结束(从报文段19到报文段24都是其它tcp连接的数据),33为一个总结的记录,是一个http结构的数据。其中客户端的win一直在增加,每次增加大概为2880字节。
2. 重传
图:重传数据
服务器为221.130.199.20,客户端为10.200.82.148
报文190为服务端发送给客户端的tcp分段数据,长度1476,tcp数据为1408(1476-68)字节,发送的字节序号为11625~12672。
报文191为报文190的ACK,表明客户端需要的下个字节从12673开始。
报文194为服务端发送给客户端的tcp分段数据,长度1476,tcp数据为1408(1476-68)字节,发送的字节序号为12763~14080。
报文195表为报文194的ACK,表明客户端需要的下个字节从14081开始。
报文229为服务端发送给客户端的tcp分段数据,长度1476,tcp数据为1408(1476-68)字节,提示上一个报文段丢失,查看具体数据,如下图
可以看出接收到的数据序号为19713~21121,表明从14081~19712的数据没有在该报文之前到达,有两种可能:丢失或失序,继续往下看。
报文230为229的ACK,这里有一个Dup 1标记,是由于之前的报文没有到达,所以继续请求14081开始的报文。
报文231为服务端发送给客户端的tcp分段数据,长度1476,tcp数据为1408(1476-68)字节,字节序号为21121~22528。
报文232为232的ACK,有Dup 2标记,继续请求从14081开始的数据。
报文233为服务端发送给客户端的tcp分段数据,长度1476,tcp数据为1408(1476-68)字节,字节序号为22529~23937。
报文234为233的ACK,有Dup 3标记,继续请求从14081开始的数据。这里,由于已经有三个重复请求14081的ACK报文,可以认定14081的报文丢失了。
报文235~报文281为成对的报文发送和ACK,ACK一直在请求14081数据。
报文282为服务器发给客户端的tcp分段数据,长度为1476,wireshark已经表明是一个失序的TCP报文,查看数据如下图:
可以看到,服务端终于将客户端需要的14081报文发送出去。
报文283是281报文的ACK,由于还没收到282报文,所以还是继续请求14081数据。
报文284是282报文的ACK,由于282已经发送了14081~15488,所以下一个需要的报文将从15489开始。
报文285重传数据15489~16896。
报文286为285的ACK确认,同时请求16897开始的数据。
报文287重传数据16897~18304。
报文288为287的ACK确认,同时请求18305开始的数据。
报文302重传数据18305~19712。
报文303为302的ACK确认,同时由于之前已经收到了32384字节,所以请求32385开始的数据。