0
点赞
收藏
分享

微信扫一扫

HTTP协议介绍

莞尔小迷糊 2022-04-19 阅读 74

文章目录

1、TCP/IP网络模型

OSI七层网络模型:自下而上分别为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

TCP/IP网络模型分为4层,自下而上分别为:

  • 链路层:
    • 对应OSI的物理层、数据链路层;
    • 处理数据在媒介上的表示、传输以及与硬件交互的细节。
  • 网络层:
    • IP层负责IP数据报的路由转发,所有的TCP、UDP、ICMP和IGMP数据都通过IP数据报传输。
    • 网络层(IP)提供了一种尽力而为、无连接、不可靠的数据报交付服务,IP负责将IP数据报(又叫分组),放入数据链路层传输,负责分片和重组逻辑。
  • 传输层:
    • 为端主机上运行的应用程序提供端到端服务,包括TCP和UDP。
    • TCP提供了带流量控制、拥塞控制、有序、可靠的流交付,TCP需要处理丢包检测重传、重排序等IP层不处理的问题,TCP面向连接,不保留消息边界;
    • 而UDP提供的功能基本上没有超越IP,不提供速率控制和差错控制,不保证可靠性,UDP只是提供一套端口号,用于复用、多路分解(即把收到的UDP数据报交给应用层对应程序处理)和校验数据完整性(只检错不纠错),UDP面向非连接,保留消息边界。
  • 应用层:
    • 对应OSI的会话层、表示层、应用层;
    • 负责处理特定应用的细节,通常应用的实现都是基于TCP/IP或者UDP/IP,具体如HTTP、FTP、DNS、SSH协议等。
    • 应用层与应用细节相关,与网络数据传输无关,而之下的三层(链路层、网络层、传输层)则对应用一无所知,但需要处理通信的细节。

1.1、IP协议

IP是TCP/IP协议族中的核心协议,为传输层提供IP数据报的交付能力,它负责将IP数据报从网络一端传递到另一端,实现数据转发。IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。

发送端:接收来自传输层协议的数据单元(PDU),添加IP首部封装为IP数据报,交给下一层链路层协议。

接收端:接收来自链路层的PDU,去掉IP首部,根据首部的协议类型,将数据分发给上一层传输层的TCP、UDP或者其他协议。

IP主要包含三方面内容:IP编址方案、分组封装格式及分组转发规则。

  • 路由器:

工作于网络层,是IP层的核心设备,实现传输层之下的所有层。路由器有两个或两个以上的网络接口,用于连接两个或多个网络,负责将IP数据报(分组)从一个网络接口转发到另一个网络接口,带有多网络接口(网卡)的主机也能承担转发分组的功能,这种主机称为作为路由器使用的主机。

  • IP协议格式:
    • IP数据报应该是包括
      • IP首部:其前20字节是所有IP分组必须具有的,
        • 4位协议版本号字段:区分IPv4、IPv6;
        • 4位首部长度:表示IP首部长度。最大数值是15 * 4个字节;
        • 8位服务类型:
        • 16位总长度:
        • 16位标识:
        • 3位标志字段:
        • 13位分片偏移:
        • 8位生存时间TTL:
        • 8位协议字段:区分数据报承载TCP、UDP等哪种协议;
        • 16位头部校验和。
        • 32位源IP地址:
        • 32位目的IP地址;
        • 选项字段:最多40字节;
      • 数据负载
        • 不透明的负载(Payload)来自于TCP、UDP或者其他,对于IP层透明,无须解释。
  • IP协议转发流程:仅从网络层分析:
    • A发出目的地址为C的IP数据报,查询路由发现下一跳为E
    • A将数据报发送给E
    • E查询路由表发现下一跳为F,将数据报发送给F
    • F查询路由表发现目的地C直接连接,将数据发送给C

1.2、TCP协议

