结合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 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入 ...
随机推荐
- Impala SQL
不多说,直接上干货! 其实,跟hive差不多,大家可以去参考我写的hive学习概念系列. Impala SQL VS HiveQL 下面是Impala对基础数据类型和扩展数据类型的支持 • 此外,Im ...
- ajax模仿iframe
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Vue中Mixins使用
mixins是一种分发Vue组件中可复用功能的一种灵活方式. mixins是一个JavaScript对象,可以包含组件中的任意选项,比如Vue实例中生命周期的各个钩子函数,也可以是data.compo ...
- cocos2d-x cocoStudioUI编辑器导出文件的使用
代码演示样例: UILayer* layer = UILayer::create(); layer ->addWidget(CCUIHELPER->createWidgetFromJson ...
- UVa10397_Connect the Campus(最小生成树)(小白书图论专题)
解题报告 题目传送门 题意: 使得学校网络互通的最小花费,一些楼的线路已经有了. 思路: 存在的线路当然全都利用那样花费肯定最小,把存在的线路当成花费0,求最小生成树 #include <ios ...
- Linux-清除rootpassword
1.Linux进入单用户模式,通常选择内核按e 最后加入single,按b进入单用户. 2.清除/etc/shadow中root这一行第一个:符号和第二个:符号之间内容. 3.正常启动,passwd ...
- Java学习笔记四
1.简介.进程和线程:简单的说就是进程负责为程序开辟内存空间,线程负责具体的执行单元(执行路径). 一个进程中可以有多个执行路径,称为多线程.CPU一次只能执行一个进程,但是一个进程内部可以有多个线程 ...
- invalid syntax 无效语法
python用的是spyder编译器, 再出现上一行少了个括号的时候. 在下一行显示有错误.
- python3输出range序列
b=range(3) #输出的是[0, 1, 2] ,其实这里如果用在循环上,代表着循环多少次,这里是循环3次.从零开始.print(list(b))
- css基础属性
color:设置文本颜色:属性值:1.表示颜色的英文单词,例如:red.blue.green.pink.purple.cyan等:2.十六进制表示法:#ff0000: 0.1.2...9.a.b.c. ...