我们都学过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通信的更多相关文章

  1. 使用WireShark简单分析ICMP报文

    ICMP协议介绍 1.ICMP是"Internet Control Message Protocol"(Internet控制消息协议)的缩写. 它是TCP/IP协议族的一个子协议. ...

  2. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  3. php简单实现socket通信

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  4. CSipSimple 简单分析

    简介 CSipSimple是一款可以在android手机上使用的支持sip的网络电话软件,可以在上面设置使用callda网络电话.连接使用方式最好是使用wifi,或者3g这样上网速度快,打起电话来效果 ...

  5. C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析与解决方法

    对于C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析,目前本人分析两种情况,如下: 情况一: 借鉴麒麟.NET ...

  6. 透过byte数组简单分析Java序列化、Kryo、ProtoBuf序列化

    序列化在高性能网络编程.分布式系统开发中是举足轻重的之前有用过Java序列化.ProtocolBuffer等,在这篇文章这里中简单分析序列化后的byte数组观察各种序列化的差异与性能,这里主要分析Ja ...

  7. Wireshark分析器分析数据流过程

    Wireshark分析器分析数据流过程 分析包是Wireshark最强大的功能之一.分析数据流过程就是将数据转换为可以理解的请求.应答.拒绝和重发等.帧包括了从捕获引擎或监听库到核心引擎的信息.Wir ...

  8. 简单分析Java的HashMap.entrySet()的实现

    关于Java的HashMap.entrySet(),文档是这样描述的:这个方法返回一个Set,这个Set是HashMap的视图,对Map的操作会在Set上反映出来,反过来也是.原文是 Returns ...

  9. C#--简单的串口通信程序

    前几天做毕业设计,其中要用到串口和下位机进行通信,于是自己捣鼓了一个简单的串口通信程序. 在做通信之前要先弄一个SerialPort组件出来,当然也可以通过程序来创建.本次设计中采用的是拖的winfo ...

随机推荐

  1. DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”

    DeveloperExceptionPageMiddleware中间件如何呈现"开发者异常页面" 在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式&g ...

  2. theano broadcasting

    当我们使用函数对两个数组进行计算时,函数会对这两个数组的对应元素进行计算,因此它要求这两个数组有相同的大小(shape相同).如果两个数组的shape不同的话,会进行如下的广播(broadcastin ...

  3. css常用属性汇总

    一.常用css属性 (1) *block(区块) 行高 line-height:数值 | inherit | normal; 字间距 letter-spacing: 数值 | inherit | no ...

  4. MVC &ndash; 14.ajax异步请求

    14.1.配置文件 14.2.AjaxHelper – 异步链接按钮 14.3.AjaxHelper – 异步表单 AjaxOptions常见属性: 14.4.AjaxOptions对象生成[对应]触 ...

  5. Swift 玩转 3D Touch 之 Peek &amp; Pop

    什么是3D Touch 3D Touch 是iOS9之后专为 iPhone6s 机型加入的新特性,这一新技术移植于 Mac Book 上的 ForceTouch 更准确地说应该是 ForceTouch ...

  6. CSS name

    页头:header 如:#header{属性:属性值;}或.header{属性:属性值;},也许你需要了解class与id区别及用法登录条:loginBar 标志:logo 侧栏:sideBar广告: ...

  7. ubuntu安装vim

    1.安装 sudo apt-get install vim-gtk 2.安装完成之后,在命令行敲入vi,按“tab”键,可以看到,已经有vim命令的存在,安装成功. 3.配置 sudo vim /et ...

  8. python中使用多继承

    python中使用多继承,会涉及到查找顺序(MRO).重复调用(钻石继承,也叫菱形继承问题)等 MRO MRO即method resolution order,用于判断子类调用的属性来自于哪个父类.在 ...

  9. Jar包下载

    到maven上面下载 http://mvnrepository.com/artifact/redis.clients/jedis/2.9.0 到jarfire去下载 http://cn.jarfire ...

  10. UMDF

    看了一周的UMDF,今天就将这些天的心得记下来. 一开始,老大推荐看<竹林蹊径:深入浅出Windows驱动开发完美补全版.张佩马勇董鉴源.扫描版>.这本书看了前三章,这本书讲的太细,作者又 ...