前端需要知道的计算机网络知识----HTTP基础

166 阅读15分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

一、HTTP的发展过程

1.1 HTTP定义

  • 定义:超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议。
  • 作用:规定WWW服务器与浏览器之间信息传递规范,是二者共同遵守的协议

1.2 发展

  1. HTTP0.9(1991年)
    1. 0.9协议是适用于各种数据信息的简洁快速协议,但是远不能满足日益发展的各种应用的需要。
    2. 只能是GET请求
    3. 服务端返回的格式只能是html
    4. 服务端响应数据之后自动断开连接
  2. HTTP1.0 (1996 年 5 月)
    1. 图像、视频、文字等富文本信息都允许传输,数据传输不再局限
    2. 除了GET请求之后,POST,HEAD等请求
    3. 新增了http header,状态码,缓存等基本功能
    4. 每次请求完毕之后依旧会自动断开连接
  3. HTTP1.1 (1997 年 1 月)
    1. 解决了连接问题,新增了(Connection:keep-alive)长连接的功能,请求结束之后,客户端会向服务端发送一个Connection: close的参数,要求服务端关闭链接。
      1. 解决的问题:一段时间内,同一个域名多次请求数据,只建立依次HTTP请求,其他的请求可服用每一次建立的连接通道,以达到提高请求效率的问题
    2. 新增了请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 、CONNECT
    3. 引入了管道机制:允许客户端一次性发送多个请求,然后服务端依次处理请求内容
    4. 缓存方面:引入了更多的缓存控制策略,例如 Etag、If-Unmodified-Since、If-Match、If-None-Match 等
    5. 资源请求方面:请求头中引入了 range 字段,支持断点续传。允许响应数据分块(chunked),利于传输大文件
  4. **HTTP2.0 **(2015年)
    1. 二进制传输协议:原先HTTP1.1的时候,头部信息使用文本来传输,body信息可以用文本或者二进制传输,但是HTTP2.0 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧",可以分为头信息帧和数据帧
    2. 多路复用:废弃了 1.1 中的管道,HTTP2.02】 仍然复用 TCP 连接,但是在一个连接里,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一发送,这样就避免了"队头堵塞"的问题
    3. 数据流:HTTP2.0每个请求或回应的所有数据包,称为一个数据流。每个数据流都有一个独一无二的编号
    4. 头信息压缩:一:头信息使用 gzip 或 compress 压缩后再发送;二:客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号。
    5. 服务端主动推送:允许服务器未经请求,主动向客户端发送资源
  5. HTTP3.0 (2022年6月发布)
    1. HTTP3.0基于UDP协议的“QUIC”协议
    2. QUIC协议解决了HTTP2.0 TCP丢包阻塞的问题
    3. QUIC实现了快速握手功能

1.3 总结

协议版本解决的核心问题解决方式
0.9HTML 文件传输确立了客户端请求、服务端响应的通信流程
1.0不同类型文件传输设立头部字段
1.1创建/断开 TCP 连接开销大建立长连接进行复用
2并发数有限二进制分帧
3TCP 丢包阻塞采用 UDP 协议

二、HTTP报文结构

HTTP 报文的三个组成部分(起始行、首部、空行和实体的主体部分)

2.1 请求报文

HTTP的请求报文由四部分组成(请求行+请求头部+空行+请求体)

POST / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,id;q=0.4
Cookie: xxxxxxxxxxxxx

name=tom&password=123

2.1.1 请求行

请求行由请求方法、URL 和 HTTP 协议版本组成,它们之间用空格分开 即上图中的GET / HTTP/1.1 请求方法有:GET、POS、TDELETE、HEAD、OPTIONS、PUT、TRACE

2.1.2 请求头

更多可以查看HTTP Headers key value的形势,允许客户端传递关于自身的信息,一些常见的请求头为:

Accept:指定客户端能够接收的内容类型,text/html,application/xhtml+xml,application/xml
Accept-Charset:浏览器可以接受的字符编码集。
Accept-Encoding:指定浏览器可以支持的web服务器返回内容压缩编码类型,gzip, deflate, sdch, br
Accept-Language:浏览器可接受的语言,zh-CN,zh;q=0.8,en;q=0.6,id;q=0.4
Accept-Ranges:可以请求网页实体的一个或者多个子范围字段。
Authorization:授权的授权证书。
Cache-Control:指定请求和响应遵循的缓存机制。
Connection:表示是否需要持久连接。(HTTP 1.1默认进行持久连接)
    close:告诉WEB服务器或代理服务器,在完成本次请求的响应后,断开连接
    keep-alive:告诉WEB服务器或代理服务器。在完成本次请求的响应后,保持连接,以等待后续请求