传输控制协议:提供面向连接、可靠、有序、字节流传输服务。TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

  • 三次握手过程:在正式使用之前,先要检测网络是否通畅,具体过程:

    • 客户端准备建立TCP连接时,向服务端发出连接请求报文段(首部中同步位SYN=1,初始序号seq=x)。这时,客户端TCP进程进入SYN-SENT(同步已发送)状态。
    • 服务端收到连接请求报文段后,如果同意建立连接,则向客户端发送确认报文段(同部位SYN=1,确认位ACK=1,确认号ack=x+1,初始序号seq=y)。这时,TCP服务端进入SYN-RCVD(同步收到)状态。
    • 客户端收到服务端的确认后,还要向服务端发送确认报文段(确认位ACK=1,确认号ack=y+1,序号seq=x+1)。A进入ESTABLISHED(已建立连接)状态。
    • B收到A的确认后,也进入ESTABLISHED状态。

    总结:请求连接则置同步位SYN=1,确认连接就置确认位ACK=1(TCP规定,SYN报文段不能携带数据,但要消耗一个序号;ACK报文段可以携带数据,但如果不携带数据则不消耗序号)。

  • 四次挥手过程:挥手就是断开连接的过程,具体过程:

    • A的应用进程先向B发送连接释放报文段(终止控制位FIN=1,序号seq=u),并停止发送数据,进入FIN-WAIT-1(终止等待1)状态。
    • B收到连接释放报文段后即发出确认报文段(确认位ACK=1,序号seq=v,确认号ack=u+1),然后B进入CLOSE-WAIT(关闭等待)状态。此时A到B方向的连接已经释放,B若要发送数据,A仍要接收。
    • A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
    • B若没有要向A发送的数据了,就发送连接释放报文段(终止位FIN=1,序号seq=w,确认号ack=u+1),然后B就进入LAST-ACK(最后确认)状态,等待A的确认。
    • A收到B的连接释放报文段后,必须对此发出确认(ACK=1,ack=w+1,seq=u+1)。然后进入TIME-WAIT(时间等待)状态。此时,TCP连接还没有释放掉。必须经过2倍最长报文段寿命(MSL)时间后(通常MSL=2分钟,保证A发送的最后一个ACK报文段能够到达B,防止“已失效的连接请求报文段”出现在本连接中),TCP连接结束。

    总结:请求释放连接则置FIN=1,确认释放则置ACK=1。

  • 保活计时器:

    • 客户端主机出现故障时,服务器会白白等待下去。为此需要设置保活计时器。服务器每收到一次客户的数据,就重置计时器,时间通常是两小时。若两小时没有收到客户端的数据,服务器就发送一个探测报文段,以后每隔75秒发送一次。若一连发送9个探测报文段后仍无客户的响应,服务器就认为客户端出现了故障,接着的关闭这个连接。
    • 在 Linux 操作系统层级,也有三个跟 Keep-alive 有关的全局配置项:
      • net.ipv4.tcp_keepalive_time = 7200 seconds (2 hours):间隔时间
      • net.ipv4.tcp_keepalive_probes = 9:探测无响应时,可以发送的最多连续探测次数
      • net.ipv4.tcp_keepalive_intvl = 75 seconds:探测无响应时,连续探测之间的最长间隔

控制位:字段长位8位,每一位从左到右分别位CWR、ECE、URG、ACK、PSH、RST、SYN、FIN;这就控制标识就叫做控制位。
FIN标志:用于断开连接,为1时,表示今后都不会再有数据发送了;
SYN标志:用于建立连接,为1时,表示希望建立连接。
RST标志:为1时,表示TCP连接中出现异常必须强制断开连接。
PSH标志:为 1时,表示传输的数据立刻给上层应用,为0时,不需要立刻传送可以进行缓存。
ACK标志,为1时,表示确认应答的字段为有效,在三次握手时,SYN包之外该位必须为1。
URG标志,为1时,表示时需要紧急处理的数据。
ECE标志,当为1时,表示从对方到这边的网络有拥堵。
CWR标志,与ECE表示都用于IP首部的ECN字段。

2、HTTP协议

2.1、简介

超文本传输协议:Hyper Text Transfer Protocal的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。

  • 所有的万维网文件都必须遵守此标准。
  • 为web浏览器与web服务器之间的通信而设计,但也可以用于其他目的。
  • 基于TCP/IP通信协议传递数据。

HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。

2.2、工作原理

浏览器作为HTTP客户端,通过url发起一个请求时:

  1. 浏览器根据访问的域名找到其IP地址。
    1. DNS查找过程如下:
      1. 浏览器缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存)
      2. 系统缓存:搜索是否存在且是否过期
      3. 路由器缓存
      4. ISP(互联网服务提供商) DNS缓存
    2. 若应用CDN后,DNS 返回的不再是 IP 地址,而是一个CNAME(Canonical Name ) 别名记录,指向CDN的全局负载均衡:
      1. 看用户的 IP 地址,查表得知地理位置,找相对最近的边缘节点;
      2. 看用户所在的运营商网络,找相同网络的边缘节点;
      3. 检查边缘节点的负载情况,找负载较轻的节点;
      4. 其他,比如节点的“健康状况”、服务能力、带宽、响应时间等;
  2. 与web服务器建立TCP套接字连接,发送HTTP请求;
  3. web服务器接收到请求后,向客户端发送响应信息。

