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 / 版本 CRLFConnection: 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 ProtocolPOST /cgi-bin/luci HTTP/1.1\r\nHost: 192.168.1.1\r\nConnection: keep-alive\r\nContent-Length: 34\r\nCache-Control: max-age=0\r\nOrigin: http://192.168.1.1\r\nUpgrade-Insecure-Requests: 1\r\nContent-Type: application/x-www-form-urlencoded\r\nUser-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\nAccept: 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\nReferer: http://192.168.1.1/cgi-bin/luci\r\nAccept-Encoding: gzip, deflate\r\nAccept-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 bytesHTML Form URL Encoded: application/x-www-form-urlencodedForm 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\nConnection: keep-alive\r\nContent-Length: 34\r\nCache-Control: max-age=0\r\nOrigin: http://192.168.1.1\r\nUpgrade-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版本 状态码 短语 CRLFConnection: 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=以后再试 |
