Web基础知识(16)- HTTP 协议简介


1. 简介

    HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是互联网(Internet)上应用最为广泛的一种网络协议,所有的 WWW 文件都必须遵守这个标准。

    1960 年美国人 Ted Nelson 构思了一种通过计算机处理文本信息的方法,并称之为超文本(Hypertext),这成为了 HTTP 超文本传输协议标准架构的发展根基。Ted Nelson 组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的 RFC,其中著名的 RFC 2616 定义了 HTTP 1.1。

    HTTP 协议是客户端(浏览器或其他程序)与 Web 服务器之间的应用层通信协议,客户端通过 HTTP 协议传输访问的访问 Web 服务器上存放的超文本信息。HTTP 协议不仅可用于 Web 访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现对各类超文本信息的访问。

    HTTP 协议的版本:

        (1) HTTP/1.0: 发送请求,创建一次连接,获得一个 Web 资源,连接断开;
        (2) HTTP/1.1: 发送请求,创建一次连接,获得多个 Web 资源,连接断开;

    HTTP 协议的组成:

        HTTP 协议包含通用报头(Header)、HTTP 请求 (Request)、HTTP 响应 (Response)和实体信息 (Entity-Body)。

        (1) 通用报头:是指 HTTP 请求和 HTTP 响应都支持的报头,包含 Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via;
        (2) HTTP 请求:由请求行、请求报头、请求正文三个部分组成;
        (3) HTTP 响应:由状态行、响应报头、响应正文三个部分组成;
        (4) 实体信息:HTTP 请求和 HTTP 响应都可以包含实体信息,实体信息一般由实体报头和实体正文组成,实体报头包含关于实体正文的原信息;

    HTTP 协议的主要特点:

        (1) 支持客户端/服务器模式;
        (2) 简单快速:客户端向服务器发送 HTTP 请求时,只需传送请求方法和路径。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快;
        (3) 灵活:HTTP 允许传输任意类型的数据对象,传输的类型由 Content-Type 标识;
        (4) 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户端的请求,并收到客户的应答后,即断开连接,这种方式可以节省传输时间;
        (5) 无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力,意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息,所以它的应答就比较快;

    常用的 HTTP 客户端:

        HTTP 客户端一般指封装了对 HTTP 协议进行处理的应用程序(比如:网页浏览器、命令行程序)和应用程序库或模块(比如:HttpUrlConnect),下表列出了常用的 HTTP 客户端:

HTTP 客户端 描述
Microsoft Edge Windows 系统自带的网页浏览器
Apple Safari MacOS 系统自动的网页浏览器
Google Chrome 由 Google 开发的跨平台网页浏览器
Mozilla Firefox Mozilla 在 Netscape 开源后的浏览器基础上开发的跨平台网页浏览器
Opera 由挪威 Opera Software ASA 开发的跨平台网页浏览器
HttpUrlConnect 应用程序 Java 库(或模块),JDK 自带
HttpClient 应用程序 Java 库(或模块),​Apache HttpComponents 的模块
requests     ​应用程序 Python 库(或模块),Python 内置了 requests 模块
cURL 命令行程序,也是一个跨平台的库(libcurl),支持 HTTP 协议
wget 命令行程序,Linux 上的命令行工具,支持 HTTP 协议

 

    常用的 HTTP 服务器:

        Web 服务器也称为 WWW(WORLD WIDE WEB)服务器、HTTP 服务器,其主要功能是提供网上信息浏览服务。下表列出了常用的 HTTP 服务器:

HTTP 服务器 描述
Microsoft IIS Microsoft 的 Web 服务器,只能运行在 Windows 或类 Windows 平台上
IBM WebSphere IBM 的基于 Java 的 Web 服务器,多用于企业级业务系统,在互联网领域很少应用
Apache Httpd Apache 的开源跨平台 Web 服务器,可以运行在几乎所有的 Unix、Windows、Linux 系统平台上
Apache Tomcat Apache 的基于 Java 的 Web 服务器
Nginx Nginx (engine x) 是一个高性能的 HTTP 和反向代理 Web 服务器,同时也提供了 IMAP/POP3/SMTP 服务
Lighttpd 一个开源的轻量级 Web 服务器
uhttpd 一个开源的轻量级 Web 服务器,适用于 Linux 嵌入式环境

           