当返回内容之后,服务器会检测connection的状态,如果connection的状态是close的话则服务器会主动关闭这个tcp连接,客户端则会被动去关闭这个连接,最终我们释放了整个tcp。

如果connection是keepalive的状态,这个连接就会持续一段时间,在这个时间段内双方就可以保持通信,最后客户端收到的也就是客户端浏览器收到的是一个静态的html的内容,它会自己取解析并且展示给用户。这就是整个http协议工作的整个流程。

  • 无连接:限制每次连接只能处理一个请求,服务器处理客户端请求,并收到客户端应答后,即断开连接。
  • 无状态:协议对于事务处理没有记忆能力;
  • 单向:只能由客户端发起请求,服务端不能主动推送消息。

2.3、协议版本

2.3.1、HTTP/1.0

HTTP/1.0中,一个http请求收到服务器响应后,会断开对应的TCP连接。这样每次请求,都需要重新建立TCP连接,这样一直重复建立和断开的过程,比较耗时。为了充分利用TCP连接,可以设置头字段Connection: keep-alive,这样http请求完成后,就不会断开当前的TCP连接,后续的http请求可以使用当前TCP连接进行通信。

大部分的浏览器对于1.0的支持已经废弃掉了。

2.3.2、HTTP/1.1

主流目前支持的版本号应该是1.1,其将Connection写入了标准,默认值为keep-alive。除非强制设置为Connection: close,才会在请求后断开TCP连接。

基于文本传输,单个TCP连接,在同一时间只能处理一个http请求(虽然存在Pipelining技术支持多个请求同时发送,服务端必须按顺序返回响应;但由于实践中存在很多问题无法解决,所以浏览器默认是关闭,所以可以认为是不支持同时多个请求)。

页面资源请求时,浏览器会同时和服务器建立多个TCP连接,在同一个TCP连接上顺序处理多个HTTP请求。所以浏览器的并发性就体现在可以建立多个TCP连接,来支持多个http同时请求。

  • 缺陷
    • 高延迟 — 队头阻塞(Head-Of-Line Blocking)
      • 当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据。
    • 明文传输 — 不安全性:传输内容没有加密,中途可能被篡改和劫持
    • 不支持服务端推送

2.3.3、Http/2

基于 SPDY,专注于性能,最大的一个目标是在用户和网站间只用一个连接。

传输方式:在同一个域名下开启一个TCP connection,每个http请求以流(stream)的方式在此连接上传输,每个stream是由若干帧(frame) 组成,frame是HTTP/2资源传输的最小单元,frame中的字段identifier标识此帧属于哪一个流,identifier相同的frame属于同一流,服务端将identifier相同的帧解析成可用数据。在这个TCP connection中,同时传输了多个流的帧数据,这就是HTTP/2的多路复用。

每一个帧(frame) 都包含length、type、flags、stream identifier、frame playload等字段, 这里说下帧的type字段,在HTTP/2的标准中定义了10种不同的帧type。

  • HEADERS(包含HTTP头和可选的优先级参数)
  • DATA(流的核心内容)
  • PRIORITY(流的优先级)
  • RST_STREAM(终止流)
  • SETTINGS(设置此连接的参数)
  • PUSH_PROMISE(服务器推送)
  • PING(测量RTT)
  • GOAWAY(终止连接)
  • WINDOW_UPDATE(协商一端要接收多少字节,流量控制)
  • CONTINUATION(继续传输头部数据)

frame的PRIORITY字段用于标识流的权重(1-256)和依赖关系,以正确的顺序请求资源对于用户体验至关重要。

  • 客户端通过对象的依赖关系告诉服务器哪些资源应该优先传输
  • 权重让服务器知道拥有共同依赖关系资源的优先级

服务器根据依赖关系和权重进行带宽分配,高优先级的资源获得更多的带宽。

