结合Wireshark捕获分组深入理解TCP/IP协议栈之HTTP协议
摘要:
本文简单介绍了Web应用层协议理论知识,详细讲述了HTTP请求报文和响应报文各个字段含义,并从Wireshark俘获分组中选取HTTP相关报文进行分析。
一、概述
Web的应用层协议是超文本传输协议HTTP,HTTP协议由两部分程序实现:客户机程序、服务器程序,协议定义了这些报文的格式以及客户机和服务器如何进行报文交换的。Web服务器用于存储Web对象,每个对象由URL寻址,Web客户机通常指浏览器。浏览器向服务器发出对Web页中所包含对象的HTTP请求报文,服务器接受请求并用包含这些对象的HTTP响应报文进行响应。Web页是由对象组成,对象简单来说就是文件(如图形文件、Java小程序、声音剪辑文件),这些文件通过一个URL地址寻址。Web页通常含有一个基本的HTML文件和几个引用对象。
HTTP报文有两种:请求报文、响应报文。
二、HTTP请求报文
2.1 请求报文
整个报文段内容是普通ASCII文本,各个字段靠空格或者回车换行符隔开,如下图:

图1 HTTP请求报文格式
方法
表1 HTTP请求报文方法[1]
|
方法 |
说明 |
|
GET |
请求获取URL所标识的资源 |
|
POST |
在URL所标识的资源后附加新的数据 |
|
HEAD |
请求获取由URL所标识的资源的响应消息报头,常用于故障跟踪 |
|
PUT |
请求服务器存储一个资源,并用URL作为其标识 |
|
DELETE |
请求服务器删除URL所标识的资源 |
|
TRACE |
请求服务器回送收到的请求信息,主要用于测试或诊断 |
|
CONNECT |
保留将来使用 |
|
OPTIONS |
请求查询服务器的性能,或者查询与资源相关的选项和需求 |
使用GET方法时实体主体为空。客户机有时候需要提交表单(如搜索关键词),有两种方法可以做到这一点:其一,使用POST方法,实体主体包含表单字段的值;其二,用GET方法,此时表单的字段与原URL形成新的URL。
注:HTTP/1.0规约仅有三种方法:GET、POST、HEAD。
URL
对象由统一资料定位器URL标识,URL由3部分组成(如http://www.baidu.com/index.html):协议(http)、存放对象服务器主机名(www.baidu.com)、对象的路径名(/index.html)。
版本
目前有HTTP/1.0、HTTP/1.1,后者兼容前者。HTTP/1.0仅支持非持续连接,即每个TCP连接在服务器返回对象后关闭,HTTP/1.1支持持续连接,即服务器在发送响应后保持该TCP连接。早期,Web页面通常只包含HTML文件,用非持续连接就够了。如今,一个Web页面包含许多对象,用非持续连接开销太大了(TCP建立的三次握手),因此持续连接更合适。
首部行
给服务器发送首部行旨在服务器为不同类型的客户机发送相同对象的不同版本,常用的首部行见表2。
表2 HTTP请求报文常用首部行
|
字段名 |
值 |
|
User-Agent |
关于浏览器和它的平台信息 |
|
Accept |
客户机能处理的页面类型 |
|
Accept-Charset |
客户机可以接受的字符集 |
|
Aceept-Encoding |
客户机能处理的页面编码方法 |
|
Accept-Language |
客户机能处理的自然语言 |
|
Host |
服务器的DNS名字 |
|
Authorization |
证明客户端有权查看某个资源 |
|
Cookie |
将一个以前设置的cookie送回给服务器 |
实体数据
实体数据是报文的主体,即所请求的对象本身。
2.2 实例分析

图2 HTTP请求报文实例
三、HTTP响应报文
3.1 报文格式

图3 HTTP响应报文格式
版本
服务器使用的协议版本。
状态编码、短语
状态编码码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值[1]:
表3 HTTP响应报文响应类别及值
|
类别 |
值 |
|
1xx |
指示信息--表示请求已接收,继续处理 |
|
2xx |
成功--表示请求已被成功接收、理解、接受 |
|
3xx |
重定向--要完成请求必须进行更进一步的操作 |
|
4xx |
客户端错误--请求有语法错误或请求无法实现 |
|
5xx |
服务器端错误--服务器未能实现合法的请求 |
常见状态代码、状态描述、说明:
表4 HTTP响应报文常用代码
|
编码 |
短语 |
说明 |
|
200 |
OK |
客户端请求成功 |
|
400 |
Bad Request |
客户端请求有语法错误,不能被服务器所理解 |
|
401 |
Unauthorized |
请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 |
|
403 |
Forbidden |
服务器收到请求,但是拒绝提供服务 |
|
404 |
Not Found |
请求资源不存在 |
|
500 |
Internal Server Error |
服务器发生不可预期的错误 |
|
503 |
Server Unavailable |
服务器当前不能处理客户端的请求,一段时间后,可能恢复正常 |
首部行
常用的HTTP响应报文首部行见下表:
表5 响应报文常用首部行字段
|
字段名 |
值 |
|
Date |
消息被发送时的日期和时间 |
|
Server |
关于服务器信息 |
|
Content-Encoding |
内容是如何被编码的(如gzip) |
|
Content-Length |
以字节计算的页面长度 |
|
Content-Type |
页面的MIME类型 |
|
Last-Modified |
页面最后被修改的时间和日期 |
|
Location |
指标客户将请求发送到别处的命令 |
|
Accept-Ranges |
服务器将接受指定请求的字节范围 |
|
Set-Cookie |
服务器希望客户保存一份cookie |
实体数据
实体数据是报文的主体,即所请求的对象本身。
3.2 报文实例

图2 HTTP响应报文实例
至此,服务器返回用户所请求的文件:-)
参考资料:
[1] 博文《HTTP协议详解》
[2] Andrew S.Tanenbaum.计算机网络[M].
[3] 《计算机网络--自顶向下方法与Internet特色》[M].
from:http://blog.chinaunix.net/uid-9112803-id-3212057.html
结合Wireshark捕获分组深入理解TCP/IP协议栈之HTTP协议的更多相关文章
- 结合Wireshark捕获分组深入理解TCP/IP协议栈之DNS协议
摘要: 本文简单介绍了DNS协议理论知识,给出URL解析步骤,详细讲述了DNS报文各个字段含义,并从Wireshark俘获分组中选取DNS相关报文进行分析. 一.概述 1.1 DNS ...
- 结合Wireshark捕获分组深入理解TCP/IP协议栈
摘要: 本文剖析了浏览器输入URL到整个页面显示的整个过程,以百度首页为例,结合Wireshark俘获分组进行详细分析整个过程,从而更好地了解TCP/IP协议栈. 一.俘获分组 1.1 准 ...
- 结合Wireshark捕获分组深入理解TCP/IP协议栈之TCP协议(TCP报文格式+三次握手实例)
摘要: 本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析. 一.概述 TCP是面向连接的可靠 ...
- 结合Wireshark捕获分组深入理解TCP/IP协议之以太网帧
摘要: 本文摘抄并整理了以太网相关理论知识,包括CSMA/CD协议机制及工作.LAN互连,详细分析了Ethernet II帧格式,最后给出Ethernet II帧实例. 一.以太网[1] 1. ...
- 结合Wireshark捕获分组深入理解TCP/IP协议之IP协议
摘要: 本文简单介绍了网络层理论知识,详细讲解了IP数据报各个字段,并从Wireshark俘获分组中选取IP数据报进行分析,也阐述了分组和分片的区别. 一.IPv4数据报 网络层是 ...
- 理解TCP/IP协议栈之HTTP2.0
1 前言 前面写了10多篇关于Redis底层实现.工程架构.实际应用的文章,感兴趣的读者可以进行阅读,如有问题欢迎交流: 1.Redis面试热点之底层实现篇-12.Redis面试热点之底层实现篇-23 ...
- 面试热点|理解TCP/IP传输层拥塞控制算法
0x00.前言 通过本文你将了解到以下内容: 拥塞控制概念以及其背景 流量控制和拥塞控制的区别与联系 拥塞控制主要过程详解 伙伴们认真学习一下,让offer来得更猛烈些吧! 0x01.TCP/IP协议 ...
- 【PHPsocket编程专题(理论篇)】初步理解TCP/IP、Http、Socket.md
前言 我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API).那TCP/IP又是什么呢?TCP/IP是ISO/OS ...
- 深入浅出理解 TCP/IP 协议 (一)
文章转自:https://www.cnblogs.com/onepixel/p/7092302.html TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入 ...
随机推荐
- 英语 用on还是/at/还是in
in prep. 1. [表示地点.场所.位置等]在…里面:在…内部:在…上:例句: in the room 在房间里 2. [表示时间]在…期间:在(一段时间)以内:过…之久:例句: in su ...
- vue 使用同一组件,切换时不触发created、mounted钩子
两个页面参数不同使用同一组件,默认情况下当这两个页面切换时并不会触发created或者mounted钩子. 方法一:通过watch $route的变化来做处理 watch: { $route() { ...
- angularjs之ui-bootstrap的Datepicker Popup不使用JS实现双日期选择控件
最开始使用ui-bootstrap的Datepicker Popup日期选择插件实现双日期选择时间范围时,在网上搜了一些通过JS去实现的方法,不过后来发现可以不必通过JS去处理,只需要使用其自身的属性 ...
- 【Codeforces Round #426 (Div. 2) A】The Useless Toy
[Link]:http://codeforces.com/contest/834/problem/A [Description] [Solution] 开个大小为4的常量字符数组; +n然后余4,-n ...
- Android Studio 函数使用方法提示 快捷键
看到好多说用F2的,转来转去,中国社区的氛围大概如此,你抄我的,我超你的. 下面的千篇一律: "悬浮窗不出来了,各种不习惯啊.那在Android Studio究竟怎样查看函数的说明呢.选中你 ...
- thinkphp内置标签简单讲解
thinkphp内置标签简单讲解 1.volist循环 name 需要遍历的数据 id 类似于foreach中 value offset 截取数据起始位置 length 截取数据的个数 mod 奇偶数 ...
- UVA 11488 Hyper Prefix Sets (字典树)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- error: function declaration isn’t a prototype [-Werror=strict-prototypes]
"warning: function declaration isn't a prototype" was caused by the function like that: ...
- HDU 1007 Quoit Design 平面内最近点对
http://acm.hdu.edu.cn/showproblem.php?pid=1007 上半年在人人上看到过这个题,当时就知道用分治但是没有仔细想... 今年多校又出了这个...于是学习了一下平 ...
- Android中Alarm的机制
本次给大家分析的是Android中Alarm的机制所用源码为最新的Android4.4.4.首先简单介绍如何使用Alarm并给出其工作原理,接着分析Alarm和Timer以及Handler在完成定时任 ...