• HTTP协议简介


    HTTP协议简介

    先简单介绍一下五层网络协议。

    • 物理层:实现物理层面的比特流传输,比如将0101转换成电压信号通过电缆传输。处于协议最底层。
    • 链路层:局域网内的不同MAC地址之间的信息传输,数据包会封装MAC信息。
    • 网络层:通过IP协议,实现不同IP地址间IP数据包(含有源ip和目的ip信息)的传输。
    • 传输层:构建于IP协议之上,实现不同主机端口间的通信。如TCP、UDP协议。TCP传输的是数据流,该协议保证了数据包的有序、可靠传输。
    • 应用层:各种网络应用会有自己独特的通信协议,比如邮件传输协议、ftp协议以及本文要讨论的http协议。

    HTTP协议

    HTTP协议全称为超文本传输协议(HyperText Transfer Protocol),是客户端(主要为浏览器)和服务端(网站)之间的通信标准,基于该协议构建了无处不在的万维网(world wide web)。HTTP通常基于TCP进行传输,由客户端发起对某一资源的请求,此时会建立到服务器指定端口(默认80)的TCP连接,服务端对该请求作出响应。HTTP协议规定了请求和响应的格式、请求方法和响应状态码等。

    HTTP请求

    当在浏览器地址栏输入www.baidu.com时,会发出如下请求(有简化):

    GET / HTTP/1.1
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Connection: keep-alive
    Host: www.baidu.com
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0
    
    

    该请求符合以下格式标准:

    请求行
    请求头
    [空行]
    消息体[可选]
    

    在上面请求信息中,请求行包含三项信息:

    • 请求方法 -> GET
    • 请求的资源路径 -> / 表示对网站根目录的请求,根据网站设定,通常是index.html或index.php。
    • 协议 -> HTTP/1.1 HTTP第一个广泛使用的版本是1.0,这里使用1.1,最新的2.0协议也推出了。

    对请求头的说明如下:

    • Accept 告知server本客户端能够接受的回应内容类型(Content-Types)。
    • Accept-Encoding 能够接受的编码方式。
    • Accept-Language 能够接受的回应内容的自然语言列表。
    • Connection 连接类型。keep-alive表示保持连接以备其它资源如css、图片等请求使用。
    • HOST 主机信息,指定向哪个网站发出请求,除host外,头信息中其它内容都是可选的。
    • User-Agent 客户端类型。不同浏览器一般都不一样,服务器可据此返回差异化内容。

    根据需要,请求头中还可能携带其它信息。列举几个比较常用的:

    • Cookie 由于http是无状态协议,cookie通常用来传递一些个性化信息,如PHPSESSID,据此实现了session会话控制,以保持用户状态。
    • Referer 表示浏览器所访问的前一个页面,正是那个页面上的某个链接将浏览器带到了当前所请求的这个页面。
    • If-Modified-Since 对应于HTTP响应头中的Last-Modified(资源最后修改时间),如果服务器发现资源在此时间后没被修改,则返回304 Not Modified响应,这样浏览器会直接使用本地缓存,节省了文件传输的消耗。
    • If-None-Match 对应于HTTP响应头中的ETag(资源版本号)文件的唯一标志符,类似哈希或者指纹,如果文件发生变化,则ETag也会改变。服务器文件ETag与请求头中If-None-Match内容相同时,就发出304响应,否则返回新的文件。由于服务器时间可能不准确,ETag优先级高于Last-Modified。
    • Range 请求资源的范围,一般为字节(可理解为“分页”)。可实现断点续传。

    请求头结束后,会有一个空行,然后是可选的消息体,用来向服务器提交数据,如post请求的表单信息。本例中,请求没有消息体。

    HTTP响应

    请求到达baidu.com服务器后,处理完会发出如下响应:

    HTTP/1.1 200 OK
    Cache-Control: private
    Connection: Keep-Alive
    Content-Encoding: gzip
    Content-Type: text/html; charset=utf-8
    Date: Fri, 30 Mar 2018 07:26:56 GMT
    Expires: Fri, 30 Mar 2018 07:26:05 GMT
    Server: BWS/1.1
    Set-Cookie: BDSVRTM=0; path=/
    
    <!DOCTYPE html>
    <!--STATUS OK-->
    [省略html内容]
    

    同样的,响应也有一定的格式:

    状态行
    响应头
    [空行]
    响应体
    

    状态行中也包含三项信息:

    • HTTP/1.1 协议版本
    • 200 状态码(status code)。
    • OK 状态描述

    对响应头中各字段说明如下:

    • Cache-Control 缓存控制,private 意味着这个文件对不同的用户是不同的。只有用户自己的浏览器能够进行缓存,中间的代理服务器不允许缓存;no-cache 不能缓存。
    • Connection TCP连接选项。Keep-Alive 保持并复用该连接。
    • Content-Encoding 内容编码方式 gzip 使用gzip压缩,则浏览器要用对应的方式解压。
    • Date 服务器发出响应的时间。
    • Expires 资源过期时间。
    • Server 服务器软件类型。
    • Set-Cookie 设置cookie。

    除此之外,还有其它比较重要的响应头:

    • Location 重定向。
    • Access-Control-Allow-Origin 指定哪些网站可参与到跨来源资源共享过程中。
    • Last-Modified 资源最后修改时间。
    • Pragma 常见值no-cache。HTTP1.0可用此禁止缓存。
    • ETag 资源的唯一标示符。

    响应结束后,会有一个空行,然后是响应的正文,本例中是baidu.com首页的html内容。

    HTTP请求方法

    注:这一部分内容参考了中文wiki

    HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:

    • GET 向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中。
    • HEAD 与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
    • POST 向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
    • PUT 向指定资源位置上传其最新内容。
    • DELETE 请求服务器删除Request-URI所标识的资源。
    • TRACE 回显服务器收到的请求,主要用于测试或诊断。
    • OPTIONS 这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
    • CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

    方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。

    HTTP响应状态码

    • 1** 服务器收到请求,需要请求者继续执行操作。
    • 2** 成功,操作被成功接收并处理。典型的如200 OK,响应一切顺利。
    • 3** 重定向,需要进一步的操作以完成请求,如304 Not Modified,资源未修改,用你的缓存吧。
    • 4** 客户端错误,请求包含语法错误或无法完成请求。著名的404 Not Found 你要的东西没有哦。
    • 5** 服务器错误,服务器在处理请求的过程中发生了错误。比如500 Internal Server Error,服务器内部错误,大概是程序员比较怕看到的。
  • 相关阅读:
    winform中的确定取消
    jquery ui
    BS中的 data:image/png;base64
    关于如何在MVC中 执行JS
    JS base64 加密和 后台 base64解密(防止中文乱码)
    jqgrid 中的事件
    URL重写无效
    JS创建缩略图
    ComponentArt.web.ui中文帮助之Grid(一)
    Microsoft Volta: Web时代的VB!
  • 原文地址:https://www.cnblogs.com/cnsr/p/8677571.html
Copyright © 2020-2023  润新知