多路复用让http请求变得廉价,创建一个新流的成本很低,理论上可以同时发起无限个请求,不过我们可以在stream的SETTINGS字段上设置SETTINGS_MAX_CONCURRENT_STREAMS用于限制最大并发数。

  • 二进制分帧:

    • 没有改变 HTTP1 的语义,只是在应用层使用二进制分帧方式传输。因此,也引入了新的通信单位:帧、消息、流
    • 服务器单位时间接收到的请求数变多,可以提高并发数。最重要的是,为多路复用提供了底层支持。
  • 多路复用:

    • 解决了http1.1的线头阻塞问题,一个域名对应一个连接,一个流代表了一个完整的请求-响应过程。是最小的数据单位,每个会标识出该帧属于哪个也就是多个帧组成的数据流。多路复用,就是在一个 TCP 连接中可以存在多个流。
  • 服务端push推送:

    • 当TCP connection建立后,服务器可以主动推送资源而非客户端发起请求,服务端推送是基于frame的PUSH_PROMISE字段来实现的。而且服务端push的资源是可以被缓存的。
    • 浏览器可以通过PUSH_PROMISE字段判断资源是否已经缓存,然后通过发送RST_STREAM帧用于终止推送。在这个过程中,服务端只是推送了资源的地址,并没有直接推送资源的实体,这样的目的也是为了减少不必要的资源传输。
  • 头压缩

    • 在HTTP1.x中,HTTP协议都是由状态行,消息头,主体构成,在传输过程中,主体内容一般都是经过gzip压缩,或者传说的本身就是二进制流(视频,图片)等,而消息头和状态行都是纯文本传输的。
    • 而且很多消息头中的字段冗余如 COOKIE,UserAgent等,浪费了大量带宽,增加了网络延时。很多时候请求消息头的大小甚至超过了主体内容的大小。
    • HTTP/2通过维护静态字典和动态字典的方式来压缩首部
      • 静态字典中包含了常见的头部名称或者头部名称和值的组合,如method:GET;
      • 动态字典中包含了每个请求特有的键值对,如自定义的头信息,针对每个TCP connection,都需要维护一份动态字典;
      • 都不存在的内容,使用了哈夫曼(霍夫曼)编码来压缩体积。

2.3.4、Http/3

HTTP2.0不足:

  • 建立连接时间长(本质上是TCP的问题)
  • 队头阻塞问题(分为TCP层丢包重传机制导致、HTTP层1.x协议的 pipeline导致,2.0解决了后者);
  • 移动互联网领域表现不佳(弱网环境)

HTTP3.0由来:

TCP协议相对缓慢,谷歌决定-基于UDP来开发新一代HTTP协议。

在UDP基础上改造一个具备TCP协议优点的新协议:QUIC协议,Quick UDP Internet Connections的缩写,直译为快速UDP互联网连接。

HTTP3.0又称为HTTP Over QUIC,其弃用TCP协议,改为使用基于UDP协议的QUIC协议来实现。

优劣势:

  • 队头阻塞问题:QUIC协议是基于UDP协议实现的,在一条链接上可以有多个流,流与流之间是互不影响的,当一个流出现丢包影响范围非常小,从而解决。

  • 0RTT 建链:RTT Round-Trip Time,也就是数据包一来一回的时间消耗。

    • HTTPS协议要建立完整链接包括:TCP握手和TLS握手,总计需要至少2-3个RTT,普通的HTTP协议也需要至少1个RTT才可以完成握手。
    • 使用QUIC协议的客户端和服务端 首次连接 要使用1RTT进行密钥交换。非首次连接跳过密钥交换实现0RTT。
  • 连接迁移:

    • TCP协议使用五元组来表示一条唯一的连接,当我们从4G环境切换到wifi环境时,IP地址发生变化,创建新的TCP连接才能继续传输数据。
    • QUIC协议基于UDP实现摒弃了五元组,使用64位的随机数作为连接的ID,并使用该ID表示连接。切换网络时,或者不同基站之间切换都不会重连,从而提高业务层的体验。

但是TCP协议的势力过于强大,很多网络设备甚至对于UDP数据包做了很多不友好的策略,进行拦截从而导致成功连接率下降。

Q:如何用UDP协议来实现TCP协议的主要功能?

A:基于UDP主体将TCP的重要功能转移到用户空间来实现,从而绕开内核实现用户态的TCP协议。

2.3.5、HTTPS

安全版的HTTP,是由TLS+HTTP协议构建的 可进行加密传输、身份认证的网络协议。

HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的TLS加密传输协议。默认端口443。

HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。

