结合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 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入 ...
随机推荐
- ArraySegment 的使用 【转载】
本文转载自 http://www.cnblogs.com/overred/archive/2009/01/17/1359126.html ArraySegment顾名思义就是Array区块,数组的小抽 ...
- vmstat---有关进程、虚存、页面交换空间及 CPU信息
虚拟内存运行原理 在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间.当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存 ...
- C# XML类学习整理(待补)
一.读取xml文件内容: #region "获取xml文件内容" //将xml文件加载进来 XDocument xdoc = XDocument.Load("F:\\6. ...
- 使用Cygwin在Windows上体验Linux的快感
前言 记得大学的时候就以前使用过Cygwin,可惜当时没有发现她的美,我相信如今大多数朋友可能会更加倾向于使用Git或者干脆直接使用虚拟机以及原生Unix. 只是对于刚进入Linux的世界新人来说,使 ...
- hdu 1233 还是畅通project (克鲁斯卡尔裸题)
还是畅通project Time Limit: 4000/2000 MS (Java/Others) M ...
- 史上最简单,js并获取手机型号
原先获取不了苹果系列的型号,但转换思路,先推断是否是苹果,再用分辨率获取型号 //获取手机型号函数begin function getPhoneType(){ //正则,忽略大写和小写 var pa ...
- javascript类型系统之基本数据类型与包装类型
javascript的数据类型可以分为两种:原始类型和引用类型 原始类型也称为基本类型或简单类型,因为其占据空间固定,是简单的数据段,为了便于提升变量查询速度,将其存储在栈(stack)中(按值访问) ...
- 如何在实际项目中使用Promise(入门级)
你们有没有遇到过这样的情况,ES6看过了,Promise的文字概念都懂,但是我要怎么在项目中去写一个Promise呢? 那天我就是带着这样的疑问去网上搜了下.最后成功地在项目中应用了Promise,只 ...
- 【Java学习】Font字体类的用法介绍
一.Font类简介 Font类是用于设置图形用户界面上的字体样式的,包括字体类型(例如宋体.仿宋.Times New Roman等).字体风格(例如斜体字.加粗等).以及字号大小. 二.Font类的引 ...
- graphicview和widgets没本质区别。它只是更轻量级,更灵活,性能更高的widgets
graphicview和widgets没本质区别.它只是更轻量级,更灵活,性能更高的widgets.核心就是把widgets变成了更轻量级的graphicitem,把QWidget的各种事件转换成了g ...