用Wireshark简单分析HTTP通信
我们都学过TCP,HTTP的相关概念,本文借助协议分析工具Wireshark,让大家对一些概念眼见为实,权当温故而知新。
场景:
在Client(10.239.196.211)上通过web browser访问另一台Server(10.239.9.22)上的web server.
步骤:
0. 首先配置Wireshark -> Edit -> Preference -> Protocol:
如下配置的HTTP包显示效果与TCP segment的时序比较一致,便于理解。

1. 用浏览器访问 http://10.239.9.22:8080/,同时打开Wireshark, 抓包如下:

2. 抓到的内容太多,先用Wireshark filter expression过滤一下: http

3. 然后我们找到了关心的packet, 右键 Follow -> TCP Stream,找到所在的TCP Stream

于是得到了如下比较清爽的结果,呈现的即是"HTTP请求所用到的那个TCP connection"(在HTTP 1.1的实现中,同一个TCP Connection可以被多个HTTP通信复用。)

4. 一些分析
HTTP 层把下层的TCP的PDU (也就是TCP segment)重新组装成自己的PDU(也就是HTTP message)。在各个协议层,有不同的PDU,每个协议层要做2件事情:(i)把自己待发送的PDU交给下层去发送 (ii)把下层的收到PDU拿过来组装成自己的PDU。
TCP只负责发送自己的PDU,也就是TCP segment,TCP会把收到的数据放到自己的buffer里,那么何时这些数据会传送给上层的HTTP呢?或者换句话说,HTTP如何知道该用哪些 TCP segment来拼成一个HTTP message呢?这就是PSH flag的作用。观察下图,我们会看到PSH flag总是出现在一个TCP传输最后一部分的HTTP message时。

