Web基础知识——HTTP协议那点事

Posted 就是三七

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web基础知识——HTTP协议那点事相关的知识,希望对你有一定的参考价值。


本文接着填上文HTTP协议的坑233333~
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收html页面的方法。HTTP协议和TCP/IP协议族内的其他协议相同,用于客户端与服务端间通信。


01

HTTP协议特点


一、支持客户/服务器模式:客户端向服务器发送请求,服务器端响应请求,并且提供相应服务。
二、简单快速:客户端向服务器端发起请求时,只需传送请求方法和路径(请求方法在后面的内容中详述);由于HTTP协议简单,使得HTTP协议服务器规模较小,运行速度快。
三、灵活:HTTP/1.0版本后新增的Content-Type字段使得HTTP协议允许传输任意类型的数据对象。
四、无连接:无连接的含义是限制每次连接只处理一个请求;服务器处理完客户端的请求,并接受到客户端的应答后,即断开连接,可节省传输时间。
五、无状态:HTTP协议本身是一种无状态协议,即协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则必须重传,这样可能导致每次连接传送的数据量增大;而另一方面,在服务器不需要先前的信息时,无状态使得服务器的应答速度较快。


02


URL和URI


Q:我们输入在浏览器里的Web地址到底是URL还是URI?
这个问题我们稍后回答。我们先来看看他们各自的定义。
URI:一个紧凑的字符串,用来标识抽象或物理资源。
一个URI可以进一步被分为定位符、名字或者二者都是。
而URL是URI的子集,除了确定一个资源,还提供一种定位该资源的主要访问机制(如其网络位置)。
光是这样解释可能还是不够清晰,那么引用维基百科中的一段描述:
URI可以分为URL,URN或同时具备locators和names特性的一个东西;URN好像一个人的名字,URL则是一个人的地址;换言之,URN确定了资源的身份,URL提供了找到他的方式。
所以URL和URI最大的区别在于访问机制的不同。
来看几个例子:
  • ftp://ftp.is.co.za/rfc/rfc1808.txt(URL)

  • http://www.ietf.org/rfc/rfc2396.txt(URL)

  • Idap://[2001:db8::7]/c=GB?objectClass?one(URL)

  • mailto:John.Doe@example.com(URL)

  • news:comp.infosystems.www.servers.unix(URL)

  • tel:+1-816-555-1212(URI)

  • telnet://192.0.2.16:80/(URL)

  • urn:oasis:names:specification:docbook:dtd:xml:4.1.2(URI)

现在回答开头的问题:Web地址被称为URI更加准确。
我们经常使用的URI并不是严格技术意义上的URL。比方说,你要请求的资源在ink.com,这是一个URI,系统会对服务器的协议和端口做出正确的反应,你可以去http://ink.com发出请求,也可以从ftp://ink.com发起请求,二者得到的结果截然不同。


03

HTTP报文结构分析


