HTTP 笔记

超文本传输协议(HTTP)是用于传输诸如 HTML 的超媒体文档的应用层协议。它被设计用于 Web 浏览器和 Web 服务器之间的通信,但它也可以用于其它目的。HTTP 遵循经典的客户端-服务端模型,客户端打开一个连接以发出请求,然后等待它收到服务器端响应。 HTTP 是无状态协议,意味着服务器不会在两个请求之间保留任何数据(状态)。虽然通常基于 TCP/IP 层,但可以在任何可靠的传输层上使用,如 UDP。

最小 HTTP

最小 http GET头

代理 http GET头

HTTP 请求

http请求由3个部分组成:请求行请求头请求体

请求行

格式:Method URI HTTP-Version\r\n

常用请求方法

  • GET:获取响应报头+响应正文
  • POST:在GET的基础上附加数据
  • HEAD:获取响应报头
  • CONNECT:打开TCP连接通道,常用于代理

URI,即统一资源标识符
如:/表示根、/index.html表示根下的index.html文件

HTTP-Version
主要有两个版本:HTTP/1.0HTTP/1.1

完整示例:GET / HTTP/1.1\r\n

请求头

格式:Field: Value\r\n(Field不区分大小写)

典型的几个:
Host头域:Host: www.baidu.com\r\n,指定虚拟主机,主机名+端口号(默认80),此头域必须
Accept头域:Accept: text/html\r\n,指定接受的MIME类型,可以使用通配符,如*/*
User-Agent头域:User-Agent: curl/7.4\r\n,客户端标识

请求体

  1. 请求体和请求头之间须用\r\n分隔
  2. 请求体是可选的,POST方法有请求体
  3. 如果有请求体,则需要使用头域指明数据的长度

指明长度的两种方式

  1. Content-Length: 1024\r\n,使用十进制数字指明附加数据的长度,单位为字节
  2. Transfer-Encoding: chunked\r\n,分块传输,格式:十六进制数字[CRLF]数据[CRLF],以0[CRLF][CRLF]结束

两者互斥,Transfer-Encoding优先级高

HTTP 响应

http响应由3个部分组成:响应行响应头响应体

响应行

格式:HTTP-Version Status-Code Reason-Phrase\r\n

HTTP-Version
主要有两个版本:HTTP/1.0HTTP/1.1

Status-Code

  • 1xx:指示信息 – 表示请求已接收,继续处理
  • 2xx:成功状态 – 表示请求已被成功接收、理解、接受
  • 3xx:重定向状态 – 要完成请求必须进行更进一步的操作
  • 4xx:客户端错误 – 请求有语法错误或请求无法实现
  • 5xx:服务端错误 – 服务器未能实现合法的请求

Reason-Phrase
状态原因简述

完整示例:HTTP/1.1 200 OK\r\n

响应头

格式:Field: Value\r\n(Field不区分大小写)

响应体

  1. 响应体和响应头之间须用\r\n分隔,响应体是可选的
  2. 如果存在响应体,且Connection: Keep-Alive,则需要指明数据长度,具体同上