• 计算机网络 HTTP


    概念

    Web 基础

    • HTTP (HyperText Transfer Protocol,超文本传输协议)
    • WWW (World Wide Web)的三种技术:HTML、HTTP、URL
    • RFC(Request for Comments,征求意见书),互联网的设计文档

    URL

    • URL(Uniform Resource Indentifier,统一资源表示符)
    • URL(Uniform Resource Locator,统一资源定位符)
    • URN(Uniform Resource Name,统一资源名称),例如 urn:isbn:0-486-27557-4

    URL 包含 URL 和 URN,目前 WEB 只有 URL 比较流行,所以见到的基本都是 URL。
    在这里插入图片描述

    请求响应报文

    请求报文

    在这里插入图片描述

    响应报文

    在这里插入图片描述

    HTTP 方法

    客户端发送的 请求报文 第一行为请求行,包含了方法字段。

    GET

    获取资源
    
    • 1

    当前网络请求中,绝大部分使用的是 GET 方法。

    POST

    传输实体主体
    
    • 1

    POST 主要目的不是获取资源,而是传输存储在内容实体中的数据。
    GET 和 POST 的请求都能使用而外的参数,但是 GET 的参数是以查询字段出现在 URL 中,而 POST 的参数存储在内容实体。

    GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
    
    • 1
    POST /test/demo_form.asp HTTP/1.1
    Host: w3schools.com
    name1=value1&name2=value2
    
    • 1
    • 2
    • 3

    HEAD

    获取报文首部
    
    • 1

    和 GET 方法一样,但是不返回报文实体主体部分。
    主要用于确认 URL 的有效性以及资源更新的日期时间等。

    PUT

    上传文件
    
    • 1

    由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。

    PUT /new.html HTTP/1.1
    Host: example.com
    Content-type: text/html
    Content-length: 16
    <p>New File</p>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    PATCH

    对资源进行部分修改
    
    • 1

    PUT 也可以用于修改资源,但是只能完全替代原始资源,PATCH 允许部分修改。

    PATCH /file.txt HTTP/1.1
    Host: www.example.com
    Content-Type: application/example
    If-Match: "e0023aa4e"
    Content-Length: 100
    [description of changes]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    DELETE

    删除文件
    
    • 1

    与 PUT 功能相反,并且同样不带验证机制。

    DELETE /file.html HTTP/1.1
    
    • 1

    OPTIONS

    查询支持的方法
    
    • 1

    查询指定的 URL 能够支持的方法。
    会返回 Allow: GET, POST, HEAD, OPTIONS 这样的内容。

    CONNECT

    要求用隧道协议连接代理
    
    • 1

    要求在于代理服务器通信时建立隧道,使用 SSL(Secure Sokets Layer,安全套接字)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。

    CONNECT www.example.com:443 HTTP/1.1
    
    • 1

    在这里插入图片描述

    TRACE

    追踪路径
    
    • 1

    服务器会将通信路径返回给客户端。

    发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个服务器就会减 1,当数值为 0 时就停止传输。

    通常不会使用 TRACE,并且它容易受到 XST 攻击(Cross-Site Tracing,跨站追踪),因此更不会去使用它。

    HTTP 状态码

    服务器返回的 响应报文 中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。

    状态码类别原因短语
    1XXInformational(信息性状态码)接收的请求正在处理
    2XXSuccess(成功状态码)请求正常处理完毕
    3XXRedirection(重定向状态码)需要进行附加操作以完成请求
    4XXClient Error(客户端错误状态码)服务器无法处理请求
    5XXServer Error(服务器错误状态码)服务器处理请求出错

    2XX 成功

    • 200 OK
    • 204 No Content :请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
    • 206 Partial Content :表示客户端进行了范围请求。响应报文包含由 Content-Range 指定范围的实体内容。

    3XX 重定向

    • 301 Moved Permanently :永久性重定向
    • 302 Found :临时性重定向
    • 303 See Other :和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。
    • 注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。
    • 304 Not Modified :如果请求报文首部包含一些条件,例如:If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since,如果不满足条件,则服务器会返回 304 状态码。
    • 307 Temporary Redirect:临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。

    4XX 客户端错误

    • 400 Bad Request :请求报文中存在语法错误。
    • 401 Unauthorized :该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败。
    • 403 Forbidden :请求被拒绝,服务器端没有必要给出拒绝的详细理由。
    • 404 Not Found

    5XX 服务器错误

    • 500 Internal Server Error :服务器正在执行请求时发生错误。
    • 503 Service Unavilable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

    HTTP 首部

    有 4 中类型首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段

    通用首部字段

    首部字段名说明
    Cache-Control控制缓存行为
    Connection控制不再转发给代理的首部字段、管理持久连接
    Date创建报文的日期时间
    Pragma报文指令
    Trailer报文末端的首部一览
    Transfer-Encoding指定报文主体的传输编码方式
    Upgrade升级为其他协议
    Via代理服务器的相关信息
    Warning错误通知

    请求首部字段

    首部字段名说明
    Accept用户代理可处理的媒体类型
    Accept-Charset优先的字符集
    Accept-Encoding优先的内容编码
    Accept-Language优先的语言(自然语言)
    AuthorizationWeb 认证信息
    Expect期待服务器的特定行为
    From用户的电子邮箱地址
    Host请求资源所在服务器
    If-Match比较实体标记(ETag)
    If-Modified-Since比较资源的更新时间
    If-None-Match比较实体标记(与 If-Match 相反)
    If-Range资源未更新时发送实体 Byte 的范围请求
    If-Unmodified-Since比较资源的更新时间(与 If-Modified-Since 相反)
    Max-Forwards最大传输逐跳数
    Proxy-Authorization代理服务器要求客户端的认证信息
    Range实体的字节范围请求
    Referer对请求中 URI 的原始获取方
    TE传输编码的优先级
    User-AgentHTTP 客户端程序的信息

    响应首部字段

    首部字段名说明
    Accept-Ranges是否接受字节范围请求
    Age推算资源创建经过时间
    ETag是资源的匹配信息
    Location令客户端重定向至指定 URI
    Proxy-Authenticate代理服务器对客户端的认证信息
    Retry-After对再次发起请求的时机要求
    ServerHTTP 服务器的安装信息
    Vary代理服务器缓存的管理信息
    WWW-Authenticate服务器对客户端的认证信息

    实体首部字段

    首部字段名说明
    Allow资源可支持的 HTTP 方法
    Content-Encoding实体主体适用的编码方式
    Content-Language实体主体的自然语言
    Content-Length实体主体的大小
    Content-Location替代对应资源的 URI
    Content-MD5实体主体的报文摘要
    Content-Range实体主体的位置范围
    Content-Type实体主体的媒体类型
    Expires实体主体过期的日期时间
    Last-Modified资源的最后修改日期时间

    Cookie

    HTTP 协议是无状态的,主要是为了让 HTTP 协议尽可能简单,是它能够处理更大的事务。HTTP/1.1 引入 Cookie 来保存状态信息。

    Cookie 是服务器发送给客户端的数据,该数据会被保存在浏览器中,并且客户端的下次请求保存会包含该数据。通过 Cookie 可以让服务器知道两个请求是否来自同一个客户端,从而实现保持登录状态等功能

    创建过程

    服务器发送的响应报文包含 set-Cookie 字段,客户端得到响应报文后把 Cookie 内容保存到浏览器中。

    HTTP/1.0 200 OK
    Content-type: text/html
    Set-Cookie: yummy_cookie=choco
    Set-Cookie: tasty_cookie=strawberry
    [page content]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    客户端之后发送请求时,会从浏览器中读出 Cookie 值,在请求报文中包含 Cookie 字段。

    GET /sample_page.html HTTP/1.1
    Host: www.example.org
    Cookie: yummy_cookie=choco; tasty_cookie=strawberry
    
    • 1
    • 2
    • 3

    Set-Cookie

    属性说明
    NAME=VALUE赋予 Cookie 的名称和其值(必需项)
    expires=DATECookie 的有效期(若不明确指定则默认为浏览器关闭前为止)
    path=PATH将服务器上的文件目录作为 Cookie 的适用对象(若不指定则默认为文档所在的文件目录)
    domain=域名作为 Cookie 适用对象的域名(若不指定则默认为创建 Cookie 的服务器的域名)
    Secure仅在 HTTPs 安全通信时才会发送 Cookie
    HttpOnly加以限制,使 Cookie 不能被 JavaScript 脚本访问

    Session 和 Cookie 区别

    Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一个唯一标识:Session ID。当服务器创建一个 Session 时,给客户端发送的响应报文包含 Set-Cookie 字段,其中有个名为 sid 的键值对,这个键值对就是 Session ID 。客户端接收到后就把 Cookie 保存在浏览器中,并且之后发送的请求报文都包含 Session ID 。HTTP 就是通过 Session 和 Cookie 两种方式一起合作来实现跟踪用户状态的,Session 用于服务器端,Cookie 用于客户端

    浏览器禁用 Cookie 的情况

    会使用 URL 重写技术,在 URL 后面加上 sid=xxx 。

    使用 Cookie 实现用户名和密码的自动填写

    网站脚本会自动从保存在浏览器中的 Cookie 读取用户名和密码,从而实现自动填写。

    缓存

    优点:

    • 降低服务器的负担
    • 提高响应速度(缓存资源比服务器上的资源离客户端更近)

    实现方法:

    • 让代理服务器进行
    • 让客户端浏览器缓存

    Cache-Control 字段

    HTTP 通过 Cache-Control 首部字段来控制缓存。

    Cache-Control: private, max-age=0, no-cache
    
    • 1

    no-cache 指令

    该指令出现在请求报文的 Cache-Control 字段中,表示缓存服务器需要先向原服务器验证缓存资源是否过期;

    该指令出现在响应报文的 Cache-Control 字段中,表示缓存服务器在进行缓存之前需要先验证缓存资源的有效性。

    no-store 指令

    该指令表示缓存服务器不能对请求或响应的任何一部分进行缓存。

    no-cache 不表示不缓存,而是缓存之前需要先进行验证,no-store 才是不进行缓存。

    max-age 指令

    该指令出现在请求报文的 Cache-Control 字段中,如果缓存资源的缓存时间小于该指令指定的时间,那么就能接受该缓存。

    该指令出现在响应报文的 Cache-Control 字段中,表示缓存资源在缓存服务器中保存的时间。

    Expires 字段也可以用于告知缓存服务器该资源什么时候会过期。在 HTTP/1.1 中,会优先处理 Cache-Control : max-age 指令;而在 HTTP/1.0 中,Cache-Control : max-age 指令会被忽略掉。

    持久连接

    当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求图片资源,如果每进行一次 HTTP 通信就要断开一次 TCP 连接,连接建立和断开的开销会很大。持久连接只需要建立一次 TCP 连接就能进行多次 HTTP 通信。
    在这里插入图片描述
    持久连接需要使用 Connection 首部字段进行管理。HTTP/1.1 开始 HTTP 默认是持久化连接的,如果要断开 TCP 连接,需要由客户端或者服务器端提出断开,使用 Connection : close;而在 HTTP/1.1 之前默认是非持久化连接的,如果要维持持续连接,需要使用 Connection : Keep-Alive。

    管线化方式 可以同时发送多个请求和响应,而不需要发送一个请求然后等待响应之后再发下一个请求。

    通信数据转发

    代理

    代理服务器接受客户端的请求,并且转发给其它服务器。

    使用代理的主要目的是:缓存、网络访问控制以及访问日志记录。

    代理服务器分为正向代理和反向代理两种,用户察觉得到正向代理的存在,而反向代理一般位于内部网络中,用户察觉不到。
    在这里插入图片描述

    网关

    与代理服务器不同的是,网关服务器会将 HTTP 转化为其它协议进行通信,从而请求其它非 HTTP 服务器的服务。

    隧道

    使用 SSL 等加密手段,为客户端和服务器之间建立一条安全的通信线路。

    版本比较

    HTTP/1.0 与 HTTP/1.1 的区别

    • http/1.1使用的是长连接 而http1.0使用的是短连接。
    • http/1.1在消息中增加了版本号, 用于扩展兼容。
    • http/1.1的缓存机制更加的灵活。
    • http/1.1对带宽进行了优化。
    • http/1.0只定义了16个状态响应码,而http/1.1定义了24个状态码。
    • http/1.0中1个服务器只能绑定一个地址,而http/1.1中1个服务器可以存在多个虚拟主机共享同一个IP地址,因为请求和响应都支持Host头域。

    HTTP/1.1 与 HTTP/2.0 的区别

    多路复用

    HTTP/2.0 使用多路复用技术,使用同一个 TCP 连接来处理多个请求。

    首部压缩

    HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 要求通讯双方各自缓存一份首部字段表,从而避免了重复传输。

    服务端推送

    在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 index.html 页面,服务端就把 index.js 一起发给客户端。

    二进制格式

    HTTP/1.1 的解析是基于文本的,而 HTTP/2.0 采用二进制格式。

  • 相关阅读:
    一文详解Docker镜像
    网络安全(黑客)自学笔记
    win7电脑一直闪屏是什么原因?
    由浅入深理解latent diffusion/stable diffusion(3):一步一步搭建自己的stable diffusion models
    乐信面试经历
    【嵌入式基础】串口通信
    资深工程师整理2022年最新面试题汇总
    vs code 和 hbuilder 历史记录查询
    【数据可视化】免费开源BI工具DataEase实现了SQL数据集和Excel数据集关联?(什么?快别挡着我,冲!)
    【Python Web】Flask框架(一)快速开发网站
  • 原文地址:https://blog.csdn.net/qq_44697754/article/details/128097373