SSL(Secure Sockets Layer,安全套接字层)是一种标准安全协议,用于在在线通信中建立Web服务器和浏览器之间的加密链接。SSL 通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。

TLS(Transport Layer Security,传输层安全)是 IETF 在 SSL 3.0 的基础上设计的协议,它是 SSL 协议的升级版。两者差别极小,可以理解为 TLS 是 SSL 3.1。分成两层:TLS 记录协议(TLS record protocol)、TLS 握手协议(TLS handshake protocol)

2.4、协议详解

2.4.1、请求信息

  • 请求行:例如GET /images/logo.gif HTTP/1.1(请求方法 空格 url 协议);

    • 它主要支持的请求方法有get、post、put、head、delete、options、trace和connect。
      • get:获取资源;
      • post:传输一些内容;职能偏向于“新增”;
      • put则:将文件和内容传输到服务器上;职能更偏向于“更新”(幂等);
      • head:只通过报文的头部来做通信;
      • delete:删除文件(幂等);
      • options:向服务器去请求了解服务器支持哪些方法;
      • trace:调试方法,使服务器原样返回客户端请求的任何内容,主要用于测试或诊断。
      • connect:希望通过哪些隧道协议来连接。
    • GET和POST的区别:
      • GET提交的数据会放在URL之后,POST方法是把提交的数据放在HTTP包的Body中。
      • GET提交的数据大小有限制,最多只能有1024字节(url限制),POST方法提交的数据没有限制;
      • 获取方式不同,GET方法Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
      • GET方式提交数据,会带来安全问题,出现在URL上,可以从历史记录获得该用户的数据。
  • 请求头:例如Accept-Language: en;

    • Host :请求的资源在哪个主机的端口上
    • Connection:该请求支持长连接(heep_alive)
    • Content-Length:正文内容长度
    • Content-Type:数据类型
    • User-Agent:声明用户的操作系统和浏览器版本信息
    • Accent:发起了请求
    • Referer:当前页面是从哪个页面跳转过来的
    • Accept-Encoding:接受的编码
    • Accept-Language:接受的语言类型
    • Cookie:用于在客户端存储少量信息,通常用于实现会话(session)功能
    • Authorization:含有服务器用于验证用户代理身份的凭证。
    • Range:bytes=500-600,601-999;bytes=-500;bytes=500-;bytes=0-0,-1(但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK))
  • 空行

  • 请求体(可选)