Cookie:请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。cookie - PSTM=1490844191; BIDUPSID=2145FF54639208435F60E1E165379255;
Content-Length:请求的内容长度。
Content-Type:请求的与实体对应的MIME信息。
Date:请求发送的日期和时间。
Expect:请求的特定的服务器行为。
From:发出请求的用户的EmailHost:指定请求的服务器的域名和端口号。
If-Match:只有请求内容与实体相匹配才有效。
If-Modified-Since:如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码。
If-None-Match:如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变。
If-Range:如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。
If-Unmodified-Since:只在实体在指定时间之后未被修改才请求成功。
Max-Forwards:限制信息通过代理和网关传送的时间。
Pragma:用来包含实现特定的指令。
Proxy-Authorization:连接到代理的授权证书。
Range:只请求实体的一部分,指定范围。
Referer:先前网页的地址,当前请求网页紧随其后,即来路。
TE:客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息。
Upgrade:向服务器指定某种传输协议以便服务器进行转换(如果支持。
User-AgentUser-Agent:的内容包含发出请求的用户信息。
Via:通知中间网关或代理服务器地址,通信协议。
Warning:关于消息实体的警告信息

2.1.3 空行

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头

2.1.4 请求体

请求数据不在 GET 方法中使用,而是在 POST 方法中使用。与请求数据相关的最常使用的请求头是 Content-Type和 Content-Length。

2.2 响应报文

HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Thu, 30 Mar 2017 12:28:00 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Cache-Control: private
Expires: Thu, 30 Mar 2017 12:27:43 GMT
Set-Cookie: BDSVRTM=0; path=/

2.2.1 状态行

响应行一般由协议版本、状态码及其描述组成

比如 HTTP/1.1 200 OK

  • HTTP-Version - HTTP 协议版本
  • Status-Code - 状态码
  • Reason-Phrase - 状态码描述
  • CRLF - 回车/换行符

2.2.2 响应头

更多可以查看HTTP Headers 响应头由 key-value 对组成

Accept-Ranges:表明服务器是否支持指定范围请求及哪种类型的分段请求。
Age:从原始服务器到代理缓存形成的估算时间(以秒计,非负)。
Allow:对某网络资源的有效的请求行为,不允许则返回405。
Cache-Control:告诉所有的缓存机制是否可以缓存及哪种类型。
    private 默认为private 响应只能够作为私有的缓存,不能再用户间共享
    public 浏览器和缓存服务器都可以缓存页面信息。
    must-revalidate 对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时。
    no-cache 浏览器和缓存服务器都不应该缓存页面信息。
    max-age=10  是通知浏览器10秒之内不要烦我,自己从缓冲区中刷新。
    no-store 请求和响应的信息都不应该被存储在对方的磁盘系统中。
Content-Encoding:服务器支持的返回内容压缩编码类型。。
Content-Language:响应体的语言。
Content-Length:响应体的长度。
Content-Location:请求资源可替代的备用的另一地址。
Content-MD5:返回资源的MD5校验值。
Content-Range:在整个返回体中本部分的字节位置。
Content-Type:返回内容的MIME类型。
Date:原始服务器消息发出的时间。
ETag:请求变量的实体标签的当前值。
Expires:响应过期的日期和时间。
Last-Modified:请求资源的最后修改时间。
Location:用来重定向接收方到非请求URL的位置来完成请求或标识新的资源。
Pragma:包括实现特定的指令,它可应用到响应链上的任何接收方。
Proxy-Authenticate:它指出认证方案和可应用到代理的该URL上的参数。
refresh:应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)
Retry-After:如果实体暂时不可取,通知客户端在指定时间之后再次尝试。
Server:服务器软件名称。
Set-Cookie:设置Http Cookie。
Trailer:指出头域在分块传输编码的尾部存在。
Transfer-Encoding:文件传输编码。
    Transfer-Encoding:chunked 这个响应头告诉客户端,服务器发送的资源的方式是分块发送的
Vary:告诉下游代理是使用缓存响应还是从原始服务器请求。
Via:告知代理客户端响应是通过哪里发送的。
Warning:警告实体可能存在的问题。
WWW-Authenticate:表明客户端请求实体应该使用的授权方案

2.2.3 空行