HTTP报文结构分为三部分:报文首部,空行和报文主体。
在这里我们重点讲讲报文首部。
首先,报文按发送/接收方的不同分为Request(请求报文)和Response(响应报文)。每个报文的首部又由四种报文头部组成:请求报文头、响应报文头、通用报文头、实体报文头。
请求报文头的结构是:请求+通用+实体
响应报文头的结构是:响应+通用+实体
下面我们来看看报文头具体有哪些以及其具体作用:
  • 通用报文头

    • Cache-Control  控制缓存行为

      • 常见值(Cache-Control:)
      • no-store  所有内容都不缓存
      • no-cache  缓存,但是浏览器使用缓存前,都会请求服务器判断缓存资源是否是最新
      • max-age=x(单位秒)  请求缓存后的x秒不再发起请求
      • s-maxage=x(单位秒)  代理服务器请求源站缓存后的x秒不再发起请求,只对代理服务器(CDN)缓存有效
      • public   客户端和代理服务器(CDN)都可缓存
      • private   只有客户端可以缓存。
    • Connection  逐跳首部、连接的管理

      • Connection:keep-alive  当一个网页打开完成后,客户端和服务器端之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器端上的网页,会继续使用这一条已经建立的连接。

      • Connection:close  代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。

    • Date  创建报文的日期时间

    • Pragma  报文指令

    • Trailer  表文末端的首部一览

    • Transfer-Encoding  指定报文主体的传输编码方式

    • Upgrade  升级为其他协议

    • Via  代理服务器的相关信息

    • Warning  错误通知

  • 请求报文头

    • Accept  用户代理可处理的媒体类型

      • 作用:浏览器端可以接受的媒体类型

      • Accept:text/html  代表浏览器可以接受服务器发挥的类型为text/html,也就是我们常说的HTML文档,如果服务器端无法返回text/html类型的数据,服务器应该返回一个406错误(Non Acceptable)。

      • Accept:*/*  代表浏览器可以处理所有类型

      • 如果想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值);权重值q的范围是0-1 (可精确到小数点后3位) ,且1为最大值。不指定权重值q时,默认权重为q=1.0,当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。

    • Accept-Charset  优先的字符集

    • Accept-Encoding  优先的内容编码

      • 作用:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip, deflate)

    • Accept-Language  优先的语言(自然语言)

      • 作用:浏览器申明自己接收的语言

      • 例如:Accept-Language:zh-cn,zh;q=0.7,en-us,en;q=0.3  即客户端在服务器有中文版资源的情况下,会请求其返回中文版对应的响应,没有中文版,则请求返回英文版响应。

    • Authorization    Web认证信息

    • Expect  期待服务器的特定行为

    • Host  请求资源所在服务器

      • 作用:请求报头域主要用于指定被请求资源的Internet主机和端口号,通常从HUUP URL中提取

    • If-Match  比较实体标记(ETag)

    • If-Modified-Since  比较资源的更新时间

      • 请求头,资源最新修改时间,由浏览器告知服务器,会与Last-Modified进行对比。

    • If-None-Match  比较实体标记(与If-Match相反)

      • 请求头,缓存资源标识,由浏览器告知服务器(其实就是上次服务器发送的Etag),与Etag进行对比。

    • If-Range  资源未更新时发送实体Byte的范围请求

    • If-Unmodified-Since  比较资源的更新时间(与If-Modified-Since相反)

    • Max-Forwards  最大传输逐跳数

    • Proxy-Authorization  代理服务器要求客户端的认证信息

    • Range  实体的字节范围请求

      • 一般形式:Range:(unit = first byte pos) - [last byte pos]

      • Range: bytes=0-499   0-499字节内容

      • Range: bytes=500-999   500-999字节内容

      • Range: bytes=-500   最后500字节内容

      • Range: bytes=500-   从第500字节开始到结尾

      • Range: bytes=500-600,601-999  两个范围字节内容

    • Referer  对请求中URI的原始获取方

    • 当浏览器向web服务器发送请求时们一般会带上Referer,告知服务器我是从哪个页面跳转而来,服务器借此可以获得一些用于处理的信息。

    • TE  传输编码的优先级

    • User-Agent  HTTP客户端程序的信息

      • 作用:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本

      • 很多情况下通过User-Agent来判断浏览器类型,从而进行不同的兼容设计

  • 响应报文头

    • Accept-Ranges  是否接受字节范围请求

    • Age  推算资源创建经过时间

    • ETag  资源的匹配信息

      • 响应头,资源标识,由服务器告知浏览器。

    • Location  令客户端重定向至指定URI

    • Proxy-Authenticate  代理服务器对客户端的认证信息

    • Retry-After  对再次发起请求的时机要求

    • Server  HTTP服务器的安装信息

    • Vary  代理服务器缓存的管理信息

    • WWW-Authenticate  服务器对客户端的认证信息

  • 实体报文头

    • Allow  资源可支持的HTTP方法

    • Content-Encoding  实体主体适用的编码方式

    • Content-Language  实体主体的自然语言

    • Content-Length  实体主体的大小(单位:字节)

    • Content-Location  替代对应资源的URI

    • Content-MDS  实体主体的报文摘要

    • Content-Range  实体主体的位置范围

      • 用于响应头,在发出带有Range的请求后,服务器总会在Content-Range头部返回当前接收的范围和文件总大小。

      • 一般格式:Content-Range:bytes (unit first byte pos) - [last byte pos]/[entry length]

      • 在响应完成后,返回的响应头内容不同:

      • HTTP/1.1 202 OK (不使用断点续传)

      • HTTP/1.1 206 Partial Content  (使用断点续传)

    • Content-Type  实体主体的媒体类型

      • 作用:说明报文体内对象的媒体类型

      • text/html       HTML格式

      • text/plain      纯文本格式

      • text/xml        XML格式

      • image/gif      gif图片格式

      • image/jpeg   jpg图片格式

      • image/png    png图片格式

      • application/xhtml+xml : XHTML格式

      • application/xml : XML数据格式

      • application/atom+xml : Atom XML聚合格式

      • application/json : JSON数据格式

      • application/pdf  pdf格式

      • application/msword : Word文档格式

      • application/octet-stream :二进制流数据(如常见的文件下载)

      • application/x-www-form-urlencoded :表单提交

    • Expires  实体主体过期的日期时间

      • 响应头,代表资源过期时间,由服务器返回提供,是HTTP/1.0的属性,在于max-age共存的情况下,优先级低于max-age。

    • Last-Modified  资源的最后修改日期时间

      • 响应头,资源最新修改时间,由服务器告知浏览器,会与If-Modified-Since进行对比。


04

HTTP协议的请求方法


GET  用来请求访问已被UPI识别的资源,指定的资源经服务器解析后返回响应内容,提交的数据量不会特别大,提交的数据显示在URL中。
POST  功能与GET相似,一般用于传输实体的主体,其主要目的不是获取响应主体的内容,安全性比GET好。
PUT  从客户端向服务器端传送的数据取代指定文档的内容,PUT是幂等的,而POST不是,因此PUT更多地用作传输资源。
HEAD  类似GET,用于获取报文头,测试超链接有效性。
DELETE  用于请求服务器删除指定邮件。
OPTIONS  用于查询针对请求URI指定的资源支持的方法。
TRACE  回显服务器收到的请求,主要用于测试或诊断。
CONNECT  开启一个客户端与所请求的资源之间的双向沟通的通道,可用来创建隧道。

05

HTTP状态码


  • 1XX  表示消息。这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。

  • 2XX  表示成功。这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。

    • 200(OK)  表示请求已经成功,请求所希望的响应头或数据体将随次响应返回。

    • 202(Accepted)  已接受,已经接受请求,但未处理完成。

    • 206(Partial Content)  部分内容,服务器成功处理了部分GET请求。

    • 301(Moved Permanently)  永久移动,请求的资源已经被永久移动到新的URI,返回信息会包括新的URI,浏览器会自动定向新的URI,今后任何新的请求都应使用新的URI代替。

    • 302(Found)  临时移动,与301类似。但资源只是被临时移动。客户端应继续使用原有URI。

  • 4XX  表示请求错误。这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个HEAD请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。

    • 400(Bad Request)  客户端请求的语法错误,服务器无法理解

    • 401(Unauthorized)  请求要求用户的身份认证

    • 403(Forbidden)  服务器理解请求客户端的请求,但是拒绝执行此请求

    • 404(Not Found)  服务器无法根据客户端的请求找到资源(网页)

  • 5XX  表示服务器错误。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。

    • 500(Internal Server Error)  服务器内部错误,无法完成请求

    • 502(Bad Gateway)  充当网关或代理的服务器,从远端服务器接收到了一个无效的请求


06

HTTP状态管理


  • Cookie

    • 本质上是一小段文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就向客户端颁发一个Cookie。

    • 客户端浏览器会把Cookie保存起来,当浏览器再次请求该网站时,浏览器把请求的网址连同Cookie一同提交给服务器。服务器通过检查该Cookie,以辨认用户状态。

  • Session

    • 另一种记录用户状态的机制,保存在服务器上。客户端浏览器访问服务器时,服务器把客户端信息以某种形式记录在服务器上。

    • 客户端浏览器再次访问时只需从该Session中查找该用户的状态。

    • 保存Session ID的方式

      • Cookie

      • URL重写(将Session添加到URL中)

      • 隐藏表单

    • Session的有效期

      • Session超时失效

      • 程序调用HttpSession.invalidate()

      • 服务器进程被停止

  • 二者的区别

    • 存放位置不同,Cookie存储在浏览器端,Session存储在服务器端

    • 安全性(隐私策略)不同

    • 有效期不同

    • 对服务器造成压力不同,Session对于服务器的压力较大


07

HTTP协议的身份认证


  1. BASIC认证(基本认证)

    1. 客户端向服务器端发送请求

    2. 服务器返回状态401,告知需要验证

    3. 用户名和密码以base64加密形式传输到服务器端

    4. 认证成功返回200,反之返回401

    5. (安全性不足)

  2. DIGEST认证(摘要认证)

    1. 客户端向服务器端发送请求

    2. 返回401和临时质询码

    3. 发送摘要和质询码计算而来的响应码

    4. 认证成功返回200,反之返回401

    5. (无法验证用户伪装)

  3. SSL客户端认证

    1. 借由HTTPS的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否来自自己的客户端。

    2. (使用需要一定的成本)

  4. FormBase认证(基于表单认证)

    1. 该方法使用有Web应用程序各自实现基于表单的认证方式,通过Cookie和Session保持用户状态。


08

HTTP长连接与短连接


  • 解释

    • HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP请求结束。

    • HTTP长连接和短连接本质上是TCP长连接和短连接。

    • HTTP/1.0中,默认使用短连接。也就是说,浏览器和服务器每进行一次HTTP操作就建立一次连接,结束即中断。

    • HTTP/1.1起,默认使用长连接,用以保持连接特性。

  • 短连接过程

    • 建立连接——数据传输——关闭连接……建立连接——数据传输——关闭连接

  • 长连接过程

    • 建立连接——数据传输…(保持连接)…数据传输——关闭连接


09

HTTP的中介


  • 代理

    • 对于Web客户端来说,代理扮演服务器角色,接受Request,返回Response

    • 对于Web服务器来说,代理扮演客户端角色,发送Request,接收Response

    • 代理作用:抓包、梯子、匿名访问、过滤器

  • 网关

    • 网关可以作为某种翻译器使用,它抽象出了一种能够达到资源的方法。网关是资源和应用程序之间的粘合剂。

    • 网关扮演一种“协议转换器”角色。

    • Web网关在一侧使用HTTP协议,另一侧使用另一种协议,Web网关分类如下:

      • (HTTP/)服务器端网关:通过HTTP协议与客户端对话,通过其他协议与服务器通信。

      • (/HTTP)客户端网关:通过其他协议与客户端对话,通过HTTP协议与服务器端通信。

      • 常见网关类型

      • (HTTP/*)服务器端Web网关

      • (HTTP/HTTPS)服务器端安全网关

      • (HTTPS/HTTP)客户端安全加速器网关

      • 资源网关


10


HTTP缓存


  • 工作方式

    • Expires

      • 约定文件过期时间

    • Last-Modified与If-Modified-Since

      • 在约定文件过期时间基础上新增校验文件最新修改时间,文件过期后如果文件未被修改无需再次请求,直接使用本地缓存。

      • 时间以秒计算,部分用户容易接收不到新增变化

    • Expires+Last-Modified基础上增加Etag和If-None-Match;Expires不稳定,再加入max-age加以代替

      • 仍然不能主动感知服务器文件变化

  • 缓存改进方案

    • md5/hash缓存

      • 通过不缓存html,为静态文件添加md5或者hash标识,解决浏览器无法跳过缓存过期时间主动感知文件变化的问题。

    • CDN缓存

      • CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使内容就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。

    • 工作方式

      • 第一次请求  服务器将资源传送给CDN和浏览器,两处均有缓存。

      • 后续请求  浏览器向CDN对比文件是否变化。

      • 用户操作对缓存影响如下:(有效指校验方式有效,无效指忽略校验强行向服务器重新请求资源文件)


11

HTTP的内容协商机制


指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。内容协商会以响应资源的语言,字符集,编码方式等作为判断的依据。

协商方式:

  • 客户端驱动

    • 客户端发起请求,服务器发送可选项列表,客户端做出选择后再发送第二次请求。

  • 服务器驱动

    • 服务器检查客户端的请求头部集并决定提供哪个版本的页面。

    • 请求头部集及对应决定的响应头:

      • Accept  告知服务器发送何种媒体类型 ==>  Content-Type

      • Accept-Language  告知服务器发送何种语言 ==> Content-Language

      • Accept-Charset  告知服务器发送何种字符集 ==> Content-Type

      • Accept-Encoding  告知服务器采用何种编码 ==> Content-Encoding

  • 透明协商

    • 某个中间设备(通常是缓存代理)代表客户端进行协商。


12

HTTP协议的断点续传


通过Header里的两个参数实现:请求头Range,响应头Content-Range

过程:

  • 客户端下载一个1024K的文件,521K已下载

  • 网络中断,客户端请求续传,因此需要在HTTP头中声明本次需要续传的片段:Range:bytes=512000-

  • 服务器端接收断点续传请求,从文件512K位置开始传输,并在HTTP请求中增加:Content-Range:bytes 512000-/1024000;此时服务器端返回的HTTP状态码应该是206而不是200




CTF中用到的HTTP协议的内容大部分都在这里,还有一些开发有关的内容再留一个坑吧hhhh,毕竟暂时还用不到那部分知识,有时间的话再来填~
那Web中的基础知识大概就这么多,下一篇给大家讲讲Web前端语言:HTML+CSS+javascript,一个都少不了

    



以上是关于Web基础知识——HTTP协议那点事的主要内容,如果未能解决你的问题,请参考以下文章

CIO:微服务(Microservice)那点事

Linux USB 驱动开发—— 热插拔那点事

前端开发那点事

Web服务器群集——php开发那点事

Spring Boot 二三事:WEB 应用消息推送的那点事

关于java项目与web项目中lib包的那点事