2.4.2、响应信息

  • 状态行:HTTP-Version 空格 Status-Code 空格 Reason-Phrase CRLF

    • Code是结果代码,用三个数字表示,主要分为五类:

      • 以1开头的往往表示请求正在处理过程中;

        • 100——客户必须继续发出请求
        • 101——客户要求服务器根据请求转换HTTP协议版本
      • 以2开头的则表示请求已经成功得到了处理;

        • 200——表明该请求被成功地完成,所请求的资源发送回客户端
        • 201——提示知道新文件的URL
        • 202——接受和处理、但处理未完成
        • 203——返回信息不确定或不完整
        • 204——请求收到,但返回信息为空
        • 205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
        • 206——服务器已经完成了部分用户的GET请求
      • 以3开头表示资源需要进一步的操作,并且往往表示一种重定向连接;

        • 300——请求的资源可在多处得到
        • 301——本网页被永久性转移到另一个URL
        • 302——请求的网页被转移到一个新的地址,但客户访问仍继续通过原始URL地址,重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。
        • 303——建议客户访问其他URL或访问方式
        • 304——自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容,代表上次的文档已经被缓存了,还可以继续使用
        • 305——请求的资源必须从服务器指定的地址得到
        • 306——前一版本HTTP中使用的代码,现行版本中不再使用
        • 307——申明请求的资源临时性删除
      • 以4开头表示这个服务器无法处理这个请求;

      • 400——客户端请求有语法错误,不能被服务器所理解

        401——请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用

        HTTP 401.1 - 未授权:登录失败

        HTTP 401.2 - 未授权:服务器配置问题导致登录失败

        HTTP 401.3 - ACL 禁止访问资源

        HTTP 401.4 - 未授权:授权被筛选器拒绝

        HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败

        402——保留有效ChargeTo头响应

        403——禁止访问,服务器收到请求,但是拒绝提供服务

        HTTP 403.1 禁止访问:禁止可执行访问

        HTTP 403.2 - 禁止访问:禁止读访问

        HTTP 403.3 - 禁止访问:禁止写访问

        HTTP 403.4 - 禁止访问:要求 SSL

        HTTP 403.5 - 禁止访问:要求 SSL 128

        HTTP 403.6 - 禁止访问:IP 地址被拒绝

        HTTP 403.7 - 禁止访问:要求客户证书

        HTTP 403.8 - 禁止访问:禁止站点访问

        HTTP 403.9 - 禁止访问:连接的用户过多

        HTTP 403.10 - 禁止访问:配置无效

        HTTP 403.11 - 禁止访问:密码更改

        HTTP 403.12 - 禁止访问:映射器拒绝访问

        HTTP 403.13 - 禁止访问:客户证书已被吊销

        HTTP 403.15 - 禁止访问:客户访问许可过多

        HTTP 403.16 - 禁止访问:客户证书不可信或者无效

        HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效

        404——一个404错误表明可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。eg:输入了错误的URL

        405——用户在Request-Line字段定义的方法不允许

        406——根据用户发送的Accept拖,请求资源不可访问

        407——类似401,用户必须首先在代理服务器上得到授权

        408——客户端没有在用户指定的饿时间内完成请求

        409——对当前资源状态,请求不能完成

        410——服务器上不再有此资源且无进一步的参考地址

        411——服务器拒绝用户定义的Content-Length属性请求

        412——一个或多个请求头字段在当前请求中错误

        413——请求的资源大于服务器允许的大小

        414——请求的资源URL长于服务器允许的长度

        415——请求资源不支持请求项目格式

        416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段

        417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。

      • 以5开头则表示服务器处理这个请求,但是却发生了某些内部错误。

      • HTTP 500 - 服务器遇到错误,无法完成请求

        HTTP 500.100 - 内部服务器错误 - ASP 错误

        HTTP 500-11 服务器关闭

        HTTP 500-12 应用程序重新启动

        HTTP 500-13 - 服务器太忙

        HTTP 500-14 - 应用程序无效

        HTTP 500-15 - 不允许请求 global.asa

        Error 501 - 未实现

        HTTP 502 - 网关错误

        HTTP 503:由于超载或停机维护,服务器目前无法使用,一段时间后可能恢复正常

    • Reason-Phrase是个简单的文本描述,解释Status-Code,用于人工理解。

  • 消息报头

    • Allow
    • Content-Encoding
    • Content-Length
    • Content-Type
    • Date
    • Expires
    • Last-Modified
    • Location
    • Refresh
    • Server
    • Set-Cookie
    • WWW-Authenticate
  • 空行

  • 响应体

2.4.3 content-type

用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件

常见的媒体格式类型如下:

  • text/html : HTML格式
  • text/plain :纯文本格式
  • text/xml : XML格式
  • image/gif :gif图片格式
  • image/jpeg :jpg图片格式
  • image/png:png图片格式

以application开头的媒体格式类型:

  • 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 : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:

  • multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

2.5、认证方式

HTTP请求报头: Authorization

HTTP响应:状态行:401 Unauthorized; 报头:WWW-Authenticate: Basic realm=“WallyWorld”;

HTTP认证是基于质询/回应(challenge/response)的认证模式。

  • 基本认证 basic authentication(HTTP1.0提出的认证方法)

把 "用户名+冒号+密码"用BASE64算法加密后的字符串放在http request 中的header Authorization中发送给服务端。Authorization: Basic xxxxxxxxxx.

客户端发起GET请求

服务器响应401 Unauthorized,www-Authenticate指定认证算法,realm指定安全域

客户端重新发起请求,Authorization指定用户名和密码信息

服务器认证成功,响应200

  • 摘要认证 digest authentication(HTTP1.1提出的基本认证的替代方法)

摘要认证使用随机数+MD5加密哈希函数来对用户名、密码进行加密,在上述第二步时服务器返回随机字符串nonnce,之后客户端发送摘要=MD5(HA1:nonce:HA2),其中HA1=MD5(username:realm:password),HA2=MD5(method:digestURI)

HTTP OAuth Authentication
开放认证允许用户提供一个令牌,而不是用户名和密码来访问它们存放在特定服务者的数据,每一个令牌授权一个特定的第三方系统

HTTP Token Authentication
令牌认证是指当用户第一次登陆时服务器生成一个token并返回给客户端,之后的每次访问客户端都会带上该token,无需再次带上用户名和密码

举报

相关推荐

0 条评论