走进HTTP协议 | 青训营

93 阅读11分钟

HTTP简介

  1. HTTP协议是用于从服务器传输超文本到本地浏览器的传送协议。

  2. HTTP基于TCP/IP通信协议进行传送输数据(HTML文件、图片文件、查询结果等)。

  3. HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。

  4. HTTP协议工作于客户端-服务器架构之上。浏览器作为HTTP客户端通过URL向HTTP服务器端即WEB服务器发送请求。WEB服务器根据接收到的请求,向客户端发送响应消息。

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。

尽管TCP/IP协议是互联网上最流行的应用,HTTP协议中,并没有规定必须使用它或它支持的层。事实上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为其传输层。

通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。

HTTP工作原理

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

以下是 HTTP 请求/响应的步骤:

  1. 客户端连接到Web服务器 一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。

  2. 发送HTTP请求 通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

  3. 服务器接受请求并返回HTTP响应 Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

  4. 释放连接TCP连接 若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

  5. 客户端浏览器解析HTML内容 客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;

  3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

  4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

  5. 释放 TCP连接;

  6. 浏览器将该 html 文本并显示内容;

HTTP之URL

HTTP使用**URI(统一资源标识符)**来传输数据和建立连接。

URL是一种特殊类型的URI,包含了用于查找某个资源的足够信息。以一个URL为例:

www.aspxfans.com:8080/news/index.…

URL主要包括以下几部分:

  1. 协议部分:“http:”,在HTTP后面的“//”为分隔符

  2. 域名部分:“www.aspxfans.com”

  3. 端口部分:跟在域名后面的是端口,8080,域名和端口之间使用“:”作为分隔符。

  4. 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止。“/news/”

  5. 文件名部分:从域名后的最后一个“/”开始到“?”为止。“index.asp”

  6. 锚部分:从“#”开始到最后。"name"

  7. 参数部分:从“?”开始到“#”为止之间的部分为参数部分

HTTP请求与相应

HTTP遵循请求(Request)/应答(Response)模型,Web浏览器向Web服务器发送请求时,Web服务器处理请求并返回适当的应答。

HTTP请求

POST /test.php HTTP/1.1         //请求行
HOST: www.test.com              //请求头
User-Agent: Mozilla/5.0 (windows NT 6.1: rv: 15.0)Gecko/20100101 Firefox/15.0  //空白行,代表请求头结束
Username=admin&password-admin   //请求正文
1234

HTTP请求包括三部分,分别是请求行(请求方法)、请求头(消息报头)和请求正文。

HTTP请求第一行为请求行,由三部分组成,第一部分说明了该请求时POST请求,第二部分是一个斜杠(/login.php),用来说明请求是该域名根目录下的login.php,第三部分说明使用的是HTTP1.1版本。

HTTP请求第二行至空白行为请求头(也被称为消息头)。其中,HOST代表请求主机地址,User-Agent代表浏览器的标识,请求头由客户端自行设定。

HTTP请求第三行为请求正文,请求正文是可选的,它最常出现在POST请求方式中。

HTTP请求方法

根据 HTTP 标准,HTTP 请求可以使用多种请求方法。

HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1 新增了五种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

方法描述
GET请求指定的页面信息,并返回实体主体。
HEAD类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头。
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT从客户端向服务器传送的数据取代指定的文档的内容。
DELETE请求组服务器删除指定的页面。
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS允许客户端查看服务器性能。
TRACE回显服务器收到的请求,主要用于测试或诊断。
PATCH是对PUT方法的补充,用来对已知资源进行局部更新。

GET、POST、HEAD、PUT请求

  • GET:GET方法用于获取请求页面的指定信息。如果请求资源为动态脚本(非HTML),那么返回文本是Web容器解析后的HTML源代码。GET请求没有消息主体,因此在消息头后的空白行是没有其他数据。
  • POST:POST方法也与GET方法相似,但最大的区别在于,GET方法没有请求内容,而POST是有请求内容的。
  • HEAD:这个请求的功能与GET请求相似,不同之处在于服务器不会再其响应中返回消息主体,因此,这种方法可用于检查某一资源在向其提交GET请求前是否存在。
  • PUT:PUT方法用于请求服务器把请求中的实体存储在请求资源下,如果请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据。向服务器上传指定的资源。

HTTP响应

HTTP/1.1 200 OK                        //响应行
Date: Mon, 14 Aug 2023 11:02:04 GMT    //响应头
Server: bfe/1.0.8.9
Content-Length: 2605
Content-Type: application/javascript
Cache-control: max-age=315360000
Exoires: Fri, 13 Jun 2025 09:54:00 GMT
Content-Encoding: gzip
Set-Cookie: H_PS_PSSID=2022_1438_1944_1788; path=/; domain=test.com
Connection: keep-alive
                                //空白行,代表响应头结束
<html>
<head><title> Index.html </title></head>    //响应正文消息主题
123456789101

HTTP响应的第一行为响应行,其中有HTTP版本(HTTP/1.1)、状态码(200)以及消息“OK”。

第二行至末尾的空白行为响应头,由服务器向客户端发送。

消息头之后是响应正文,是服务器向客户端发送的HTML数据。

HTTP消息头:

请求头:请求头只出现在HTTP请求中,请求报头允许客户端向服务端传递请求的附加信息和客户端自身信息。

响应头:响应头是服务器根据请求向客户端发送的HTTP头。

HTTP请求头:

  • Host 请求报头域主要用于指定被请求资源的Internet主机和端口。
  • User-Agent 请求报头域允许客户端将它的操作系统、浏览器和其他属性告诉服务器。
  • Referer 包含一个URL,代表当前访问URL的上一个URL,也就是说,用户是从什么地方来到本页面。当前请求的原始URL地址。
  • Cookie 是非常重要的请求头,常用来表示请求者的身份等。
  • Accept 这个消息头用于告诉服务器客户端愿意接受那些内容,比如图像类,办公文档格式等等。

HTTP响应头信息:

应答头说明
Allow服务器支持哪些请求方法(如GET、POST等)。
Content-Encoding文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。
Content-Length表示内容长度。
Content-Type表示后面文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。
Date当前的GMT时间。
Expires应该在什么时候认为文档已经过期,从而不再缓存他。
Last-Modified文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。
Location表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302.
Refresh表示浏览器应该在多少时间之后刷新文档,以秒计。注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持他。
Server服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。
Set-Cookie设置和页面关联的Cookie。
WWW-Authenticate客户应该在Authorization头中提供什么类型的授权信息。在包含401(Unauthorized)状态行的应答中这个头是必需的。

HTTP状态

HTTP状态码

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。

HTTP状态码的英文为HTTP Status Code。

五种状态码:

  • 1xx:信息提示,表示请求已被成功接收,继续处理。
  • 2xx:请求被成功提交。
  • 3xx:客户端被重定向到其他资源。
  • 4xx:客户端错误状态码,格式错误或者不存在资源。
  • 5xx:描述服务器内部错误。

常见的状态码描述

  • 200:客户端请求成功,是最常见的状态。
  • 302:重定向。
  • 404:请求资源不存在,是最常见的状态。
  • 400:客户端请求有语法错误,不能被服务器所理解。
  • 401:请求未经授权。
  • 403:服务器收到请求,但是拒绝提供服务。
  • 500:服务器内部错误,是最常见的状态。
  • 503:服务器当前不能处理客户端的请求。