2. URI 和 URL

    URI(Uniform Resource Identifiers,统一资源标识符)包含了 URN(Uniform Resource Name, 统一资源名称)和 URL (Uniform Resource Locator,统一资源定位符),并且这两者也拥有相似的语法和格式。

        URI 的格式:<Scheme Name>:<Hierarchical Part>[ ? <Query> ][ # <Fragment> ]

    URI 中的方案名称(Scheme Name)记录了 URI 正在使用的方案,它定义了 URI 其余部分的结构。因为 URI 是一种非常常用的资源标识方式,所以它拥有大量的方案可供使用。

    URI 的分层部分(Hierarchical Part)包含了资源的识别信息,这些信息会以分层的方式进行组织。如果分层部分以双斜线(//)开头,那么说明它包含了可选的用户信息,这些信息将以 @ 符号结尾,后跟分层路径。不带用户信息的分层部分就是一份单纯的路径,每个路径都由一连串的分段(Segment)组成,各个分段之间使用但斜杠(/)分隔。

    在 URI 的各个部分当中,只有 “方案名称” 和 “分层部分” 是必须的。以问号(?)为前缀的查询参数(Query)是可选的,这些参数用于包含无法使用分层方式表示的其他信息。多个查询参数会被组织成一连串的键值对,各个键值对之间只用 & 符号分割。

    URI 的另一个可选部分为片段(Fragment),片段使用井号(#)作为前缀,它可以对 URI 定义的资源中的次级资源(Secondary Resource)进行标识。当 URI 包含查询参数时,URI 的片段将被放到查询参数之后。因为 URI 的片段是由客户端负责处理的,所以 Web 浏览器在将 URI 发送给服务器之前,一般都会先把 URI 中的片段移除掉。
    
    URL (Uniform Resource Locator,统一资源定位符),就像每家每户都有一个门牌地址一样,每个网页也都有一个 Internet 地址。在网页浏览器的地址框中输入一个 URL 或是单击一个超级链接时,URL 就确定了要浏览的地址。

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

        URL 的格式:http://host[":"port][abs_path]

    格式说明:

        (1) http 表示要通过 HTTP 协议来定位网络资源;
        (2) host 表示合法的 Internet 主机域名或者 IP 地址;
        (3) port 指定一个端口号,为空则使用缺省端口 80;
        (4) abs_path 指定请求资源的 URI,如果 URL 中没有给出 abs_path,那么当它作为请求 URI 时,必须以 “/” 的形式给出,通常这个工作浏览器自动帮我们完成;

 

3. HTTP 请求 (Request)

    HTTP 请求由请求行、请求报头、请求正文三部分组成。

    1)请求行

        请求行以方法符号开头,以空格分隔,后面跟着请求的 URI 和协议的版本,请求行格式:

            Method Request-URI HTTP-Version CRLF

        其中 Method 表示请求方法,Request-URI 是一个统一资源标识符,HTTP-Version 表示请求的 HTTP 协议版本,CRLF 表示回车和换行(除了作为结尾的 CRLF 外,不允许出现单独的 CR 或 LF 字符)。

        请求方法列表:

请求方法 描述
GET 请求获取 Request-URI 所标识的资源
POST 在 Request-URI 所标识的资源后附加新的数据
HEAD 请求获取由 Request-URI 所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用 Request-URI 作为其标识
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
DELETE 请求服务器删除 Request-URI 所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用


    2) 请求报头

        请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。

        请求报头列表:

请求报头 描述
Accept 用于指定客户端接受哪些类型的信息。比如:Accept:text/html,表明客户端希望接受 html 文本;
Accept-Charset 用于指定客户端接受的字符集。比如:Accept-Charset:iso-8859-1,gb2312;
Accept-Encoding 类似于 Accept,用于指定可接受的内容编码。比如:Accept-Encoding:gzip,deflate;
Accept-Language 类似于Accept,用于指定一种自然语言。比如:Accept-Language:zh-cn;
Authorization 用于验证客户端是否有权查看某个资源。收到 401(未授权),可以发送一个包含 Authorization 请求报头域的请求,要求服务器对其进行验证。
Host 用于指定被请求资源的 Internet 主机和端口号,它通常从 HTTP URL 中提取出来的。
User-Agent 客户端将操作系统、浏览器和其它属性告诉服务器。


    3) 请求正文

        请求正文就是请求的实体正文。大多数 HTTP 请求都是没有请求正文的 GET 请求,请求正文一般使用 POST 或 PUT 方法上传到 Web 服务器。

        协议规定 POST 提交的数据必须放在实体信息(Entity-Body)中,没有规定数据必须使用什么编码方式。开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。

        常见的 4 种请求正文格式:

            (1) application/x-www-form-urlencoded:浏览器的原生 Form 表单,如果不设置 Content-Type 属性,则默认以这种方式传输请求正文(数据);
            (2) multipart/form-data: 使用表单上传文件时,必须让表单的 Content-Type 等于 multipart/form-data,支持传输多种文件格式;
            (3) application/json:JSON 字符串,支持结构化的数据;
            (4) text/xml:用于传输 XML 格式的数据,这种数据格式相比于 JSON 稍微复杂、臃肿;

 

