• 【计算机网络】HTTP协议



    1. HTTP介绍

    HTTP(hypertext transfer protocol)是一种常用的应用层协议,用于在计算机之间传输超文本数据。 它是Web通信的基础,客户端(通常是浏览器)和服务器使用HTTP协议传输网页、视频、图片等资源。下面是HTTP协议的一些特性:

    1. 基于请求-响应模型。 浏览器客户端发送HTTP请求,请求中包含客户端欲获得的资源,服务器接收并处理请求,并返回响应到客户端,响应通常包含客户端请求的资源和状态信息。
    2. HTTP是无状态的。 “无状态”也可称为“无记忆”,即客户端每次HTTP请求都是独立的,服务器不会在多个请求之间保留关于客户端的状态信息,这意味着服务器看待每个请求都像是孤立的,新的事件。
    3. 持久连接: 为了提高性能,HTTP/1.1引入了持久连接,允许多个请求和响应在同一TCP连接上传输,减少了连接建立和拆除的开销。在此之前的HTTP/1.0是无连接的,即发送一次请求创建一个新连接。

    认识URL

    URL(uniform resource Locator)统一资源定位符,是HTTP标识某个特定资源的方式,可以定位资源的地址。

    在这里插入图片描述

    Scheme: 表明浏览器使用哪种协议,通常是http或https(安全版http,后面详谈)。

    Domain Name: 服务器域名,标识申请资源在哪一台服务器上,本质上是一个ip地址,也可以直接用服务器的ip地址。

    Port:服务器端口号。http/https协议规定了标准端口号(http: 80, https: 443),若URL此项为空则根据Scheme默认使用标准。

    Path to the file: 请求资源在服务器上的路径。这个路径虽然看起来以根目录起始,但在服务器中一般是在某个wwwroot文件夹下的。

    Parameters: 提交到服务器的一些参数,从?开始,以key=value的形式保存并以&为分隔符隔开。服务器可以使用这些参数来执行额外的操作,具体作何操作由服务器决定。

    Anchor: 片段标识符,从#开始。锚点表示资源中的一种“书签”,给浏览器显示位于该“加书签”位置的内容的方向。例如,在 HTML 文档上,浏览器将滚动到定义锚点的位置。

    📝参考文章:

    什么是URL?


    2. HTTP消息结构

    💭先认识HTTP请求和响应的宏观结构,再深入理解结构中的不同内容。

    请求request

    🔎HTTP请求(request)结构如下:

    在这里插入图片描述

    请求由四部分构成,分别为:请求行、请求报头、空行和正文。每部分由分隔符\r\n以行的形式隔开。

    1. 请求行(request line):包含请求方法(最常见的是GET和POST)、URL和http协议版本(HTTP/1.0, HTTP/1.1),每部分以空格分隔。这里的URL不一定是携带域名和端口号的完整URL,一般只是服务器资源路径,因为HTTP客户端已经知道您要访问的资源来自哪个主机地址,通常会保存在请求报头的Host字段中。
    2. 报头(headers):请求的属性,以冒号分割的键值对,每组属性之间用\r\n隔开。
    3. 空行:空行代表报头部分的结束,进入正文部分
    4. 正文(body):若请求是POST/PUT等用于上传的方法,正文可以包含上传至服务器的数据资源。对于GET请求,请求正文通常是不包含数据的。

    响应response

    🔎HTTP响应(response)结构如下:

    在这里插入图片描述

    响应同样由四部分构成,分别为:状态行、响应报头、空行和正文。每部分由分隔符\r\n以行的形式隔开。

    1. 状态行(response line):包含协议版本、状态码、(状态码对应的)状态描述
    2. 响应报头(headers):响应的属性,以冒号分割的键值对,每组属性之间用\r\n隔开。
    3. 空行:空行代表报头部分的结束,进入正文部分
    4. 正文(body):发送给客户端的各种类型的资源,如:网页资源、视频、图像等。本质是二进制数据,客户端收到后会根据正文类型(Content-Type,响应header的一种)做解析,得到自己想要的资源。

    3. HTTP请求方法

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

    • HTTP/1.0定义了三种请求方法:GET, POST 和 HEAD 方法。

    • HTTP/1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

    请求方法描述
    GET请求指定资源,返回资源实体
    POST向指定资源提交数据进行处理请求,如:提交表单、上传各种文件。数据包含在请求正文中,POST可能会导致新资源的创建或已有资源的修改。POST请求不会在客户端缓存,因此浏览器查无POST请求记录。
    HEAD类似于GET,不同的是请求后返回的响应没有具体的正文内容,只用于获取响应报头。
    PUT向服务器中指定的URL路径上传或更新完整的资源。
    DELETE请求服务器删除指定页面
    CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
    OPTIONS允许客户端查看服务器的性能
    TRACE回显服务器收到的请求,主要用于测试或诊断
    PATCH是对 PUT 方法的补充,用来对已知资源进行局部更新 。
    • GET和POST方法都可以向服务器提交参数,区别在于GET通过URL提交,而POST通过请求正文提交。

      例子:form表单提交参数,可选择提交参数的方式GET/POSE,可以对比两种方式服务器收到请求的区别。(测试环境为作者自行编写的一个简单的HTTP服务器)

      若选择method=“GET”

      在这里插入图片描述

      若选择method=“POST”

      在这里插入图片描述

    • POST和PUT的区别:POST通常用于执行各种不同的操作,提交某些请求数据,以供服务器完成特定的处理,如登录账号。PUT一般是向服务器指定路径上传或更新完整的文件资源,路径存在则更新,路径不存在则创建。


    4. HTTP报头

    💭HTTP Header有很多种,这里总结几个比较重要的Header,具体内容可以参考文章:

    📝HTTP响应头和请求头信息对照表

    Header Key解释示例适用于
    Content-Type正文内容的类型Content-Type: text/html请求、响应
    Content-Length正文内容的长度Content-Length: 1024请求、响应
    Host请求服务器的ip地址和端口号Host: ip:port请求
    User-Agent客户端信息(含OS、浏览器版本)User-Agent: Mozilla/5.0 (Linux; X11)请求
    Cookie用户状态信息Cookie: sessionID=27请求
    Set-Cookie设置用户状态信息Set-Cookie: sessionID=27响应
    Location搭配3XX状态码使用,告知客户端重定向地址Location: /a/b/c.html响应

    📝HTTP Content-Type 对照表

    有关Cookie的两个header,后面详细分析。


    5. HTTP响应状态码

    服务器返回到客户端的响应,必须包含状态码,告知用户请求处理完毕的结果。常见的我们日常会遇到的网页404 Not Found错误,404就是一种状态码。

    状态码大致大致有五个范围:

    • 1XX:提供某种附加信息
    • 2XX:请求成功
    • 3XX:重定向
    • 4XX:客户端错误
    • 5XX:服务端异常

    常见的几个状态码及对应的状态描述:

    状态码状态描述解释
    200OK请求成功
    301Moved Permanently永久重定向
    302Found临时重定向
    400Bad Request请求语法错误,服务器无法理解
    403Forbidden服务器拒绝用户请求
    404Not Found服务器无法根据请求找到资源
    500Internal Server Error服务器内部错误,无法完成请求

    关于重定向

    这里的重定向指的是:客户端接收到状态码为3XX的响应时,会重新定位新的资源,即发送新的请求。3XX状态码一般搭配报头Location使用,由Location指定新的URL。

    301状态码是永久重定向,告知客户端请求资源已永久转移到另一个URL。客户端收到301响应后,会更新其书签、链接或缓存,以便下次请求时直接使用新的URL。对于搜索引擎来说,内部存储了大量的索引信息(关键词->URL),当访问某网站时收到301响应,则会修改搜索引擎内部的索引。

    302状态码是临时重定向,告知客户端请求资源只是暂时转移到另一个URL,客户端收到302响应后并不会修改其缓存信息。临时重定向通常也被应用在一些需要做网页跳转的场景,如:用户登录、广告植入等等。


    6. Cookie和Session

    💭场景:当我们用浏览器登录一次b站后,接下来很长一段时间都不用重新登录了,每次访问b站都是直接用的。可这似乎和我们之前提及的http特性相悖:http不是无状态的吗?既然无状态,为什么登录一次之后,浏览器能“记住”我的登录信息呢?不应该是每次访问都要重新登录吗?

    事实上,按照http“无状态”的特性来讲,确实每次访问都需要重新登录,可这会让用户的体验极差。因此,浏览器客户端使用了Cookie的概念,解决了这一问题。Cookie是一种维护用户状态和跟踪用户身份的机制,本质是一种保存在客户端(浏览器)的轻量级文本文件,当用户访问某个网站时,浏览器会将Cookie数据打包在请求中(以Header形式存在),发送给服务器。

    为什么说Cookie能解决http无状态的问题,实现用户无需频繁重新登录的功能?下面模拟Cookie在用户两次访问b站期间的作用过程。

    在这里插入图片描述

    但是上面这种客户端直接发送Cookie的做法并不安全,因为传输过程中,黑客能够盗取用户的Cookie,获得用户的账号密码并进行非法操作。因此有了另外一种解决方案:Session。

    Session会话是一种存储在服务器中的数据结构,用于存储和维护用户的状态信息。 每个用户登录后,服务器会为其创建一个新会话,以维护其状态信息。每个会话都有一个唯一的sessionID,客户端不再收取由服务器经处理确认后发回的原始Cookie信息,而是接收并保存由服务器为客户端创建的会话sessionID(sessionID同样保存在响应报头的Set-Cookie字段中)。

    在这里插入图片描述

    这样一来,由于客户端与服务器之间传递的是sessionID而不是原始状态信息,虽然无法保证sessionID不被中间人盗取,但是便于服务器更好地控制和保护会话数据(如检测到登录状态异常,自动删除session,要求重新登录),中间人盗取了sessionID也没用。

    在这里插入图片描述


    ENDING…

  • 相关阅读:
    FreeRadius介绍使用和Java调用
    基于形状的匹配提纲
    车机中 Android Audio 音频常见问题分析方法实践小结
    MySQL之数据库编程(创建存储过程)
    网络安全 - ARP 欺骗原理+实验
    producer参数---Kafka从入门到精通(七)
    [牛客top101]合并两个有序链表
    1.什么是闭包
    esp8266网页控制RGB灯颜色
    How to create new user for ORACLE 19c (CDB & PDB)
  • 原文地址:https://blog.csdn.net/C0631xjn_/article/details/133951532