关于PSH的权威解释,可以看这个帖子:https://ask.wireshark.org/questions/20423/pshack-wireshark-capture
引用如下:
PSH is an indication by the sender that, if the receiving machine's TCP implementation has not yet provided the data it's received to the code that's reading the data (program, or library used by a program), it should do so at that point. To quote RFC 793, the official specification for TCP:
The data that flows on a connection may be thought of as a stream of octets. The sending user indicates in each SEND call whether the data in that call (and any preceeding calls) should be immediately pushed through to the receiving user by the setting of the PUSH flag.
A sending TCP is allowed to collect data from the sending user and to send that data in segments at its own convenience, until the push function is signaled, then it must send all unsent data. When a receiving TCP sees the PUSH flag, it must not wait for more data from the sending TCP before passing the data to the receiving process.
There is no necessary relationship between push functions and segment boundaries. The data in any particular segment may be the result of a single SEND call, in whole or part, or of multiple SEND calls.
The purpose of push function and the PUSH flag is to push data through from the sending user to the receiving user. It does not provide a record service.
我们实验中的web server端的HTTP层就相当于引文中的sending user,实验中的web browser端的HTTP层就相当于引文中的receving process。
PSH flag的作用有2方面:
- 对于发送方,就是把所有尚未发送的数据立刻发送出去
- 对于接收方,就是不要再等未到达的数据,而把当前收到的数据全部交给上层协议。
所以,web server所在机器的TCP协议在发送一个HTTP reponse时,当它意识到这是最后一个TCP segment时,就会加上PSH flag,然后所有buffer中尚未发送的数据都会被发送出去;而web browser所在机器的TCP协议在看到一个TCP segment带有PSH flag时,就会意识到已经收到足够信息了,应当立即把到目前为止已经收到的信息交给上层应用(即HTTP协议)。
简单的说,PSH flag有点像我们写文件时的flush操作。
还有几点,稍微提一下:
- TCP segment (PDU)的数量不一定等于TCP ACK的数量
- 数据的完整性和次序,通过SEQ/ACK number保证,ACK表示了"当前本方从对方已经收到的数据量",SEQ表示"当前本方已经向对方发送的数据量"。所以,如果通信得以顺利完成,A方发给B方的ACK,最终应该等于B方最后一次的SEQ+LENGTH。
用Wireshark简单分析HTTP通信的更多相关文章
- 使用WireShark简单分析ICMP报文
ICMP协议介绍 1.ICMP是"Internet Control Message Protocol"(Internet控制消息协议)的缩写. 它是TCP/IP协议族的一个子协议. ...
- DELPHI中完成端口(IOCP)的简单分析(1)
DELPHI中完成端口(IOCP)的简单分析(1) 用DELPHI开发网络代码已经有一段时间了! 我发现在网上用VC来实现完成端口(IOCP)的代码很多,但是使用DELPHI来实现的就比较少了.对 ...
- Okhttp之RealConnection建立链接简单分析
在之前的博客中我们知道Okhttp在发起链接请求先从链接池中获取连接,如果链接池中没有链接则创建新的链接RealConnection对象,然后执行其connet方法打开SOCKET链接(详见< ...
- 简单分析JavaScript中的面向对象
初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...
- php简单实现socket通信
socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...
- CSipSimple 简单分析
简介 CSipSimple是一款可以在android手机上使用的支持sip的网络电话软件,可以在上面设置使用callda网络电话.连接使用方式最好是使用wifi,或者3g这样上网速度快,打起电话来效果 ...
- C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析与解决方法
对于C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析,目前本人分析两种情况,如下: 情况一: 借鉴麒麟.NET ...
- 透过byte数组简单分析Java序列化、Kryo、ProtoBuf序列化
序列化在高性能网络编程.分布式系统开发中是举足轻重的之前有用过Java序列化.ProtocolBuffer等,在这篇文章这里中简单分析序列化后的byte数组观察各种序列化的差异与性能,这里主要分析Ja ...
- Wireshark分析器分析数据流过程
Wireshark分析器分析数据流过程 分析包是Wireshark最强大的功能之一.分析数据流过程就是将数据转换为可以理解的请求.应答.拒绝和重发等.帧包括了从捕获引擎或监听库到核心引擎的信息.Wir ...
随机推荐
- Mac OS X 安装ruby环境
1.查看版本 $ ruby -v ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14] 2.查看源 $ gem ...
- libevent (一) socket属性设置与初始化操作
socket属性设置与初始化操作 libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,内部使用select.epoll.kqueue等系统调用管理事件机制.著名 ...
- jenkins2 pipeline入门
本文通过简单的pipeline的实例和详细的讲解,能够学习基本pipeline的groovy用法,然后开始实现自己的pipeline job. 翻译和修改自:https://github.com/je ...
- 酷派大神F2系列使用QPST进行nv备份和恢复,解决无信号问题(附备份文件)
测试机器: 大神F2联通版 8675_W00 系统COOLUI55 写贴原因: 自己无意间刷错了包,结果手机无信号,进入工程模式怎么设置都没有用.尝试过系统还原(备份过).刷新的ROM.线刷, ...
- (转)雅虎WEB前端网站优化 -- 34条军规
雅虎给出了优化网站加载速度的34条法则(包括Yslow规则22条) 详细说明,下载转发 ponytail 的译文(来自帕兰映像). 1.Minimize HTTP Requests 减少HTTP请求 ...
- MongoDB学习笔记——索引管理
索引 索引能够提升查询的效率.没有索引,MongoDB必须扫描集合中的所有文档,才能找到匹配查询语句的文档. 索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式.索引能够存储某种特殊字段或字 ...
- mac系统安装php redis扩展
安装步骤如下: 1.下载redis扩展 下载地址:https://nodeload.github.com/nicolasff/phpredis/zip/master 2.下载下来是zip包 手动解压 ...
- PHP 7問世,2億網站效能翻倍有望
經過10年的漫長等待,PHP 7終於正式問世了.這個影響全球8成網站的開發語言,一舉從5.0版,跳過了功敗垂成的6.0版,一舉進入了7.0時代. 20年前初夏,1995年6月8日,一位愛解決問題的C語 ...
- iOS设备类型
通常App都会采集用户的设备信息,比如设备类型.网络类型.内存大小等,而拿到的数据比如:iPhone 8,1是什么意思?代表iOS 8.1吗,非也.这里放二个网站大家可以上去查一查,在统计分析的系统里 ...
- kindle 贴膜
我自己贴膜也贴得很好.顺便和大家分享一下我的贴膜经验.需要的道具,一.抹布,二.一张银行卡,三.一卷小筒的透明胶.贴膜关键点,一.环境和贴面必须干净,二.用力要轻,三.顺序是从上往下.具体步骤:1.先 ...