4. HTTP 响应 (Response)

    HTTP 响应由状态行、响应报头、响应正文三部分组成。

    1) 状态行

        状态行以 HTTP 协议的版本开头,以空格分隔,后面跟着响应状态码和状态码的文本描述,状态行格式:

            HTTP-Version Status-Code Reason-Phrase CRLF;

        其中 HTTP-Version 表示 HTTP 协议的版本,Status-Code 表示响应状态码;Reason-Phrase 表示状态码的文本描述。

        状态码由三位数字组成,第一个数字定义了响应的类别,类别如下:

            (1) 1xx:提示信息,表示请求已接收,继续处理;
            (2) 2xx: 成功,表示请求已被成功接收;
            (3) 3xx:重定向,要完成请求必须进行更进一步的操作;
            (4) 4xx:客户端错误,请求有语法错误或请求无法实现;
            (5) 5xx:服务器端错误,服务器未能实现合法的请求;

        状态码详细列表:

状态码 描述
100 Continue(继续),请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 Switching Protocols(切换协议),请求者已要求服务器切换协议,服务器已确认并准备切换。
102 Processing(继续执行),由 WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
200 OK(成功),服务器已成功处理了请求。 通常表示服务器提供了请求的网页。
201 Created(已创建),请求成功并且服务器创建了新的资源。
202 Accepted(已接受),服务器已接受请求,但尚未处理。
203 Non-Authoritative Information(非授权信息),服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 No Content(无内容),服务器成功处理了请求,但没有返回任何内容。
205 Reset Content(重置内容),服务器成功处理了请求,但没有返回任何内容。
206 Partial Content(部分内容),服务器成功处理了部分 GET 请求。
207 Multi-Status, 由 WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个 XML 消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
300 Multiple Choices(多种选择),针对请求,服务器可执行多种操作。服务器可根据请求者 (User Agent) 选择一项操作,或提供操作列表供请求者选择。
301 Moved Permanently(永久移动),请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 Move Temporarily(临时移动),服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 See Other(查看其他位置),请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 Not Modified(未修改),自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 Use Proxy(使用代理),请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
306 Switch Proxy,在最新版的规范中,306 状态码已经不再被使用。
307 Temporary Redirect(临时重定向),服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
400 Bad Request(错误请求),服务器不理解请求的语法。
401 Unauthorized(未授权),请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
402 Payment Required ,该状态码是为了将来可能的需求而预留的。
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(需要有效长度),服务器不接受不含有效内容长度标头字段的请求。
412 Precondition Failed(未满足前提条件),服务器未满足请求者在请求中设置的其中一个前提条件。
413 Request Entity Too Large(请求实体过大),服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 Request-URI Too Long(请求的 URI 过长),请求的 URI(通常为网址)过长,服务器无法处理。这比较少见,通常的情况包括:本应使用 POST 方法的表单提交变成了 GET 方法,导致查询字符串(Query String)过长。
415 Unsupported Media Type(不支持的媒体类型),请求的格式不受请求页面的支持。
416 Requested Range Not Satisfiable(请求范围不符合要求),如果页面无法提供请求的范围,则服务器会返回此状态代码。
417  Expectation Failed(未满足期望值),服务器未满足”期望”请求标头字段的要求。
418 I'm a teapot
421 Misdirected Request ,请求被指向到无法生成响应的服务器(比如由于连接重复使用)。
422 Unprocessable Entity ,请求格式正确,但是由于含有语义错误,无法响应(RFC 4918 WebDAV)。
423 Locked ,当前资源被锁定(RFC 4918 WebDAV)。
424 Failed Dependency ,由于之前的某个请求发生的错误,导致当前请求失败,例如 PROPPATCH(RFC 4918 WebDAV),
425 Too Early ,代表服务器不愿意冒风险来处理该请求,原因是处理该请求可能会被 “重放”,从而造成潜在的重放攻击(RFC 8470)。
426 Upgrade Required ,客户端应当切换到 TLS/1.0(RFC 2817)。
449 Retry With ,由微软扩展,代表请求应当在执行完适当的操作后进行重试。
451 Unavailable For Legal Reasons,该请求因法律原因不可用(RFC 7725)。
500 Internal Server Error(服务器内部错误),服务器遇到错误,无法完成请求。
501 Not Implemented(尚未实施),服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502 Bad Gateway(错误网关),服务器作为网关或代理,从上游服务器收到无效响应。
503 Service Unavailable(服务不可用),服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504 Gateway Timeout(网关超时),服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 HTTP Version Not Supported(HTTP 版本不受支持),服务器不支持请求中所用的 HTTP 协议版本。
506 Variant Also Negotiates,由(RFC 2295)扩展,代表服务器存在内部配置错误:被请求的协商变元资源被配置为在透明内容协商中使用自己,因此在一个协商处理中不是一个合适的重点。
507 Insufficient Storage,服务器无法存储完成请求所必须的内容。这个状况被认为是临时的。WebDAV (RFC 4918)。
509 Bandwidth Limit Exceeded,服务器达到带宽限制。这不是一个官方的状态码,但是仍被广泛使用。
510 Not Extended,获取资源所需要的策略并没有被满足。(RFC 2774)
600 Unparseable Response Headers,源站没有返回响应头部,只返回实体内容。

   
    2) 响应报头

        响应报头允许服务器传递附加响应信息,以及关于服务器的信息和对 Request-URI 所标识的资源进行下一步访问的信息。

        响应报头列表:

