HTTP协议分析
超文本传输协议
- 什么是URL
URL即统一资源定位符,用来唯一地标识万维网中的某一个文档(即是 文件路径)
URL由协议、主机和端口(默认为80)以及文件名三部分构成
http:// www.baidu.com:80/ html/index.html
协议:// 主机:端口(80)/ 文件名及其路径
- 工作原理
在用户点击URL的链接为www.baidu.com,浏览器和Web服务器执行以下动作:
- 浏览器分析超链接中的URL
- 浏览器向DNS请求解析 www.baidu.com 的IP地址
- DNS将解析出的IP地址202.2.16.21返回浏览器
- 浏览器与服务器建立TCP连接(80端口)
- 浏览器请求文档:GET /index.html
- 服务器给出响应,将文档 index.html发送给浏览器
- 释放TCP连接
- 浏览器显示index.html中的内容
HTTP报文结构
请求报文
即从Web服务器到客户机(浏览器)的应答。报文的所有字段都是ASCII码
POST /cgi-bin/luci HTTP/1.1\r\n
方法 / URL / 版本 CRLF
Connection: keep-alive\r\n
首部字段名: 值 CRLF
\r\n // 请求头结束
CRLF
实体主体
(Entity body)
1. 请求报文中的方法
方法(Method)是对所请求对象所进行的操作,也就是一些命令。请求报文中的操作有:
方法(操作) | 含义 | 方法(操作) | 含义 |
---|---|---|---|
GET | 请求读取一个Web页面 | HEAD | 请求读取一个Web页面的首部 |
POST | 附加一个命名资源(如Web页面) | PUT | 请求存储一个Web页面 |
DELETE | 删除Web页面 | TRACE | 用于测试,要求服务器送回收到的请求 |
CONNECT | 用于代理服务器 | OPTION | 查询特定选项 |
GTE 和 POST 即是 传递参数的方式不同
GRT 发送数据 是存放的 URL 的请求之后 而非 在数据段传输
Hypertext Transfer Protocol
POST /cgi-bin/luci HTTP/1.1\r\n
Host: 192.168.1.1\r\n
Connection: keep-alive\r\n
Content-Length: 34\r\n
Cache-Control: max-age=0\r\n
Origin: http://192.168.1.1\r\n
Upgrade-Insecure-Requests: 1\r\n
Content-Type: application/x-www-form-urlencoded\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
Referer: http://192.168.1.1/cgi-bin/luci\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
\r\n
[Full request URI: http://192.168.1.1/cgi-bin/luci]
[HTTP request 1/1]
[Response in frame: 127]
File Data: 34 bytes
HTML Form URL Encoded: application/x-www-form-urlencoded
Form item: "username" = "useradmin"
Form item: "psd" = "aaaaaaaaaaa"
2. URL
/cgi-bin/luci.html 即是 访问文件的路径
3. 版本
HTTP 1.0
HTTP 1.1
4. CRLF
在请求最后 加上 \r \n 表示结束一行
GET /index.html HTTP/1.1
首部字段名
首部行:用来说明浏览器、服务器或报文主体的一些信息
首部字段的 行数是不固定的 可以是 一行 也可以是 10行以上 需要什么信息就获取什么信息
如:
Host: 192.168.1.1\r\n
Connection: keep-alive\r\n
Content-Length: 34\r\n
Cache-Control: max-age=0\r\n
Origin: http://192.168.1.1\r\n
Upgrade-Insecure-Requests: 1\r\n
常用的有:
头(header) | 类型 | 说明 |
---|---|---|
User- Agent | 请求 | 关于浏览器和它平台的信息,如Mozilla5.0 |
Accept | 请求 | 客户能处理的页面的类型,如text/html |
Accept-Charset | 请求 | 客户可以接受的字符集,如Unicode-1-1 |
Accept-Encoding | 请求 | 客户能处理的页面编码方法,如gzip |
Accept-Language | 请求 | 客户能处理的自然语言,如en(英语),zh-cn(简体中文) |
Host | 请求 | 服务器的DNS名称。从URL中提取出来,必需。 |
Authorization | 请求 | 客户的信息凭据列表 |
Cookie | 请求 | 将以前设置的Cookie送回服务器器,可用来作为会话信息 |
Date | 双向 | 消息被发送时的日期和时间 |
Server | 响应 | 关于服务器的信息,如Microsoft-IIS/6.0 |
Content-Encoding | 响应 | 内容是如何被编码的(如gzip) |
Content-Language | 响应 | 页面所使用的自然语言 |
Content-Length | 响应 | 以字节计算的页面长度 请求数据段的长度 |
Content-Type | 响应 | 页面的MIME类型 |
Last-Modified | 响应 | 页面最后被修改的时间和日期,在页面缓存机制中意义重大 |
Location | 响应 | 指示客户将请求发送给别处,即重定向到另一个URL |
Set-Cookie | 响应 | 服务器希望客户保存一个Cookie |
Connection | 请求 | 连接方式:keep-alive长连接 close 短连接 |
Cache-Control | 请求 | 缓存控制 [链接] |
User-Agent | 请求 | 当前访问者的 用户机器信息 浏览器名称 浏览器版本号 渲染引擎 操作系统 |
Accept-Encoding | 请求 | 接收类型编码 |
标记 GET头的接收
在 语句末尾多加上一个 \r \n
响应报文
HTTP/1.1 200 OK \r\n
版本 状态码 短语 CRLF
Connection: keep-alive\r\n
首部字段名: 值 CRLF
\r\n // 响应报文头末尾
CRLF
实体主体
(Entity body)
响应报文中的状态码
状态码(Status-Code)是响应报文状态行中包含的一个3位数字,指明特定的请求是否被满足,如果没有满足,原因是什么
状态码 | 含义 | 例子 |
---|---|---|
1xx | 通知信息 | 100=服务器正在处理客户请求 |
2xx | 成功 | 200=请求成功(OK) |
3xx | 重定向 | 301=页面改变了位置 |
4xx | 客户错误 | 403=禁止的页面;404=页面未找到 |
5xx | 服务器错误 | 500=服务器内部错误;503=以后再试 |