上一篇文章简单介绍了一下WireShark这个软件的用法,并分析了一下在网络条件好的情况下,使用宽带+浏览器请求一个数据接口并抓取相关报文,但是有一个重要的问题没有解决,就是在网络状态不好的时候,到底是哪一步让app获取数据的http请求过慢,今天就使用无线网络和安卓模拟器真实的模拟一下用户的情况。
对WireShark不了解的童鞋请看这里:使用WireShark抓包分析Android网络请求时间(一)
这一篇主要剖析在服务器和客户端程序运转良好的情况下,为什么还会出现一次http请求数十秒甚至超过1分钟的情况
首先我们要了解一下TCP协议的特点:
面向连接的传输协议:数据传输之前必须先建立连接,数据传输完成之后,必须释放连接。
仅支持单播传输:每条传输链接只能有两个端点,只能进行点对点的连接,不支持多播和广播的传输方式,UDP是支持的
提供可靠的交付服务:传输的数据无差错,不丢失,不重复,且顺序与源数据一致
传输单位是数据段:每次发送的数据段不固定,受应用层传送报文大小和网络中的MTU(最大传输单元)值大小的影响,最小数据段可能仅有21个字节(其中20个字节属于TCP头部,数据部分仅1字节)。
支持全双工传输:通信双方可以同时发数据和接收数据
TCP连接是基于字节流的:UDP是基于报文流的。
单独说TCP可能记不深刻,对比一下UDP协议就很容易理解TCP的特性:
UDP协议的特点:
1、无连接型
2、不可靠性
3、以报文为便捷
4、无流量控制和拥塞控制方案
5、支持单播,组播,广播等多种通讯方式
TCP是如何保证数据可靠性的:
TCP是一个可以保证可靠数据传输的传输层协议,主要采用采用以下四个机制实现数据可靠性传输:
1、字节编号机制:TCP数据段以字节为单位对数据段的"数据"部分进行一一编号,确保每一个字节的数据都可以有序传送和接收.
2、数据段确认机制:每接收一个数据段都必须有接收端向发送端返回确认数据段,其中的确认号表示已经正确接收的数据段序号.
3、超时重传机制:TCP中有一个重传定时器(RTT),发送一个数据段的同时也开启这个定时器,如果定时器过期之时还没有返回确认,则定时器停止,重传该数据.
4、选择性确认机制:(Selective ACK,SACK)/只重传缺少部分的数据,不会重传那些已经正确接收的数据.