响应报头 描述
Location 用于重定向接受者到一个新的位置,Location 响应报头域常用在更换域名的场景;
Server 包含了服务器用来处理请求的软件信息,与 User-Agent 请求报头域是相对应的;
WWW-Authenticate 客户端收到 401 响应消息时候,并发送 Authorization 报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域;


    3)响应正文

        响应正文就是响应的实体正文,服务器返回的资源内容。

 

5. 实体信息 (Entity-Body)

    请求和响应都可以传送一个实体,一个实体由实体报头和实体正文组成,实体报头和实体正文不是必须一起发送,可以只发送实体报头。

    实体报头列表:

实体报头 描述
Content-Encoding 用于媒体类型的修饰符,标识实体正文内容的编码方式。用于记录文档的压缩方法,比如:Content-Encoding: gzip
Content-Language 描述了资源所用的自然语言。比如: Content-Language:en
Content-Length 用于指明实体正文的长度,以字节方式存储的十进制数字来表示
Content-Type 用于指明发送给接收者的实体正文的媒体类型。比如:Content-Type:text/html;charset=GB2312
Last-Modified 用于指示资源的最后修改日期和时间
Expires 给出响应过期的日期和时间

 

6. 使用 Telnet 查看 HTTP 协议

    Telnet 是 Teletype Network 的缩写,表示远程登录协议和方式,分为 Telnet 客户端和 Telnet 服务器程序。

    1) 开启 Telnet 客户端

        默认情况下,Windows 系统的 Telnet 功能是关闭的,需要手动开启 Telnet 客户端,步骤如下:

            (1) 打开控制面板 (快捷打开方式: win+R 输入 control),然后点击【程序】,再点击【启用或关闭Windows】功能;
            (2) 勾选【Telnet客户端】,点击【确定】,可能需要重启 Windows;

    2) 运行 Telnet

        点击屏幕左下角 “开始” 按钮弹出系统菜单 (快捷打开方式: win+R) -> 输入 cmd 后按回车键,弹出 “命令提示符” 窗口。
        
            C:\> telnet 

            欢迎使用 Microsoft Telnet Client

            Escape 字符为 'CTRL+]'

            Microsoft Telnet>

            # 访问 www.baidu.com
            Microsoft Telnet> open www.baidu.com 80
            正在连接 www.baidu.com...

            # 在这个界面上输入如下两行请求头(这里有时间限制,很快会自动断开),
            # 或在文本编辑器里提前写好两行请求头复制(ctrl+c),在这个这个界面上粘贴(ctrl+v 或 点鼠标右键)
            GET /index.html HTTP/1.1
            HOST:www.baidu.com

            # 在这个界面上连续两次按回车键,返回响应头
            HTTP/1.1 200 OK
            Accept-Ranges: bytes
            Cache-Control: no-cache
            Connection: keep-alive
            Content-Length: 9508
            Content-Type: text/html
            Date: Sat, 14 Jan 2023 05:18:04 GMT
            P3p: CP=" OTI DSP COR IVA OUR IND COM "
            P3p: CP=" OTI DSP COR IVA OUR IND COM "
            Pragma: no-cache
            Server: BWS/1.1
            Set-Cookie: BAIDUID=5D8E8F6C17978B36636E9619D5541ED9:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
            Set-Cookie: BIDUPSID=5D8E8F6C17978B36636E9619D5541ED9; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
            Set-Cookie: PSTM=1673673484; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
            Set-Cookie: BAIDUID=5D8E8F6C17978B3641FFA9089C927EC7:FG=1; max-age=31536000; expires=Sun, 14-Jan-24 05:18:04 GMT; domain=.baidu.com; path=/; version=1; comment=bd
            Traceid: 1673673484066930637812217814785058918787
            Vary: Accept-Encoding
            X-Frame-Options: sameorigin
            X-Ua-Compatible: IE=Edge,chrome=1

            <!DOCTYPE html>
            <html>
                <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                
                ...

                </body>  
            </html>

            # 退出 Telnet
            Microsoft Telnet> quit 

 

posted @ 2023-01-13 21:30  垄山小站  阅读(484)  评论(0)    收藏  举报