1、引言
在文章《理论联系实际:Wireshark抓包分析TCP 3次握手、4次挥手过程》中,我们学会了用wireshark来分析TCP的“三次握手,四次挥手”,非常好用。这就是传说中的锤子,拿着 锤子,看什么都像 钉子!在这本文中,我对将准 HTTP这颗钉子,狠狠地砸下去。。。
为了对网络数据包的“流转”有更加深刻的理解,我在docker(远程)上部署一个服务,支持http方式调用。从客户端(本地)用http方式请求其中的一个接口,并得到响应数据。同时本地通过wireshark抓包,远程用tcpdump抓包,然后分析过程中的所有通信细节(悲剧是把美好的东西撕碎给人看,而我则是把复杂的东西撕碎了给人看)。
本文的主要内容是:先通过工具获取HTTP通信的数据包,再来抽丝剥茧,深入传输层二进制的天地里,解密HTTP所有的通信细节。分析过程中,由点到面,将相关知识串接起来。市面上讲HTTP协议的文章很多,但深入到传输层从2进制的角度来解析,则相当少见。保证全篇读完之后,你对HTTP的理解会上升一个台阶!
本文稍长,请在看本文时保持耐心。
(本文同步发布于:http://www.52im.net/thread-2456-1-1.html)
2、关于作者
饶全成:毕业于华中科技大学,中科院计算所硕士,滴滴出行后端研发工程师。微信公众号: 码农桃花源,个人博客:https://www.cnblogs.com/qcrao-2018/。
3、系列文章
1)本文是系列文章中的第8篇,本系列文章的大纲如下:
《不为人知的网络编程(一):浅析TCP协议中的疑难杂症(上篇)》
《不为人知的网络编程(二):浅析TCP协议中的疑难杂症(下篇)》
《不为人知的网络编程(三):关闭TCP连接时为什么会TIME_WAIT、CLOSE_WAIT》
《不为人知的网络编程(四):深入研究分析TCP的异常关闭》
《不为人知的网络编程(五):UDP的连接性和负载均衡》
《不为人知的网络编程(六):深入地理解UDP协议并用好它》
《不为人知的网络编程(七):如何让不可靠的UDP变的可靠?》
《不为人知的网络编程(八):从数据传输层深度解密HTTP》(本文)
2)如果您觉得本系列文章过于专业,您可先阅读《网络编程懒人入门》系列文章,该系列目录如下:
《网络编程懒人入门(一):快速理解网络通信协议(上篇)》
《网络编程懒人入门(二):快速理解网络通信协议(下篇)》
《网络编程懒人入门(三):快速理解TCP协议一篇就够》
《网络编程懒人入门(四):快速理解TCP和UDP的差异》
《网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势》
3)《脑残式网络编程入门》也适合入门学习,本系列大纲如下:
《脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手》
《脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?》
《脑残式网络编程入门(三):HTTP协议必知必会的一些知识》
《脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)》
4)其它跟HTTP有关的文章:
《从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路》
《美图App的移动端DNS优化实践:HTTPS请求耗时减小近半》
《一分钟理解 HTTPS 到底解决了什么问题》
《一篇读懂HTTPS:加密原理、安全逻辑、数字证书等》
《小白必读:闲话HTTP短连接中的Session和Token》
《IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理》
《从HTTP到MQTT:一个基于位置服务的APP数据通信实践概述》
《基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)》
《Comet技术详解:基于HTTP长连接的Web端实时通信技术》
《WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)》
《WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)》
4、在传输层捕获HTTP报文
4.1 背景介绍
我手头现在有一个地理几何相关的服务,它提供一组接口对外使用。其中有一个接口是Fence2Area. 使用方传入一个围栏(由点的列表组成,点由表示)、点的坐标系类型(谷歌地图用的是wgs84, 国内腾讯、高德用的是soso, 而百度用的是另一套自己的坐标系),接口输出的则是围栏的面积。
我请求服务的“Fence2Area”接口,输入围栏(fence)顶点(lng, lat)坐标、坐标系类型(coordtype),输出的则是多边形的面积(area).
一次正常的请求示例url, 这个大家都不陌生(我用docker_ip代替真实的ip):
http://docker_ip:7080/data?cmd=Fence2Area&meta={"caller":"test