我们都学过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. 关于smarty的一些个人笔记

    注释为{注释} 注意下面代码中<%extends file="路径"%>和<%widget name="路径"%>这两个路径中的区别 c ...

  2. python3 实现简单信用卡管理程序

    1.程序执行代码: #Author by Andy #_*_ coding:utf-8 _*_ import os,sys,time Base_dir=os.path.dirname(os.path. ...

  3. imx6sl 调试记录

    公板芯片型号:MCIMX6L8DVN10AB 我的板子芯片型号:MCIMX6L2EVN10AB no GPU ,no EPDC 调板子时一定要注意,首先要搞清楚硬件芯片的具体差异,然后去nxp的官网找 ...

  4. listview侧滑菜单swipemenulistview的简单使用

    先看代码: public class MainActivity extends AppCompatActivity { private SwipeMenuListView list; private ...

  5. apache虚拟主机配置HTTPS

    win+apache+php的环境下做虚拟主机的https. 1.https用的是443端口,确定防火墙已经开放443了.2.http.conf要加载以下模块: #这两个是用来存放SSLSession ...

  6. SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)

    前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划. ...

  7. jquery总结

    id选择器只能选定第一个满足条件的元素 class选择器可以选定一类满足条件的元素 text(),html(),val(),attr()等操作类型的函数,作用对象是前面选择器选定的元素.选定的元素可能 ...

  8. ViewPager的广告条轮播

    首先布局 <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:androi ...

  9. POJ3264 Balanced Lineup

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 44720   Accepted: 20995 ...

  10. pylint window下安装与使用

    简介 Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8)和有潜在问题的代码. Pylint ...