最后一个响应头之后是一个空行,发送回车符和换行符,通知浏览器以下不再有响应头

2.2.4 响应体

服务器返回给浏览器的响应信息,例如:

image.png

三、HTTP状态码

3.1 消息(1XX)

代表请求已被接受,需要继续处理。

  • 100 Continue

    • 客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请 求的剩余部分,或者如果请求已经完成,忽略这个响应
  • 101 Switching Protocols

    • 服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的 空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。
  • 102 Processing

    • 代表处理将被继续执行

3.2 成功(2XX)

代表请求已成功被服务器接收、理解、并接受。

  • 200 OK

    • 请求已成功,请求所希望的响应头或数据体将随此响应返回
  • 201 Created (已创建)

    • 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回
  • 202 Accepted (已接受)

    • 服务器已接受请求,但尚未处理。
  • 203 Non-Authoritative Information (非授权信息)

    • 服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。
    • 当前的信息可能是原始版本的子集或者超集。
  • 204 No Content (无内容)

    • 服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息
  • 205 Reset Content(重置内容)

    • 服务器成功处理了请求,且没有返回任何内容。
  • 206 Partial Content(部分内容)

    • 服务器已经成功处理了部分 GET 请求。
    • 该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件
  • 207 Multi-Status(多状态)

    • 由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。

3.3 重定向(3XX)

客户端采取进一步的操作才能完成请求, 通常,这些状态代码用来重定向

  • 300 Multiple Choices (多种选择)

    • 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
  • 301 Moved Permanently(永久移动)

    • 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。
    • 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
  • 302 Move Temporarily(临时移动)

    • 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
  • 303 See Other(查看其他位置)

    • 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码
  • 304 Not Modified(未修改)

    • 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容
    • 缓存会用到
  • 305 Use Proxy(使用代理)

    • 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理
  • 307 Temporary Redirect(临时重定向)

    • 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求

3.4 请求错误(4XX)

这些状态代码表示请求可能出错,妨碍了服务器的处理。

  • 400 Bad Request(错误请求)

    • 服务器不理解请求的语法。
    • 请求参数有误
  • 401 Unauthorized(未授权)

    • 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
  • 403 Forbidden(禁止)

    • 服务器拒绝请求。
  • 404 Not Found(未找到)

    • 请求失败,请求所希望得到的资源未被在服务器上发现。
  • 405 Method Not Allowed(方法禁用)

    • 请求行中指定的请求方法不能被用于请求相应的资源
  • 406 Not Acceptable(不接受)

    • 请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。
  • 407 Proxy Authentication Required(需要代理授权)

    • 此状态代码与 401(未授权)类似,但客户端必须在代理服务器上进行身份验证。
  • 408 Request Timeout(请求超时)

    • 服务器等候请求时发生超时。
  • 409 Conflict(冲突)

    • 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
  • 410 Gone(已删除)

    • 如果请求的资源已永久删除,服务器就会返回此响应。
  • 411 Length Required(需要有效长度)

    • 服务器拒绝在没有定义 Content-Length 头的情况下接受请求。
    • 在添加了表明请求消息体长度的有效 Content-Length 头之后,客户端可以再次提交该请求。
  • 412 Precondition Failed(未满足前提条件)

    • 服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。
  • 413 Request Entity Too Large(请求实体过大)

    • 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
  • 414 (Request-URI Too Long请求的 URI 过长)

    • 请求的 URI(通常为网址)过长,服务器无法处理。
  • 415 Unsupported Media Type(不支持的媒体类型)

    • 请求的格式不受请求页面的支持。
  • 416 Requested Range Not Satisfiable(请求范围不符合要求)

    • 如果页面无法提供请求的范围,则服务器会返回此状态代码。
  • 417 Expectation Failed(未满足期望值)

    • 服务器未满足"期望"请求标头字段的要求。

3.5 服务器错误(5XX)

服务器在尝试处理请求时发生内部错误

  • 500 Internal Server Error(服务器内部错误)

    • 服务器遇到错误,无法完成请求。
  • 501 Not Implemented(尚未实施)

    • 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
  • 502 Bad Gateway(错误网关)

    • 服务器作为网关或代理,从上游服务器收到无效响应。
  • 503 Service Unavailable(服务不可用)

    • 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
  • 504 Gateway Timeout(网关超时)

    • 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
  • 505 HTTP Version Not Supported(HTTP 版本不受支持)

    • 服务器不支持请求中所用的 HTTP 协议版本。