HTTP协议分析

超文本传输协议

  • 什么是URL

URL即统一资源定位符,用来唯一地标识万维网中的某一个文档(即是 文件路径)

URL由协议、主机和端口(默认为80)以及文件名三部分构成

  1. http:// www.baidu.com:80/ html/index.html
  2. 协议:// 主机:端口(80)/ 文件名及其路径
  • 工作原理

在用户点击URL的链接为www.baidu.com,浏览器和Web服务器执行以下动作:

  1. 浏览器分析超链接中的URL
  2. 浏览器向DNS请求解析 www.baidu.com 的IP地址
  3. DNS将解析出的IP地址202.2.16.21返回浏览器
  4. 浏览器与服务器建立TCP连接(80端口)
  5. 浏览器请求文档:GET /index.html
  6. 服务器给出响应,将文档 index.html发送给浏览器
  7. 释放TCP连接
  8. 浏览器显示index.html中的内容

HTTP报文结构

请求报文

即从Web服务器到客户机(浏览器)的应答。报文的所有字段都是ASCII码

  1. POST /cgi-bin/luci HTTP/1.1\r\n
  2. 方法 / URL / 版本 CRLF
  3. Connection: keep-alive\r\n
  4. 首部字段名: CRLF
  5. \r\n // 请求头结束
  6. CRLF
  7. 实体主体
  8. (Entity body)

1. 请求报文中的方法

方法(Method)是对所请求对象所进行的操作,也就是一些命令。请求报文中的操作有:

方法(操作) 含义 方法(操作) 含义
GET 请求读取一个Web页面 HEAD 请求读取一个Web页面的首部
POST 附加一个命名资源(如Web页面) PUT 请求存储一个Web页面
DELETE 删除Web页面 TRACE 用于测试,要求服务器送回收到的请求
CONNECT 用于代理服务器 OPTION 查询特定选项

GTE 和 POST 即是 传递参数的方式不同

GRT 发送数据 是存放的 URL 的请求之后 而非 在数据段传输

  1. Hypertext Transfer Protocol
  2. POST /cgi-bin/luci HTTP/1.1\r\n
  3. Host: 192.168.1.1\r\n
  4. Connection: keep-alive\r\n
  5. Content-Length: 34\r\n
  6. Cache-Control: max-age=0\r\n
  7. Origin: http://192.168.1.1\r\n
  8. Upgrade-Insecure-Requests: 1\r\n
  9. Content-Type: application/x-www-form-urlencoded\r\n
  10. 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
  11. 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
  12. Referer: http://192.168.1.1/cgi-bin/luci\r\n
  13. Accept-Encoding: gzip, deflate\r\n
  14. Accept-Language: zh-CN,zh;q=0.9\r\n
  15. \r\n
  16. [Full request URI: http://192.168.1.1/cgi-bin/luci]
  17. [HTTP request 1/1]
  18. [Response in frame: 127]
  19. File Data: 34 bytes
  20. HTML Form URL Encoded: application/x-www-form-urlencoded
  21. Form item: "username" = "useradmin"
  22. Form item: "psd" = "aaaaaaaaaaa"

2. URL

/cgi-bin/luci.html 即是 访问文件的路径

3. 版本

HTTP 1.0

HTTP 1.1

4. CRLF

在请求最后 加上 \r \n 表示结束一行

  1. GET /index.html HTTP/1.1

首部字段名

首部行:用来说明浏览器、服务器或报文主体的一些信息

首部字段的 行数是不固定的 可以是 一行 也可以是 10行以上 需要什么信息就获取什么信息

如:

  1. Host: 192.168.1.1\r\n
  2. Connection: keep-alive\r\n
  3. Content-Length: 34\r\n
  4. Cache-Control: max-age=0\r\n
  5. Origin: http://192.168.1.1\r\n
  6. 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

响应报文

  1. HTTP/1.1 200 OK \r\n
  2. 版本 状态码 短语 CRLF
  3. Connection: keep-alive\r\n
  4. 首部字段名: CRLF
  5. \r\n // 响应报文头末尾
  6. CRLF
  7. 实体主体
  8. (Entity body)

响应报文中的状态码

状态码(Status-Code)是响应报文状态行中包含的一个3位数字,指明特定的请求是否被满足,如果没有满足,原因是什么

状态码 含义 例子
1xx 通知信息 100=服务器正在处理客户请求
2xx 成功 200=请求成功(OK)
3xx 重定向 301=页面改变了位置
4xx 客户错误 403=禁止的页面;404=页面未找到
5xx 服务器错误 500=服务器内部错误;503=以后再试