HTTP实战之Wireshark抓包分析( 二 )


HTTP实战之Wireshark抓包分析文章插图
? Wireshark 抓包的数据来举例 , 如下图所示:
HTTP实战之Wireshark抓包分析文章插图
在这个请求?? , “GET”是请求?法 , “/”是请求?标 , “HTTP/1.1”是版本号 , 把这三部分连起来 , 客户端意思就是“服务器你好 , 我想获取?站根?录下的默认?件 , 我?的协议版本号是 1.1 , 请不要? 1.0 或者 2.0回复我 。 ”
别看请求?就?? , 貌似很简单 , 其实这??的“讲究”是?常多的 , 尤其是前?的请求?法和请求?标 , 组合起来变化多端 , 后?还会详细介绍 。
1.2 状态?
使用WireShark抓包分析
HTTP实战之Wireshark抓包分析文章插图
看完了请求? , 我们再看响应报??的起始? , 在这?它不叫“响应?” , ?是叫“状态?”(status line) , 意思是服务器响应的状态 。 ?起请求?来说 , 状态?要简单?些 , 同样也是由三部分构成:
(1)版本号:表示报?使?的 HTTP 协议版本 。
(2)状态码:?个三位数 , ?代码的形式表示处理的结果 , ?如 200 是成功 , 500 是服务器错误 。
(3)原因:作为数字状态码补充 , 是更详细的解释?字 , 帮助?理解原因 。 这个原因是可以合理的自定义 。
HTTP实战之Wireshark抓包分析文章插图
1XX 继续
HTTP实战之Wireshark抓包分析文章插图
2XX 成功
HTTP实战之Wireshark抓包分析文章插图
3XX 重定向注意:当301、302、303响应状态码返回时 , 几乎所有的游览器都会把POST改为GET , 并删除请求报文内的主体 , 之后请求会自动再次发送
301、302标准是禁止将POST改为GET方法 , 但实际使用时都会改变
304的请求附加条件是指采用GET方法的请求报文中包含If-Match、If-Modified-Since、IF-None-Match、IF-Range、If-Unmodified-Since中的任一首部
HTTP实战之Wireshark抓包分析文章插图
4xx 客户端错误4XX 的响应结果表明客户端是发生错误的原因所在
HTTP实战之Wireshark抓包分析文章插图
5xx 服务器错误作为前端进行ajax请求时 , 出现5xx错误 , 那最大的可能是服务端出现问题 。
HTTP实战之Wireshark抓包分析文章插图
数据存储如下图所示:
HTTP实战之Wireshark抓包分析文章插图
HTTP实战之Wireshark抓包分析文章插图
使用Wireshark抓包 , 其响应报? , 状态?是:
HTTP/1.1 200 OK\r\n , 关于描述这块是可以自定义 。 可以参考文档 , 进行合理编辑 。
HTTP/1.1表示版本号 。
200 OK表示状态码 。
这里没有描述原因 。
\r\n是换行 。
HTTP/1.1 200 OK\r\n服务端告诉客户端 , 意思就是:“浏览器你好 , 我已经处理完了你的请求 , 这个报?使?的协议版本号是 1.1 , 状态码是 200 , ?切 OK 。 ”
如果是出错了 , 如下:
HTTP/1.1 404 Not Found
服务端告诉客户端 , 意思就是:“抱歉啊浏览器 , 刚才你的请求收到了 , 但我没找到你要的资源 , 错误代码是 404 , 接下来的事情你就看着办吧 。 ”
1.3 头部字段
请求?或状态?再加上头部字段集合就构成了 HTTP 报??真正完整的请求头或响应头 , 可以看下 。
(1)请求头部字段相关 , 如下图所示:
HTTP实战之Wireshark抓包分析文章插图
(2)响应头字段相关 , 如下图所示:
HTTP实战之Wireshark抓包分析文章插图
看到这里 , 你会发现请求头和响应头的结构是基本?样的 , 唯?的区别是起始? 。
请求头和响应头的头部字段都是 key-value 的形式 , key 和 value 之间?“:”分隔 , 最后? CRLF 换?表示字段结束 。 如在“Host: 192.168.111.1”这??? key 就是“Host” , value 就是“192.168.111.1” 。
注意:HTTP 头字段?常灵活 , 不仅可以使?标准?的 Host、Connection 等已有头 , 也可以任意添加?定义头 , 这就给 HTTP 协议带来了?限的扩展可能 。
不过使?头字段需要注意下??点:
(1)字段名不区分??写 , 例如“Host”也可以写成“host” , 但?字??写的可读性更好 。
(2)字段名?不允许出现空格 , 可以使?连字符“-” , 但不能使?下划线“_” 。 例如 , “test-name”是合法的字段名 , ?“test name” , “test_name”是不正确的字段名;