Skip to content

HTTP协议

简介

https://www.runoob.com/http/http-tutorial.html

HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网( WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件、图片文件、查询结果等)。

HTTPS 协议是 HyperText Transfer Protocol Secure(超文本传输安全协议)的缩写,是一种通过计算机网络进行安全通信的传输协议。

HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包,HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换资料的隐私与完整性。


URL

Web浏览器通过统一资源定位器(Uniform Resource Locators, URL)从Web服务器请求页面。当您点击 HTML 页面中的某个链接时,对应的 <a> 标签指向万维网上的一个地址。

一个统一资源定位器(URL) 用于定位万维网上的文档。

语法规则:

scheme://host.domain:port/path/filename
  • scheme - 定义因特网服务的类型。最常见的类型是 http
  • host - 定义域主机(http 的默认主机是 www)
  • domain - 定义因特网域名,比如 runoob.com
  • :port - 定义主机上的端口号(http 的默认端口号是 80)
  • path - 定义服务器上的路径(如果省略,则文档必须位于网站的根目录中)。
  • filename - 定义文档/资源的名称

以下是一些URL scheme:

Scheme 访问 用于...
http 超文本传输协议 以 http:// 开头的普通网页。不加密。
https 安全超文本传输协议 安全网页,加密所有信息交换。
ftp 文件传输协议 用于将文件下载或上传至网站。
file 您计算机上的文件。

URL 只能使用 ASCII 字符集.

来通过因特网进行发送。由于 URL 常常会包含 ASCII 集合之外的字符,URL 必须转换为有效的 ASCII 格式。

URL 编码使用 "%" 其后跟随两位的十六进制数来替换非 ASCII 字符。

URL 不能包含空格。URL 编码通常使用 + 来替换空格。

URL 编码实例

字符 URL 编码
%80
£ %A3
© %A9
® %AE
À %C0
Á %C1
 %C2
à %C3
Ä %C4
Å %C5

HTTP工作原理

HTTP 协议工作于客户端-服务端架构上。

  • 浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端即 WEB 服务器发送所有请求

  • Web 服务器根据接收到的请求后,向客户端发送响应信息。

Http通讯流程


请求/响应示例

交互过程

  • 访问http://localhost:8080/hello/greeting.html
  • 浏览器分析超链接中的URL
  • 浏览器向DNS请求解析localhost的IP地址
  • DNS将解析出的IP地址127.0.0.1返回浏览器
  • 浏览器与服务器建立TCP连接(8080端口)
  • 浏览器请求文档:GET /hello/greeting.html
  • 服务器给出响应,将文档greeting.html发送给浏览器
  • 释放TCP连接
  • 浏览器显示greeting.html中的内容

交互过程


HTTP特点

  • 无连接

    无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

  • 媒体独立

    这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

  • 无状态

    HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。


HTTPS 作用

HTTPS 的主要作用是在不安全的网络上创建一个安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的防护。

HTTPS 的信任基于预先安装在操作系统中的证书颁发机构(CA)。因此,与一个网站之间的 HTTPS 连线仅在这些情况下可被信任:

  • 浏览器正确地实现了 HTTPS 且操作系统中安装了正确且受信任的证书颁发机构;
  • 证书颁发机构仅信任合法的网站;
  • 被访问的网站提供了一个有效的证书,也就是说它是一个由操作系统信任的证书颁发机构签发的(大部分浏览器会对无效的证书发出警告);
  • 该证书正确地验证了被访问的网站(例如,访问 https://host_name 时收到了签发给 host_name 而不是其它域名的证书);
  • 此协议的加密层(SSL/TLS)能够有效地提供认证和高强度的加密。

Http报文

请求报文

HTTP 会话由 HTTP 客户端(即用户的浏览器)通过用户代理打开,并且连接请求消息被发送到 HTTP 服务器(即Web服务器)。

  • 请求行(Request Line):由请求方法、URL(包含参数)和协议版本组成
  • 请求头(Request Header):由多个key-value组成
  • 空行:请求报文使用空行将请求头部和请求数据分离
  • 请求数据(Request Data):Get()方法没有携带数据,Post()方法会携带一个body

请求报文结构

请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:

请求方法 URL 协议版本CRLF

表示请求方法;

方法 说明
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

是一个统一资源标识符;

表示请求的 HTTP 协议版本;

表示回车和换行(除了作为结尾的 CRLF 外,不允许出现单独的CR 或 LF 字符)

HTTP 消息报头包括:普通报头请求报头响应报头实体报头,每一个报头域都是由名字 + : 空格 + 值组成,消息报头域的名字是大小写无关的。

在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。

字段名 说明
Cache-Control 控制缓存行为
Connection 连接的管理
Date 普通报头域表示消息产生的日期和时间
Pragma HTTP 1.0 中的保留指令控制

请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。常见的请求报头包括:

字段名 说明
Accept 客户端可处理的媒体类型:Accept:image/gif
Accept-Charset 客户端可处理的字符集
Accept-Encoding 客户端的编码方式
Accept-Langulage 客户端指定的语言类型
Authrization web认证信息
Expect 期待服务器的特定行为
Host 请求报头域主要用于指定被请求资源的 Internet 主机和端口号
User-Agent 请求报头域允许客户端将它的操作系统、浏览器和其它属性
Referer 请求中的 url 上一跳地址

响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。常见的响应报头包括:

字段名 说明
Age 资源的创建时间
Location 客户端重定向至指定的URL
Retry-After 再次发送请求的时机
www-Authenticate 服务器对客户端的认证

请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文和请求所标识的资源的元信息。

字段名 说明
Allow 资源所支持的HTTP请求类型
Content-Encoding 数据编码方式
Content-Language 数据的语言类型
Content-Length 实体的内容大小
Content-Location 替代对应资源的URI
Content-Type 实体报头域用语指明发送给接收者的实体正文的媒体类型
Expires 数据过期时间
Last-Modified 资源的最后修改时间
请求示例
GET /hello/greeting.html HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: max-age=0
Connection: keep-alive
Host: localhost:8080
If-Modified-Since: Wed, 22 Feb 2023 17:16:25 GMT
If-None-Match: W/"125-1677086185712"
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
sec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"

响应报文

HTTP响应也由四个部分组成,分别是:状态行消息报头空行响应正文

响应报文结构

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

状态码 含义 例子
1xx 通知信息 100=服务器正在处理客户请求
2xx 成功 200=请求成功(OK)
3xx 重定向 301=页面改变了位置
4xx 客户错误 403=禁止的页面;404=页面未找到
5xx 服务器错误 500=服务器内部错误;503=以后再试
响应示例
HTTP/1.1 200 
Accept-Ranges: bytes
ETag: W/"125-1677086185712"
Last-Modified: Wed, 22 Feb 2023 17:16:25 GMT
Content-Type: text/html
Content-Length: 125
Date: Wed, 22 Feb 2023 17:47:57 GMT
Connection: close

<!DOCTYPE html5>
<html>
  <head>
    <title>Hi, Buddy!</title>
  </head>
  <body>
    Hello Tomcat!
  </body>
</html>

HTTP会话

用于跨页面追踪用户操作状态的一种服务端技术。

  • 首次访问创建Session ID并写进Cookie中
  • 再次访问时携带着Cookie中的Session ID去访问服务器

Cookie

在客户端存储信息的一种技术