crazyandcoder

计算机网络(http)

2021.07.14

HTTP协议.png

1 简介

英文名为 HyperText Transfer Protocol,缩写:HTTP。中文名叫超文本传输协议。HTTP 协议,即超文本传输协议 (Hypertext transfer protocol)。是一种详细规定了浏览器和万维网 (WWW = World Wide Web) 服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

1989 年,CERN(欧洲核子研究组织)的 Tim BernerLee 提出了一种能让远隔两地的研究者们共享知识的设想。最初设想的基本理念是:借助多文档之间相互关联形成的超文本(HyperText),连成可相互参阅的 WWW(World Wide Web,万维网)。此时,HTTP 问世,但那个时候它还只是个雏形,并没有确定正式的标准,所以这个时期的 HTTP 称为 HTTP/0.9。

1996 年 5 月,HTTP/1.0 正式作为标准被公布出来,记载于 RFC1945,至今仍然还有很多页面使用本协议。

1997 年 1 月,也就是 1.0 出来后半年,更新到 HTTP/1.1,当初的标准是 RFC2068,之后到 1999 年 6 月发布了修订版 RFC2616,直到现在仍然是目前使用的主流版本。

2015 年 5 月,HTTP/2 标准发布,以 RFC7540 正式发表,正式取代 HTTP1.1,但目前还并没有全覆盖。

2 协议基础

2.1 计算机网络体系结构分层

计算机网络体系分层.png

2.2 TCP/IP 数据传输流程

tcp_ip_layer.jpg

  1. 客户端在应用层 (HTTP 协议) 发出一个 HTTP 请求。
  2. 为了方便传输,在传输层 (TCP 协议) 把从应用层处收到的数据 (HTTP 请求报文) 进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
  3. 在网络层 (IP 协议),增加作为通信目的地的 MAC 地址后转发给数据链路层。这样,发送给服务端的请求就准备齐全了。
  4. 当服务端在链路层接收到数据时,按序往上层发送,一直到应用层。当传输到应用层时,才算真正的接收到由客户端发送过来的请求。

3 工作过程

HTTP 通信机制是在一次完整的 HTTP 通信过程中,客户端与服务器之间将完成下列 7 个步骤:

3.1 建立 TCP 连接

在HTTP工作开始之前,客户端首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是80;

3.2 客户端向服务器发送请求命令

一旦建立了 TCP 连接,客户端就会向服务器发送请求命令;

例如:GET/sample/hello.jsp HTTP/1.1

3.3 客户端发送请求头信息

客户端发送其请求命令之后,还要以头信息的形式向服务器发送一些别的信息,之后客户端发送了一空白行来通知服务器,它已经结束了该头信息的发送;

3.4 服务器应答

客户端向服务器发出请求后,服务器会客户端返回响应,响应的第一部分是协议的版本号和响应状态码

例如: HTTP/1.1 200 OK

3.5 服务器返回响应头信息

正如客户端会随同请求发送关于自身的信息一样,服务器也会随同响应向用户发送关于它自己的数据及被请求的文档;

3.6 服务器向客户端发送数据

服务器向客户端发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 响应头信息所描述的格式发送用户所请求的实际数据;

3.7 服务器关闭 TCP 连接

一般情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接,然后如果客户端或者服务器在其头信息加入了这行代码 Connection:keep-alive ,TCP 连接在发送后将仍然保持打开状态,于是,客户端可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

4 HTTP 请求

一个完整的 HTTP 请求包括如下内容:一个请求行、若干消息头、以及实体内容。

4.1 请求行

请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST。

GET和POST的区别

  1. GET 提交的数据会在地址栏中显示出来,而 POST 提交,地址栏不会改变
  2. 传输数据的大小,GET:特定浏览器和服务器对URL长度有限制,例如 IE 对 URL 长度的限制是 2083 字节 (2K+35)。对于其他浏览器,如 Netscape、FireFox 等,理论上没有长度限制,其限制取决于操作系 统的支持。因此对于 GET 提交时,传输数据就会受到 URL 长度的 限制。POST: 由于不是通过 URL 传值,理论上数据不受 限。但实际各个 WEB 服务器会规定对 post 提交数据大小进行限制,Apache、IIS6 都有各自的配置。
  3. 安全性,POST 的安全性要比 GET 的安全性高。比如:通过 GET 提交数据,用户名和密码将明文出现在 URL 上,因为 (1) 登录页面有可能被浏览器缓存;(2) 其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用 GET 提交数据还可能会造成 Cross-site request forgery 攻击

4.2 消息头

accept:浏览器通过这个头告诉服务器,它所支持的数据类型
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
Host:浏览器通过这个头告诉服务器,想访问哪台主机
If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的  防盗链
Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接

5 HTTP 响应

5.1 状态行

状态行格式: HTTP 版本号 状态码 原因叙述

5.2 响应头

HTTP 响应中的常用响应头(消息头)

Location: 服务器通过这个头,来告诉浏览器跳到哪里
Server:服务器通过这个头,告诉浏览器服务器的型号
Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
Content-Language: 服务器通过这个头,告诉浏览器语言环境
Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
Refresh:服务器通过这个头,告诉浏览器定时刷新
Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据
Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
Expires: -1  控制浏览器不要缓存
Cache-Control: no-cache  
Pragma: no-cache