在互联网产品开发的认知中,普遍认为网络层对应用层透明,不管是APP还是H5,不管是android还是iOS,应用开发均无需关注网络层的配置,这其实是有前提的,那就是应用层对网络层的异常已经具备足够兼容性,否则,“常在河边走,哪能不湿鞋”,网络层配置导致的故障,往往更隐蔽,更难排查。以下正是几年前所负责项目中碰到的一个案例:
【现象】某业务客户端APP在某地区主页面打不开,但可以登录
【概念】先普及两个TCP/IP七层协议的概念,MSS(Maxitum Segment Size)和MTU(Maximum Transmission Unit),前者是分片,后者是分段,前者是四层TCP层概念,后者是二层链路层概念,但目的都是一样,为了将数据分段传输并能组装,TCP协议在实现的时候,MSS这个值往往用MTU值代替(MSS=MTU-IP数据包包头的大小 - TCP数据段的包头大小)
【分析】好,清楚以上概念后,我们看下抓包的情况:
1、APP与后端系统的协商过程
2、网络传输中的分片情况
从后台抓包情况看,客户端发过来的DF值为Don't Fragment,即是说,只要不超过1360,就不会分片(下图第一个框)。但实际情况是,大部分的业务请求包均被分片为256byte(下图第二个框,从这里即可定位是离用户最近的上一跳网络设备(路由器或防火墙)传过来的数据有问题)。
【解决】定位到问题就好办了,查了离用户最近的网络设备,发现是防火墙配置MTU为被强制为256,需改回默认值
【思考】请想一下,为什么不会影响到登录流程呢?
网友评论