http_https - CSDN
http 订阅
http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使得开发和部署是那么的直截了当。 [1] 展开全文
http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使得开发和部署是那么的直截了当。 [1]
信息
外文名
HTTP
适用浏览器
Firefox、Google chrome等
作    用
规定WWW服务器与浏览器之间信息传递规范
中文名
超文本传输协议
工作层
应用层
基    础
架构在TCP协议上
http简介
万维网WWW(world wide web)发源于欧洲日内瓦量子物理实验室CERN,正是WWW技术的出现使得因特网得以超乎想象的速度迅猛发展。这项基于TCP/IP的技术在短短的十年时间内迅速成为已经发展了几十年的Internet上的规模最大的信息系统,它的成功归结于它的简单、实用。在WWW的背后有一系列的协议和标准支持它完成如此宏大的工作,这就是Web协议族,其中就包括HTTP超文本传输协议。 在1990年,HTTP就成为WWW的支撑协议。当时由其创始人WWW之父蒂姆·贝纳斯·李(TimBerners—Lee)提出,随后WWW联盟(WWW Consortium)成立,组织了IETF(Internet Engineering Task Force)小组进一步完善和发布HTTP协议。 [2]  HTTP是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。HTTP是一种协议规范,这种规范记录在文档上,为真正通过HTTP协议进行通信的HTTP的实现程序。HTTP协议是基于C/S架构进行通信的,而HTTP协议的服务器端实现程序有httpd、nginx等,其客户端的实现程序主要是Web浏览器,例如Firefox、InternetExplorer、Google chrome、Safari、Opera等,此外,客户端的命令行工具还有elink、curl等。Web服务是基于TCP的,因此为了能够随时响应客户端的请求,Web服务器需要监听在80/TCP端口。这客户端浏览器和Web服务器之间就可以通过HTTP协议进行通信了。 [3] 
收起全文
精华内容
参与话题
  • HTTP和HTTPS协议,看一篇就够了

    万次阅读 多人点赞 2019-08-03 11:22:16
    为什么需要但是为什么要讲HTTP和HTTPS呢? 二、HTTP和HTTPS发展历史 当我们打开谷歌浏览器输入www.12306.cn,回车很快在浏览器上就看到页面,其中的浏览器就是客户端,负责接受浏览器的是服务器,两者的通信是...

    一、前言:

    这里写图片描述
    这里写图片描述
    先来观察这两张图,第一张访问域名http://www.12306.cn,谷歌浏览器提示不安全链接,第二张是https://kyfw.12306.cn/otn/regist/init,浏览器显示安全,为什么会这样子呢?2017年1月发布的Chrome 56浏览器开始把收集密码或信用卡数据的HTTP页面标记为“不安全”,若用户使用2017年10月推出的Chrome 62,带有输入数据的HTTP页面和所有以无痕模式浏览的HTTP页面都会被标记为“不安全”,此外,苹果公司强制所有iOS App在2017年1月1日前使用HTTPS加密。

    二、HTTP和HTTPS发展历史

    什么是HTTP?

    超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。

    发展历史:

    版本 产生时间 内容 发展现状
    HTTP/0.9 1991年 不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求 没有作为正式的标准
    HTTP/1.0 1996年 传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令 正式作为标准
    HTTP/1.1 1997年 持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码 2015年前使用最广泛
    HTTP/2 2015年 多路复用、服务器推送、头信息压缩、二进制协议等 逐渐覆盖市场

    这里写图片描述
    这个Akamai公司建立的一个官方的演示,使用HTTP/1.1和HTTP/2同时请求379张图片,观察请求的时间,明显看出HTTP/2性能占优势。
    这里写图片描述
    多路复用:通过单一的HTTP/2连接请求发起多重的请求-响应消息,多个请求stream共享一个TCP连接,实现多留并行而不是依赖建立多个TCP连接。

    HTTP报文格式

    在这里插入图片描述

    什么是HTTPS?

    《图解HTTP》这本书中曾提过HTTPS是身披SSL外壳的HTTP。HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

    PS:TLS是传输层加密协议,前身是SSL协议,由网景公司1995年发布,有时候两者不区分。

    参考连接:

    1.https://kamranahmed.info/blog/2016/08/13/http-in-depth/

    2.https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

    3.https://tools.ietf.org/html/rfc1945

    4.https://http2.github.io/http2-spec/

    5.https://www.zhihu.com/question/34074946

    三、HTTP VS HTTPS

    HTTP特点:
    1. 无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作
    2. 无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
    3. 基于请求和响应:基本的特性,由客户端发起请求,服务端响应
    4. 简单快速、灵活
    5. 通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性

    下面通过一个简单的抓包实验观察使用HTTP请求传输的数据:
    这里写图片描述

    这里写图片描述

    结果分析:HTTP协议传输数据以明文形式显示
    针对无状态的一些解决策略:
    场景:逛电商商场用户需要使用的时间比较长,需要对用户一段时间的HTTP通信状态进行保存,比如执行一次登陆操作,在30分钟内所有的请求都不需要再次登陆。
    1. 通过Cookie/Session技术
    2. HTTP/1.1持久连接(HTTP keep-alive)方法,只要任意一端没有明确提出断开连接,则保持TCP连接状态,在请求首部字段中的Connection: keep-alive即为表明使用了持久连接

    HTTPS特点:

    基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护

    这里写图片描述
    通过抓包可以看到数据不是明文传输,而且HTTPS有如下特点:

    1. 内容加密:采用混合加密技术,中间者无法直接查看明文内容
    2. 验证身份:通过证书认证客户端访问的是自己的服务器
    3. 保护数据完整性:防止传输的内容被中间人冒充或者篡改

    **混合加密:**结合非对称加密和对称加密技术。客户端使用对称加密生成密钥对传输数据进行加密,然后使用非对称加密的公钥再对秘钥进行加密,所以网络上传输的数据是被秘钥加密的密文和用公钥加密后的秘密秘钥,因此即使被黑客截取,由于没有私钥,无法获取到加密明文的秘钥,便无法获取到明文数据。


    **数字摘要:**通过单向hash函数对原文进行哈希,将需加密的明文“摘要”成一串固定长度(如128bit)的密文,不同的明文摘要成的密文其结果总是不相同,同样的明文其摘要必定一致,并且即使知道了摘要也不能反推出明文。


    **数字签名技术:**数字签名建立在公钥加密体制基础上,是公钥加密技术的另一类应用。它把公钥加密技术和数字摘要结合起来,形成了实用的数字签名技术。

    • 收方能够证实发送方的真实身份;
    • 发送方事后不能否认所发送过的报文;
    • 收方或非法者不能伪造、篡改报文。

    内容加密和数据完整性保护

    非对称加密过程需要用到公钥进行加密,那么公钥从何而来?其实公钥就被包含在数字证书中,数字证书通常来说是由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,证书中包含了一个密钥对(公钥和私钥)和所有者识别信息。数字证书被放到服务端,具有服务器身份验证和数据传输加密功能。

    四、HTTP通信传输

    这里写图片描述

    客户端输入URL回车,DNS解析域名得到服务器的IP地址,服务器在80端口监听客户端请求,端口通过TCP/IP协议(可以通过Socket实现)建立连接。HTTP属于TCP/IP模型中的运用层协议,所以通信的过程其实是对应数据的入栈和出栈。
    这里写图片描述
    报文从运用层传送到运输层,运输层通过TCP三次握手和服务器建立连接,四次挥手释放连接。

    这里写图片描述

    为什么需要三次握手呢?为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

    比如:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段,但是server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求,于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了,由于client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据,但server却以为新的运输连接已经建立,并一直等待client发来数据。所以没有采用“三次握手”,这种情况下server的很多资源就白白浪费掉了。

    这里写图片描述

    为什么需要四次挥手呢?TCP是全双工模式,当client发出FIN报文段时,只是表示client已经没有数据要发送了,client告诉server,它的数据已经全部发送完毕了;但是,这个时候client还是可以接受来server的数据;当server返回ACK报文段时,表示它已经知道client没有数据发送了,但是server还是可以发送数据到client的;当server也发送了FIN报文段时,这个时候就表示server也没有数据要发送了,就会告诉client,我也没有数据要发送了,如果收到client确认报文段,之后彼此就会愉快的中断这次TCP连接。

    五、HTTPS实现原理

    SSL建立连接过程
    在这里插入图片描述

    1. client向server发送请求https://baidu.com,然后连接到server的443端口,发送的信息主要是随机值1和客户端支持的加密算法。
    2. server接收到信息之后给予client响应握手信息,包括随机值2和匹配好的协商加密算法,这个加密算法一定是client发送给server加密算法的子集。
    3. 随即server给client发送第二个响应报文是数字证书。服务端必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。传送证书,这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间、服务端的公钥,第三方证书认证机构(CA)的签名,服务端的域名信息等内容。
    4. 客户端解析证书,这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值(预主秘钥)。
    5. 客户端认证证书通过之后,接下来是通过随机值1、随机值2和预主秘钥组装会话秘钥。然后通过证书的公钥加密会话秘钥。
    6. 传送加密信息,这部分传送的是用证书加密后的会话秘钥,目的就是让服务端使用秘钥解密得到随机值1、随机值2和预主秘钥。
    7. 服务端解密得到随机值1、随机值2和预主秘钥,然后组装会话秘钥,跟客户端会话秘钥相同。
    8. 客户端通过会话秘钥加密一条消息发送给服务端,主要验证服务端是否正常接受客户端加密的消息。
    9. 同样服务端也会通过会话秘钥加密一条消息回传给客户端,如果客户端能够正常接受的话表明SSL层连接建立完成了。

    问题:
    1.怎么保证保证服务器给客户端下发的公钥是真正的公钥,而不是中间人伪造的公钥呢?

    这里写图片描述
    2.证书如何安全传输,被掉包了怎么办?
    身份认证

    数字证书内容
    包括了加密后服务器的公钥、权威机构的信息、服务器域名,还有经过CA私钥签名之后的证书内容(经过先通过Hash函数计算得到证书数字摘要,然后用权威机构私钥加密数字摘要得到数字签名),签名计算方法以及证书对应的域名。

    验证证书安全性过程

    1. 当客户端收到这个证书之后,使用本地配置的权威机构的公钥对证书进行解密得到服务端的公钥和证书的数字签名,数字签名经过CA公钥解密得到证书信息摘要。
    2. 然后证书签名的方法计算一下当前证书的信息摘要,与收到的信息摘要作对比,如果一样,表示证书一定是服务器下发的,没有被中间人篡改过。因为中间人虽然有权威机构的公钥,能够解析证书内容并篡改,但是篡改完成之后中间人需要将证书重新加密,但是中间人没有权威机构的私钥,无法加密,强行加密只会导致客户端无法解密,如果中间人强行乱修改证书,就会导致证书内容和证书签名不匹配。

    那第三方攻击者能否让自己的证书显示出来的信息也是服务端呢?(伪装服务端一样的配置)显然这个是不行的,因为当第三方攻击者去CA那边寻求认证的时候CA会要求其提供例如域名的whois信息、域名管理邮箱等证明你是服务端域名的拥有者,而第三方攻击者是无法提供这些信息所以他就是无法骗CA他拥有属于服务端的域名。

    六、运用与总结

    安全性考虑:
    1. HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用
    2. SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行

    中间人攻击(MITM攻击)是指,黑客拦截并篡改网络中的通信数据。又分为被动MITM和主动MITM,被动MITM只窃取通信数据而不修改,而主动MITM不但能窃取数据,还会篡改通信数据。最常见的中间人攻击常常发生在公共wifi或者公共路由上。

    成本考虑:
    1. SSL证书需要购买申请,功能越强大的证书费用越高
    2. SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗(SSL有扩展可以部分解决这个问题,但是比较麻烦,而且要求浏览器、操作系统支持,Windows XP就不支持这个扩展,考虑到XP的装机量,这个特性几乎没用)。
    3. 根据ACM CoNEXT数据显示,使用HTTPS协议会使页面的加载时间延长近50%,增加10%到20%的耗电。
    4. HTTPS连接缓存不如HTTP高效,流量成本高。
    5. HTTPS连接服务器端资源占用高很多,支持访客多的网站需要投入更大的成本。
    6. HTTPS协议握手阶段比较费时,对网站的响应速度有影响,影响用户体验。比较好的方式是采用分而治之,类似12306网站的主页使用HTTP协议,有关于用户信息等方面使用HTTPS。

    最后插播下广告,对IOS感兴趣的或者校招同学可以看这两篇文章-:
    看一篇就够入门Objective-C
    手把手教学IOS自定义cell-仿微信消息列表
    面试必备操作系统

    展开全文
  • HTTP协议——HTTP概述

    千次阅读 2018-06-06 15:31:01
    HTTP协议基础》这些博文是我记录自己学习过程中的一些笔记,参考书籍为《图解HTTP》一、Web页面生成原理 当我们在浏览器的地址栏中输入网址,然后点击回车,接着,浏览器就会呈现出我们需要的web界面,那么,这个...

    《HTTP协议》这一系列博文是我记录自己学习过程中的一些笔记,参考书籍为《HTTP权威指南》和《图解HTTP》

    一、Web页面生成原理

            当我们在浏览器的地址栏中输入网址,然后点击回车,接着,浏览器就会呈现出我们需要的web界面,那么,这个界面是怎么产生的?web的界面是根据我们输入的URL(网址、地址),浏览器从服务器端获取对应的文件资源等信息,然后显示在浏览器上面。像这种通过发送请求获取服务器资源的web浏览器等,都可以称之为客户端(client)。

                       

            Web 使用一种名为 HTTP(HyperText Transfer Protocol)的协议作为规范,完成从客户端到服务器端等一系列运作流程。而协议是指规则的约定。可以说,Web 是建立在 HTTP 协议上通信的。

            HTTP使用的是可靠的数据传输协议,因此即使数据来自地球的另一端,它也能确保数据在传输的过程中不会被损坏或产生混乱,用户在访问信息的时候不用担心其完整性。


    二、Web资源

    1、MIME类型

            网络上有着数千种不同的数据类型,HTTP仔细地给每种要通过Web传输的对象都打上了名为MIME类型的数据格式标签。
            MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
            MIME类型是一种文本标记,表示一种主要的对象类型和一个特殊的子类型,中间由一条斜杠分隔。例如:HTML格式的文本文档是text/html,GIF格式的图片是image/gif
            当Web浏览器从服务器中取回一个对象时,会去查看相关的MIME类型,看看是否知道如何处理这个对象,大多数浏览器都可以处理数百种常见的对象类型,或者运行外部插件软件来处理特殊格式的数据。

            常用Mime类型:

    文件后缀

    Mime类型

    说明

    .flv

    flv/flv-flash 

    在线播放

    .html或.htm 

    text/html 

    超文本标记语言文本

    .rtf 

    application/rtf

    RTF文本

    .gif 

    image/gif

    GIF图形

    .jpeg或.jpg 

    image/jpeg

    JPEG图形

    .au

    audio/basic 

    au声音文件

    .mid或.midi

    audio/midi或audio/x-midi

    MIDI音乐文件

    .ra或.ram或.rm 

    audio/x-pn-realaudio

    RealAudio音乐文件

    .mpg或.mpeg或.mp3 

    video/mpeg

    MPEG文件

    .avi 

    video/x-msvideo

    AVI文件

    .gz

    application/x-gzip

    GZIP文件

    .tar

    application/x-tar 

    TAR文件

    .exe 

    application/octet-stream

    下载文件类型

    .rmvb 

    video/vnd.rn-realvideo 

    在线播放

    .txt 

    text/plain

    普通文本

    .mrp 

    application/octet-stream 

    MRP文件(国内普遍的手机)

    .ipa

    application/iphone-package-archive

    IPA文件(IPHONE)

    .deb 

    application/x-debian-package-archive

    DED文件(IPHONE)

    .apk

    application/vnd.android.package-archive 

    APK文件(安卓系统)

    .cab

    application/vnd.cab-com-archive 

    CAB文件(Windows Mobile)

    .xap

    application/x-silverlight-app 

    XAP文件(Windows Phone 7)

    .sis

    application/vnd.symbian.install-archive

    SIS文件(symbian平台)

    .jar 

    application/java-archive

    JAR文件(JAVA平台手机通用格式)

    .jad

    text/vnd.sun.j2me.app-descriptor

    JAD文件(JAVA平台手机通用格式)

    .sisx 

    application/vnd.symbian.epoc/x-sisx-app 

    SISX文件(symbian平台)

    2、URI

            URI(Uniform Resource Identifier,统一资源标识符)是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对网络中(一般指万维网)的资源通过特定的协议进行交互操作。

            URI的格式如下:

            使用 http: 或 https: 等协议方案名获取访问资源时要指定协议类型。不区分字母大小写,最后附一个冒号(:),也可使用 data: 或 javascript: 这类指定数据或脚本程序的方案名。
    登录信息(认证)
            指定用户名和密码作为从服务器端获取资源时必要的登录信息(身份认证)。此项是可选项。
    服务器地址
            使用绝对 URI 必须指定待访问的服务器地址。地址可以是类似hackr.jp 这种 DNS 可解析的名称,或是 192.168.1.1 这类 IPv4 地址名,还可以是 [0:0:0:0:0:0:0:1] 这样用方括号括起来的 IPv6 地址名。
    服务器端口号
            指定服务器连接的网络端口号。此项也是可选项,若用户省略则自动使用默认端口号。
    带层次的文件路径
            指定服务器上的文件路径来定位特指的资源。这与 UNIX 系统的文件目录结构相似。
    查询字符串
            针对已指定的文件路径内的资源,可以使用查询字符串传入任意参数。此项可选。
    片段标识符

            使用片段标识符通常可标记出已获取资源中的子资源(文档内的某个位置)。但在 RFC 中并没有明确规定其使用方法。该项也为可选项。

            URI 可以进一步划分为定位符(URL),名称(URN)或两者兼备。URL 和 URN 都是 URI 子集。URN 如同一个人的名称,而 URL 代表一个人的住址。换言之,URN 定义某事物的身份,而 URL 提供查找该事物的方法。

    3、URL

            URL(Uniform Resource Locator,统一资源定位符),最常见的形式是 URI,经常指定为非正式的网址。

           URL 是一种 URI,它标识一个互联网资源,并指定对其进行操作或获取该资源的方法。可能通过对主要访问手段的描述,也可能通过网络“位置”进行标识。例如,http://www.waylau.com 这个 URL,标识一个特定资源(首页)并表示该资源的某种形式(例如以编码字符表示的,首页的 HTML 代码)是可以通过 HTTP 协议从www.waylau.com 这个网络主机获得的。

            大部分URL遵循一种标准格式,该格式包含三个部分:
            第一部分:方案;说明了访问资源所使用的协议类型,通常为http协议:hhtp://
            第二部分:地址;比如:www.baidu.com
            第三部分:指定服务器上某个资源,比如:specisal/saw-blade.gif

           现在几乎所有的URI都是URL了。

    4、URN

           URN(Uniform Resource Name,统一资源名称),是URI的第二种形式,其目的是通过提供一种途径,用于在特定的命名空间资源的标识,以补充网址。

            URN 是基于某命名空间通过名称指定资源的URI。URN是作为特定内容的唯一名称使用的,与目前的资源所在地无关。使用这些与位置无关的URN,就可以将资源四处搬移。通过URN,还可以用同一个名字通过多种网络访问协议来访问资源。人们可以通过 URN 来指出某个资源,而无需指出其位置和获得方式。资源无需是基于互联网的。例如,URN urn:isbn:0-395-36341-1 指定标识系统(即国际标准书号ISBN)和某资源在该系统中的唯一表示的 URI。它可以允许人们在不指出其位置和获得方式的情况下谈论这本书。

    三、HTTP事务

            一个HTTP事务是由一条请求命令和一个响应结果组成的。这种通信时通过http报文(HTTP message)的格式化数据块进行的。事务也可以理解为从客户端到服务器再到客户端,一次完整通信的过程。

    1、HTTP方法

            HTTP的不同的请求命令被称为HTTP方法。每条HTTP请求报文都包含一个方法。这个方法会告诉服务器执行什么动作。例如post,get等。

            具体的方法后面详细介绍。

    2、状态码

            每条HTTP响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告诉客户端请求是否成功,或者是否需要进行其他的动作。例如404,,500,200等。

            具体的状态码后面详细介绍。

    3、一个web界面中可以包含多个对象

            应用程序完成一项任务时通常会发布多个事务。一个“Web页面”通常不是单个资源,而是一组资源的集合。

    四、报文

            HTTP报文是由一行一行的简单字符组成的,是由纯文本组成,不是二进制代码,所以方便人们进行读写。
            请求报文(request message):从客户端发往服务器
            响应报文(response message):从服务器发往客户端
            http报文包括以下三个部分:
            起始行:报文第一行,在请求报文里用来说明要做什么,在响应报文里说明出现了什么情况
            首部字段:位于起始行后面,有零个或者多个,每个首部字段都包含一个名字和一个值,便于解析,两者之间用冒号(:)隔开,首部之间以一个空行结束。
            主体:空行之后就是可选的报文主题。其中包含了所有类型的数据。请求主体中包括了要发送给Web服务器的数据,响应主体找那个装载了要返回给客户端的数据。主体中可以包含任何二进制数据,也可以包含文本。
            具体的报文内容在后面详细介绍。

    五、连接

    1、TCP/IP

            http协议是位于整个数据传输通信的最上层应用层协议,不关注细节,负责通信细节的协议为传输层控制协议(Transmission Control Protocl,TCP)
            TCP特点:1)无差错的数据传输
                            2)按序传输(按照数据发送顺序到达服务器)
                            3)未分段的数据流(任意时刻任何大小将数据发出去)

            英特网是全世界计算机和网络设备最常用的层次化分组交换网络协议集,其隐藏了网络和硬件的特点和弱点,使各类型的计算机和网络都能进行可靠的通信。

            关于TCP/IP的基础介绍,请参考https://blog.csdn.net/vikeyyyy/article/details/80568255

    2、连接、IP地址及端口号

            HTTP客户端向服务器发送报文之前,需要用忘记协议(IP)地址和端口号在客户端和服务器之间建立一条TCP/IP连接。而IP和端口则是通过URL来获取。
            http://207.200.83.29:80/index.html  这个URL使用了机器的IP地址207.200.83.29,以及端口号80
            http://www.netscape.com:80/index.html 这个URL使用了文本形式的域名(主机名:IP地址比较人性化的别称)。通过域名服务(Domain Name Service,DNS)机制对主机名进行转换。
            http://www.netscape.com/index.html  这种情况一般默认端口号为80

            下图为浏览器通过http显示服务器中某个简单HTML资源的流程导图


    步骤如下:
    1)浏览器从URL中解析出服务器主机名;
    2)浏览器将主机名转换为服务器的IP地址;
    3)浏览器将端口号(如果有)从URL中解析出来;
    4)浏览器建立一条与服务器的连接TCP连接通道;
    5)浏览器向服务器发送一条http请求报文;
    6)服务器向浏览器发送一条http响应报文;
    7)结束通信,关闭连接,浏览器显示具体资源;

    六、Web结构组件

            web的应用程序,除了浏览器和服务器之外,还有其他几个很重要的组件(简单介绍一下,后面详细介绍)

    1、代理

            HTTP代理服务器是Web安全、应用集成以及性能优化的重要组成模块。


    2、缓存

            Web缓存(Web Cache)或代理缓存(proxy cache)是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一个文档的客户端就可以共用这个副本提供的服务。
            客户端从缓存下载文件户会比从远程服务器快很多。HTTP定义了很多功能,使得缓存更加高效,并规范了文档的新鲜度和缓存内容的隐私性。

    3、网关

            网关是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将HTTP流量转换成其他的协议,接受请求时就好像自己是资源的源服务器。

    4、隧道

            隧道是会在两条连接之间对原始数据进行盲转发的HTTP应用程序。
            HTTP隧道通常用来在一条或多条HTTP连接上转发非HTTP数据,转发时不会窥探数据。

            常见用途是通过HTTP连接承载加密的安全套接字层(SSL)流量,这样SSL流量就可以穿过只允许Web流量通过的防火墙。

    5、Agent代理

            用户Agent代理是代表用户发起HTTP请求的客户端程序。所有发布Web请求的应用程序都是HTTP Agent代理,如Web浏览器。

    展开全文
  • 一文搞懂HTTP协议(带图文)

    千次阅读 多人点赞 2020-05-31 21:25:03
    网络是由若干节点和连接这些节点的链路构成,然后网络与网络之间所串连成的庞大网络叫做互联网,而我们今天要讲的HTTP(HyperText Transfer Protocol 超文本传输协议)是互联网上应用最为广泛的一种网络协议,它是由...

    网络是由若干节点和连接这些节点的链路构成,然后网络与网络之间所串连成的庞大网络叫做互联网,而我们今天要讲的HTTP(HyperText Transfer Protocol 超文本传输协议)是互联网上应用最为广泛的一种网络协议,它是由万维网协会(World Wide Web Consortium)制定发布。
    在这里插入图片描述

    一、简介

    HTTP 协议一共有五大特点:

    1.支持客户/服务器模式。
    2.简单快速:
    客户向服务器请求服务时,只需传送请求方法和路径。
    3.灵活:
    HTTP允许传输任意类型的数据对象。
    正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
    4.无连接:
    无连接的含义是限制每次连接只处理一个请求。
    服务器处理完客户的请求,并收到客户的应答后,即断开连接。
    采用这种方式可以节省传输时间。
    5.无状态:
    无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。
    即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息(Cookie和Session孕育而生)。

    二、TCP/IP协议

    HTTP是一个基于TCP/IP协议簇来传递数据,包含四层模型。
    在这里插入图片描述
    从上图我们可以清晰的看到HTTP使用的传输层协议为TCP协议,而网络层使用的是IP协议(当然还使用了很多其他协议),所以说HTTP是一个基于TCP/IP协议簇来传递数据。
    那TCP/IP协议簇大致是如何工作的,我们再来看看下图:
    在这里插入图片描述
    我们可以看到在数据发送端是一层一层封装数据,数据接收端一层一层拆封,最后应用层获得数据。

    三、建立TCP连接

    我们知道了TCP/IP协议簇大致的工作原理之后,我们来看看HTTP是如何建立连接的。

    1.TCP包头信息

    前面咱们讲过HTTP是一个基于TCP/IP协议簇来传递数据,所以这HTTP建立连接也就是建立TCP连接,TCP如何建立连接,一起来看看TCP包信息结构吧。
    在这里插入图片描述
    TCP报文包=TCP头信息+TCP数据体,而在TCP头信息中包含了6种控制位(上图红色框中),这六种标志位就代表着TCP连接的状态:
    1.URG:
    紧急数据(urgent data)—-这是一条紧急信息
    2.ACK:
    确认已收到
    3.PSH:
    提示接收端应用程序应该立即从tcp接收缓冲区中读走数据
    4.RST:
    表示要求对方重新建立连接
    5.SYN:
    表示请求建立一个连接
    6.FIN:
    表示通知对方本端要关闭连接了

    2.建立连接过程

    了解了TCP包头信息之后,我们就可以正式看看TCP建立连接的三次握手了。
    在这里插入图片描述
    三次握手讲解:

    1.客户端发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,服务器由SYN=1知道客户端要求建立联机(客户端:
    我要连接你)
    2.服务器收到请求后要确认联机信息,向A发送ack number=(客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包(服务器:
    好的,你来连吧)
    3.客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端会再发送ack number=(服务器的seq+1),ack=1,服务器收到后确认seq值与ack=1则连接建立成功。(客户端:好的,我来了)
    面试官:为什么http建立连接需要三次握手,不是两次或四次
    答:三次是最少的安全次数,两次不安全,四次浪费资源

    四、客户端请求

    客户端与服务器连接上了之后,客户端就可以开始向服务器请求资源,就可以开始发送HTTP请求了。

    1.HTTP请求报文结构

    我们之前说过TCP报文包=TCP头信息+TCP数据体,TCP头信息我们已经讲了,现在来讲TCP数据体,也就是我们的HTTP请求报文。
    在这里插入图片描述

    2.HTTP请求实例

    来看看实际的HTTP请求例子:
    在这里插入图片描述
    1.①是请求方法,HTTP/1.1 定义的请求方法有8种:
    GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT
    2.②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL
    3.③是协议名称及版本号
    4.④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息
    5.⑤是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。
    不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。
    请求头参数非常多,这里就不一一说明,只说明两个低级的反扒参数:
    1.User-Agent:
    客户端使用的操作系统和浏览器的名称和版本,有些网站会限制请求浏览器
    2.Referer:
    先前网页的地址,表示此请求来自哪里,有些网站会限制请求来源

    五、服务端响应

    服务器在收到客户端请求处理完需要响应并返回给客户端,而HTTP响应报文结构与请求结构体一致。

    1.HTTP响应报文结构

    在这里插入图片描述

    2.HTTP响应实例

    在这里插入图片描述

    3.响应状态码

    响应报文中我们重点关注下:服务器的响应状态码,面试也很容易问到,下面只列出分类,详细状态码请自行上网查找了解。
    在这里插入图片描述

    六、断开连接

    在服务器响应完毕后,一次会话就结束了,请问这时候连接会断开吗?

    1.长短连接

    是否断开我们需要区分HTTP版本:
    (1)在HTTP/1.0版本的时候,客户端与服务器完成一个请求/响应之后,会将之前建立的TCP连接断开,下次请求的时候又要重新建立TCP连接,这也被称为短连接
    (2)在HTTP1.0发布仅半年后(1997年1月),HTTP/1.1版本发布并带来一个新的功能:
    在客户端与服务器完成一次请求/响应之后,允许不断开TCP连接,这意味着下次请求就直接使用这个TCP连接而不再需要重新握手建立新连接,这也被称为长连接
    注意:长连接是指一次TCP连接允许多次HTTP会话,HTTP永远都是一次请求/响应,会话结束,HTTP本身不存在长连接之说。
    早在1999年HTTP1.1就推广普及,所以现在浏览器在请求时请求头中都会携带一个参数:Connection:keep-alive,这表示浏览器要求与服务器建立长连接,而服务器也可以设置是否愿意建立长连接,如果是close,表示已关闭。

    2.长连接优缺点

    对于服务器来说建立长连接有优点也有缺点:
    优点:
    当网站中有大量静态资源(图片、css、js等)就可以开启长连接,这也几张图片就可以通过一次TCP连接发送。
    缺点:
    当客户端请求一次时候不在请求,而服务器却开着长连接资源被占用着,这是严重浪费资源。
    所以是否开启长连接,长连接时间都需要根据网站自身来合理设置。
    ps:大家不要小看这一个TCP连接,在一次客户端HTTP完整的请求中(DNS寻址、建立TCP连接、请求、等待、解析网页、断开TCP连接)建立TCP连接占用的时间比还是很大的。

    3.断开连接过程

    在建立TCP连接时是三次握手,而断开TCP连接是四次挥手。
    在这里插入图片描述
    ps:http还有两个很大的缺点就是明文且不能保证完整性,所以目前会渐渐被HTTPS代替。

    展开全文
  • 详解Http协议(一)

    万次阅读 多人点赞 2018-10-25 09:10:16
    一张图带你看完本篇文章 一、概述 1.计算机网络体系结构分层 计算机网络体系结构分层 ...2.TCP/IP 通信传输流 ...首先作为发送端的客户端在应用层(HTTP 协议)发出一个想看某个 Web 页面的 HTTP ...
    一张图带你看完本篇文章

    一、概述

    1.计算机网络体系结构分层

    计算机网络体系结构分层

    2.TCP/IP 通信传输流

    利用 TCP/IP 协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则从链路层往上走。如下:

    TCP/IP 通信传输流
    • 首先作为发送端的客户端在应用层(HTTP 协议)发出一个想看某个 Web 页面的 HTTP 请求。
    • 接着,为了传输方便,在传输层(TCP 协议)把从应用层处收到的数据(HTTP 请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
    • 在网络层(IP 协议),增加作为通信目的地的 MAC 地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。
    • 接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的 HTTP请求。

    如下图所示:

    HTTP 请求

    在网络体系结构中,包含了众多的网络协议,这篇文章主要围绕 HTTP 协议(HTTP/1.1版本)展开。

    HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
    HTTP是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。
    我们在浏览器的地址栏里输入的网站地址叫做URL (Uniform Resource Locator,统一资源定位符)。就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超级链接时,URL就确定了要浏览的地址。浏览器通过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。

    二、HTTP 工作过程

    HTTP请求响应模型

    HTTP通信机制是在一次完整的 HTTP 通信过程中,客户端与服务器之间将完成下列7个步骤:

    1. 建立 TCP 连接
      在HTTP工作开始之前,客户端首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是80;
    2. 客户端向服务器发送请求命令
      一旦建立了TCP连接,客户端就会向服务器发送请求命令;
      例如:GET/sample/hello.jsp HTTP/1.1
    3. 客户端发送请求头信息
      客户端发送其请求命令之后,还要以头信息的形式向服务器发送一些别的信息,之后客户端发送了一空白行来通知服务器,它已经结束了该头信息的发送;
    4. 服务器应答
      客户端向服务器发出请求后,服务器会客户端返回响应;
      例如: HTTP/1.1 200 OK
      响应的第一部分是协议的版本号和响应状态码
    5. 服务器返回响应头信息
      正如客户端会随同请求发送关于自身的信息一样,服务器也会随同响应向用户发送关于它自己的数据及被请求的文档;
    6. 服务器向客户端发送数据
      服务器向客户端发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 响应头信息所描述的格式发送用户所请求的实际数据;
    7. 服务器关闭 TCP 连接
      一般情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接,然后如果客户端或者服务器在其头信息加入了这行代码 Connection:keep-alive ,TCP 连接在发送后将仍然保持打开状态,于是,客户端可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

    三、HTTP 协议基础

    1.通过请求和响应的交换达成通信

    应用 HTTP 协议时,必定是一端担任客户端角色,另一端担任服务器端角色。仅从一条通信线路来说,服务器端和客服端的角色是确定的。HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。

    2.HTTP 是不保存状态的协议

    HTTP 是一种无状态协议。协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。
    可是随着 Web 的不断发展,我们的很多业务都需要对通信状态进行保存。于是我们引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管理状态了。

    3.使用 Cookie 的状态管理

    Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。


    Cookie 的流程

    4.请求 URI 定位资源

    HTTP 协议使用 URI 定位互联网上的资源。正是因为 URI 的特定功能,在互联网上任意位置的资源都能访问到。

    5.告知服务器意图的 HTTP 方法(HTTP/1.1)

    HTTP 方法

    6.持久连接

    HTTP 协议的初始版本中,每进行一个 HTTP 通信都要断开一次 TCP 连接。比如使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请求该 HTML 页面里包含的其他资源。因此,每次的请求都会造成无畏的 TCP 连接建立和断开,增加通信量的开销。
    为了解决上述 TCP 连接的问题,HTTP/1.1 和部分 HTTP/1.0 想出了持久连接的方法。其特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。旨在建立一次 TCP 连接后进行多次请求和响应的交互。在 HTTP/1.1 中,所有的连接默认都是持久连接。

    7.管线化

    持久连接使得多数请求以管线化方式发送成为可能。以前发送请求后需等待并接收到响应,才能发送下一个请求。管线化技术出现后,不用等待亦可发送下一个请求。这样就能做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
    比如,当请求一个包含多张图片的 HTML 页面时,与挨个连接相比,用持久连接可以让请求更快结束。而管线化技术要比持久连接速度更快。请求数越多,时间差就越明显。

    四、HTTP 协议报文结构

    1.HTTP 报文

    用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫做请求报文;响应端(服务器端)的叫做响应报文。HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。

    2.HTTP 报文结构

    HTTP 报文大致可分为报文首部和报文主体两部分。两者由最初出现的空行(CR+LF)来划分。通常,并不一定有报文主体。如下:


    HTTP 报文结构
    2.1请求报文结构
    请求报文结构

    请求报文的首部内容由以下数据组成:

    • 请求行 —— 包含用于请求的方法、请求 URI 和 HTTP 版本。
    • 首部字段 —— 包含表示请求的各种条件和属性的各类首部。(通用首部、请求首部、实体首部以及RFC里未定义的首部如 Cookie 等)

    请求报文的示例,如下:


    请求报文示例
    2.2响应报文结构
    响应报文结构

    响应报文的首部内容由以下数据组成:

    • 状态行 —— 包含表明响应结果的状态码、原因短语和 HTTP 版本。
    • 首部字段 —— 包含表示请求的各种条件和属性的各类首部。(通用首部、响应首部、实体首部以及RFC里未定义的首部如 Cookie 等)

    响应报文的示例,如下:


    响应报文示例

    五、HTTP 报文首部之请求行、状态行

    1.请求行

    举个栗子,下面是一个 HTTP 请求的报文:

    GET  /index.htm  HTTP/1.1
    Host: sample.com
    

    其中,下面的这行就是请求行,

    GET  /index.htm  HTTP/1.1
    
    • 开头的 GET 表示请求访问服务器的类型,称为方法;
    • 随后的字符串 /index.htm 指明了请求访问的资源对象,也叫做请求 URI;
    • 最后的 HTTP/1.1,即 HTTP 的版本号,用来提示客户端使用的 HTTP 协议功能。

    综合来看,大意是请求访问某台 HTTP 服务器上的 /index.htm 页面资源。

    2.状态行

    同样举个栗子,下面是一个 HTTP 响应的报文:

    HTTP/1.1  200  OK
    Date: Mon, 10 Jul 2017 15:50:06 GMT
    Content-Length: 256
    Content-Type: text/html
    

    <html>

    其中,下面的这行就是状态行,

    HTTP/1.1  200  OK
    
    • 开头的 HTTP/1.1 表示服务器对应的 HTTP 版本;
    • 紧挨着的 200 OK 表示请求的处理结果的状态码和原因短语。

    六、HTTP 报文首部之首部字段(重点分析)

    1.首部字段概述

    先来回顾一下首部字段在报文的位置,HTTP 报文包含报文首部和报文主体,报文首部包含请求行(或状态行)和首部字段。
    在报文众多的字段当中,HTTP 首部字段包含的信息最为丰富。首部字段同时存在于请求和响应报文内,并涵盖 HTTP 报文相关的内容信息。使用首部字段是为了给客服端和服务器端提供报文主体大小、所使用的语言、认证信息等内容。

    2.首部字段结构

    • HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:”分隔。
    • 另外,字段值对应单个 HTTP 首部字段可以有多个值。
    • 当 HTTP 报文首部中出现了两个或以上具有相同首部字段名的首部字段时,这种情况在规范内尚未明确,根据浏览器内部处理逻辑的不同,优先处理的顺序可能不同,结果可能并不一致。
    首部字段名 冒号 字段值
    Content-Type text/html
    Keep-Alive timeout=30, max=120

    3.首部字段类型

    首部字段根据实际用途被分为以下4种类型:

    类型 描述
    通用首部字段 请求报文和响应报文两方都会使用的首部
    请求首部字段 从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息
    响应首部字段 从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
    实体首部字段 针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的的信息。

    4.通用首部字段(HTTP/1.1)

    首部字段名 说明
    Cache-Control 控制缓存的行为
    Connection 逐挑首部、连接的管理
    Date 创建报文的日期时间
    Pragma 报文指令
    Trailer 报文末端的首部一览
    Transfer-Encoding 指定报文主体的传输编码方式
    Upgrade 升级为其他协议
    Via 代理服务器的相关信息
    Warning 错误通知
    4.1 Cache-Control

    通过指定首部字段 Cache-Control 的指令,就能操作缓存的工作机制。

    4.1.1 可用的指令一览

    可用的指令按请求和响应分类如下:
    缓存请求指令

    指令 参数 说明
    no-cache 强制向服务器再次验证
    no-store 不缓存请求或响应的任何内容
    max-age = [秒] 必需 响应的最大Age值
    max-stale( =[秒]) 可省略 接收已过期的响应
    min-fresh = [秒] 必需 期望在指定时间内的响应仍有效
    no-transform 代理不可更改媒体类型
    only-if-cached 从缓存获取资源
    cache-extension - 新指令标记(token)

    缓存响应指令

    指令 参数 说明
    public 可向任意方提供响应的缓存
    private 可省略 仅向特定用户返回响应
    no-cache 可省略 缓存前必须先确认其有效性
    no-store 不缓存请求或响应的任何内容
    no-transform 代理不可更改媒体类型
    must-revalidate 可缓存但必须再向源服务器进行确认
    proxy-revalidate 要求中间缓存服务器对缓存的响应有效性再进行确认
    max-age = [秒] 必需 响应的最大Age值
    s-maxage = [秒] 必需 公共缓存服务器响应的最大Age值
    cache-extension - 新指令标记(token)
    4.1.2 表示能否缓存的指令

    public 指令
    Cache-Control: public
    当指定使用 public 指令时,则明确表明其他用户也可利用缓存。

    private 指令
    Cache-Control: private
    当指定 private 指令后,响应只以特定的用户作为对象,这与 public 指令的行为相反。缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。

    no-cache 指令
    Cache-Control: no-cache

    • 使用 no-cache 指令是为了防止从缓存中返回过期的资源。
    • 客户端发送的请求中如果包含 no-cache 指令,则表示客户端将不会接收缓存过的响应。于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。
    • 如果服务器中返回的响应包含 no-cache 指令,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。

    Cache-Control: no-cache=Location
    由服务器返回的响应中,若报文首部字段 Cache-Control 中对 no-cache 字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首部字段可以使用缓存。只能在响应指令中指定该参数。

    no-store 指令
    Cache-Control: no-store
    当使用 no-store 指令时,暗示请求(和对应的响应)或响应中包含机密信息。因此,该指令规定缓存不能在本地存储请求或响应的任一部分。
    注意:no-cache 指令代表不缓存过期的指令,缓存会向源服务器进行有效期确认后处理资源;no-store 指令才是真正的不进行缓存。

    4.1.3 指定缓存期限和认证的指令

    s-maxage 指令
    Cache-Control: s-maxage=604800(单位:秒)

    • s-maxage 指令的功能和 max-age 指令的相同,它们的不同点是 s-maxage 指令只适用于供多位用户使用的公共缓存服务器(一般指代理)。也就是说,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。
    • 另外,当使用 s-maxage 指令后,则直接忽略对 Expires 首部字段及 max-age 指令的处理。

    max-age 指令
    Cache-Control: max-age=604800(单位:秒)

    • 当客户端发送的请求中包含 max-age 指令时,如果判定缓存资源的缓存时间数值比指定的时间更小,那么客户端就接收缓存的资源。另外,当指定 max-age 的值为0,那么缓存服务器通常需要将请求转发给源服务器。
    • 当服务器返回的响应中包含 max-age 指令时,缓存服务器将不对资源的有效性再作确认,而 max-age 数值代表资源保存为缓存的最长时间。
    • 应用 HTTP/1.1 版本的缓存服务器遇到同时存在 Expires 首部字段的情况时,会优先处理 max-age 指令,并忽略掉 Expires 首部字段;而 HTTP/1.0 版本的缓存服务器则相反。

    min-fresh 指令
    Cache-Control: min-fresh=60(单位:秒)
    min-fresh 指令要求缓存服务器返回至少还未过指定时间的缓存资源。

    max-stale 指令
    Cache-Control: max-stale=3600(单位:秒)

    • 使用 max-stale 可指示缓存资源,即使过期也照常接收。
    • 如果指令未指定参数值,那么无论经过多久,客户端都会接收响应;如果指定了具体参数值,那么即使过期,只要仍处于 max-stale 指定的时间内,仍旧会被客户端接收。

    only-if-cached 指令
    Cache-Control: only-if-cached
    表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。换言之,该指令要求缓存服务器不重新加载响应,也不会再次确认资源的有效性。

    must-revalidate 指令
    Cache-Control: must-revalidate
    使用 must-revalidate 指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍有效。另外,使用 must-revalidate 指令会忽略请求的 max-stale 指令。

    proxy-revalidate 指令
    Cache-Control: proxy-revalidate
    proxy-revalidate 指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。

    no-transform 指令
    Cache-Control: no-transform
    使用 no-transform 指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。这样做可防止缓存或代理压缩图片等类似操作。

    4.1.4 Cache-Control 扩展

    Cache-Control: private, community="UCI"
    通过 cache-extension 标记(token),可以扩展 Cache-Control 首部字段内的指令。上述 community 指令即扩展的指令,如果缓存服务器不能理解这个新指令,就会直接忽略掉。

    4.2 Connection

    Connection 首部字段具备以下两个作用:

    控制不再转发的首部字段
    Connection: Upgrade
    在客户端发送请求和服务器返回响应中,使用 Connection 首部字段,可控制不再转发给代理的首部字段,即删除后再转发(即Hop-by-hop首部)。

    管理持久连接
    Connection: close
    HTTP/1.1 版本的默认连接都是持久连接。当服务器端想明确断开连接时,则指定 Connection 首部字段的值为 close。
    Connection: Keep-Alive
    HTTP/1.1 之前的 HTTP 版本的默认连接都是非持久连接。为此,如果想在旧版本的 HTTP 协议上维持持续连接,则需要指定 Connection 首部字段的值为 Keep-Alive。

    4.3 Date

    表明创建 HTTP 报文的日期和时间。
    Date: Mon, 10 Jul 2017 15:50:06 GMT
    HTTP/1.1 协议使用在 RFC1123 中规定的日期时间的格式。

    4.4 Pragma

    Pragma 首部字段是 HTTP/1.1 版本之前的历史遗留字段,仅作为与 HTTP/1.0 的向后兼容而定义。
    Pragma: no-cache

    • 该首部字段属于通用首部字段,但只用在客户端发送的请求中,要求所有的中间服务器不返回缓存的资源。
    • 所有的中间服务器如果都能以 HTTP/1.1 为基准,那直接采用 Cache-Control: no-cache 指定缓存的处理方式最为理想。但是要整体掌握所有中间服务器使用的 HTTP 协议版本却是不现实的,所以,发送的请求会同时包含下面两个首部字段:
    Cache-Control: no-cache
    Pragma: no-cache
    
    4.5 Trailer

    Trailer: Expires
    首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段。可应用在 HTTP/1.1 版本分块传输编码时。

    4.6 Transfer-Encoding

    Transfer-Encoding: chunked

    • 规定了传输报文主体时采用的编码方式。
    • HTTP/1.1 的传输编码方式仅对分块传输编码有效。
    4.7 Upgrade

    Upgrade: TSL/1.0
    用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。

    4.8 Via

    Via: 1.1 a1.sample.com(Squid/2.7)

    • 为了追踪客户端和服务器端之间的请求和响应报文的传输路径。
    • 报文经过代理或网关时,会现在首部字段 Via 中附加该服务器的信息,然后再进行转发。
    • 首部字段 Via 不仅用于追踪报文的转发,还可避免请求回环的发生。
    4.9 Warning

    该首部字段通常会告知用户一些与缓存相关的问题的警告。
    Warning 首部字段的格式如下:
    Warning:[警告码][警告的主机:端口号] "[警告内容]"([日期时间])
    最后的日期时间可省略。
    HTTP/1.1 中定义了7种警告,警告码对应的警告内容仅推荐参考,另外,警告码具备扩展性,今后有可能追加新的警告码。

    警告码 警告内容 说明
    110 Response is stale(响应已过期) 代理返回已过期的资源
    111 Revalidation failed(再验证失败) 代理再验证资源有效性时失败(服务器无法到达等原因)
    112 Disconnection operation(断开连接操作) 代理与互联网连接被故意切断
    113 Heuristic expiration(试探性过期) 响应的试用期超过24小时(有效缓存的设定时间大于24小时的情况下)
    199 Miscellaneous warning(杂项警告) 任意的警告内容
    214 Transformation applied(使用了转换) 代理对内容编码或媒体类型等执行了某些处理时
    299 Miscellaneous persistent warning(持久杂项警告) 任意的警告内容

    5. 请求首部字段(HTTP/1.1)

    首部字段名 说明
    Accept 用户代理可处理的媒体类型
    Accept-Charset 优先的字符集
    Accept-Encoding 优先的内容编码
    Accept-Language 优先的语言(自然语言)
    Authorization Web认证信息
    Expect 期待服务器的特定行为
    From 用户的电子邮箱地址
    Host 请求资源所在服务器
    If-Match 比较实体标记(ETag)
    If-Modified-Since 比较资源的更新时间
    If-None-Match 比较实体标记(与 If-Macth 相反)
    If-Range 资源未更新时发送实体 Byte 的范围请求
    If-Unmodified-Since 比较资源的更新时间(与 If-Modified-Since 相反)
    Max-Forwards 最大传输逐跳数
    Proxy-Authorization 代理服务器要求客户端的认证信息
    Range 实体的字节范围请求
    Referer 对请求中 URI 的原始获取方
    TE 传输编码的优先级
    User-Agent HTTP 客户端程序的信息
    5.1 Accept

    Accept: text/html, application/xhtml+xml, application/xml; q=0.5

    • Accept 首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用 type/subtype 这种形式,一次指定多种媒体类型。
    • 若想要给显示的媒体类型增加优先级,则使用 q=[数值] 来表示权重值,用分号(;)进行分隔。权重值的范围 0~1(可精确到小数点后三位),且 1 为最大值。不指定权重值时,默认为 1。
    5.2 Accept-Charset

    Accept-Charset: iso-8859-5, unicode-1-1; q=0.8
    Accept-Charset 首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。同样使用 q=[数值] 来表示相对优先级。

    5.3 Accept-Encoding

    Accept-Encoding: gzip, deflate
    Accept-Encoding 首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先顺序,并可一次性指定多种内容编码。同样使用 q=[数值] 来表示相对优先级。也可使用星号(*)作为通配符,指定任意的编码格式。

    5.4 Accept-Language

    Accept-Lanuage: zh-cn,zh;q=0.7,en=us,en;q=0.3
    告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级,可一次性指定多种自然语言集。同样使用 q=[数值] 来表示相对优先级。

    5.5 Authorization

    Authorization: Basic ldfKDHKfkDdasSAEdasd==
    告知服务器用户代理的认证信息(证书值)。通常,想要通过服务器认证的用户代理会在接收到返回的 401 状态码响应后,把首部字段 Authorization 加入请求中。共用缓存在接收到含有 Authorization 首部字段的请求时的操作处理会略有差异。

    5.6 Expect

    Expect: 100-continue
    告知服务器客户端期望出现的某种特定行为。

    5.7 From

    From: Deeson_Woo@163.com
    告知服务器使用用户代理的电子邮件地址。

    5.8 Host

    Host: www.jianshu.com

    • 告知服务器,请求的资源所处的互联网主机和端口号。
    • Host 首部字段是 HTTP/1.1 规范内唯一一个必须被包含在请求内的首部字段。
    • 若服务器未设定主机名,那直接发送一个空值即可 Host:
    5.9 If-Match

    形如 If-xxx 这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。

    If-Match: "123456"

    • 首部字段 If-Match,属附带条件之一,它会告知服务器匹配资源所用的实体标记(ETag)值。这时的服务器无法使用弱 ETag 值。
    • 服务器会比对 If-Match 的字段值和资源的 ETag 值,仅当两者一致时,才会执行请求。反之,则返回状态码 412 Precondition Failed 的响应。
    • 还可以使用星号(*)指定 If-Match 的字段值。针对这种情况,服务器将会忽略 ETag 的值,只要资源存在就处理请求。
    5.10 If-Modified-Since

    If-Modified-Since: Mon, 10 Jul 2017 15:50:06 GMT

    • 首部字段 If-Modified-Since,属附带条件之一,用于确认代理或客户端拥有的本地资源的有效性。
    • 它会告知服务器若 If-Modified-Since 字段值早于资源的更新时间,则希望能处理该请求。而在指定 If-Modified-Since 字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码 304 Not Modified 的响应。
    5.11 If-None-Match

    If-None-Match: "123456"
    首部字段 If-None-Match 属于附带条件之一。它和首部字段 If-Match 作用相反。用于指定 If-None-Match 字段值的实体标记(ETag)值与请求资源的 ETag 不一致时,它就告知服务器处理该请求。

    5.12 If-Range

    If-Range: "123456"

    • 首部字段 If-Range 属于附带条件之一。它告知服务器若指定的 If-Range 字段值(ETag 值或者时间)和请求资源的 ETag 值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。
    • 下面我们思考一下不使用首部字段 If-Range 发送请求的情况。服务器端的资源如果更新,那客户端持有资源中的一部分也会随之无效,当然,范围请求作为前提是无效的。这时,服务器会暂且以状态码 412 Precondition Failed 作为响应返回,其目的是催促客户端再次发送请求。这样一来,与使用首部字段 If-Range 比起来,就需要花费两倍的功夫。
    5.13 If-Unmodified-Since

    If-Unmodified-Since: Mon, 10 Jul 2017 15:50:06 GMT
    首部字段 If-Unmodified-Since 和首部字段 If-Modified-Since 的作用相反。它的作用的是告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。如果在指定日期时间后发生了更新,则以状态码 412 Precondition Failed 作为响应返回。

    5.14 Max-Forwards

    Max-Forwards: 10
    通过 TRACE 方法或 OPTIONS 方法,发送包含首部字段 Max-Forwards 的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。服务器在往下一个服务器转发请求之前,Max-Forwards 的值减 1 后重新赋值。当服务器接收到 Max-Forwards 值为 0 的请求时,则不再进行转发,而是直接返回响应。

    5.15 Proxy-Authorization

    Proxy-Authorization: Basic dGlwOjkpNLAGfFY5

    • 接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段 Proxy-Authorization 的请求,以告知服务器认证所需要的信息。
    • 这个行为是与客户端和服务器之间的 HTTP 访问认证相类似的,不同之处在于,认证行为发生在客户端与代理之间。
    5.16 Range

    Range: bytes=5001-10000

    • 对于只需获取部分资源的范围请求,包含首部字段 Range 即可告知服务器资源的指定范围。
    • 接收到附带 Range 首部字段请求的服务器,会在处理请求之后返回状态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返回状态码 200 OK 的响应及全部资源。
    5.17 Referer

    Referer: http://www.sample.com/index.html
    首部字段 Referer 会告知服务器请求的原始资源的 URI。

    5.18 TE

    TE: gzip, deflate; q=0.5

    • 首部字段 TE 会告知服务器客户端能够处理响应的传输编码方式及相对优先级。它和首部字段 Accept-Encoding 的功能很相像,但是用于传输编码。
    • 首部字段 TE 除指定传输编码之外,还可以指定伴随 trailer 字段的分块传输编码的方式。应用后者时,只需把 trailers 赋值给该字段值。TE: trailers
    5.19 User-Agent

    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101

    • 首部字段 User-Agent 会将创建请求的浏览器和用户代理名称等信息传达给服务器。
    • 由网络爬虫发起请求时,有可能会在字段内添加爬虫作者的电子邮件地址。此外,如果请求经过代理,那么中间也很可能被添加上代理服务器的名称。

    6. 响应首部字段(HTTP/1.1)

    首部字段名 说明
    Accept-Ranges 是否接受字节范围请求
    Age 推算资源创建经过时间
    ETag 资源的匹配信息
    Location 令客户端重定向至指定 URI
    Proxy-Authenticate 代理服务器对客户端的认证信息
    Retry-After 对再次发起请求的时机要求
    Server HTTP 服务器的安装信息
    Vary 代理服务器缓存的管理信息
    WWW-Authenticate 服务器对客户端的认证信息
    6.1 Accept-Ranges

    Accept-Ranges: bytes

    • 首部字段 Accept-Ranges 是用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。
    • 可指定的字段值有两种,可处理范围请求时指定其为 bytes,反之则指定其为 none。
    6.2 Age

    Age: 1200

    • 首部字段 Age 能告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。
    • 若创建该响应的服务器是缓存服务器,Age 值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上首部字段 Age。
    6.3 ETag

    ETag: "usagi-1234"

    • 首部字段 ETag 能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的 ETag 值。
    • 另外,当资源更新时,ETag 值也需要更新。生成 ETag 值时,并没有统一的算法规则,而仅仅是由服务器来分配。
    • ETag 中有强 ETag 值和弱 ETag 值之分。强 ETag 值,不论实体发生多么细微的变化都会改变其值;弱 ETag 值只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变 ETag 值。这时,会在字段值最开始处附加 W/: ETag: W/"usagi-1234"
    6.4 Location

    Location: http://www.sample.com/sample.html

    • 使用首部字段 Location 可以将响应接收方引导至某个与请求 URI 位置不同的资源。
    • 基本上,该字段会配合 3xx :Redirection 的响应,提供重定向的 URI。
    • 几乎所有的浏览器在接收到包含首部字段 Location 的响应后,都会强制性地尝试对已提示的重定向资源的访问。
    6.5 Proxy-Authenticate

    Proxy-Authenticate: Basic realm="Usagidesign Auth"

    • 首部字段 Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端。
    • 它与客户端和服务器之间的 HTTP 访问认证的行为相似,不同之处在于其认证行为是在客户端与代理之间进行的。
    6.6 Retry-After

    Retry-After: 180

    • 首部字段 Retry-After 告知客户端应该在多久之后再次发送请求。主要配合状态码 503 Service Unavailable 响应,或 3xx Redirect 响应一起使用。
    • 字段值可以指定为具体的日期时间(Mon, 10 Jul 2017 15:50:06 GMT 等格式),也可以是创建响应后的秒数。
    6.7 Server

    Server: Apache/2.2.6 (Unix) PHP/5.2.5
    首部字段 Server 告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息。不单单会标出服务器上的软件应用名称,还有可能包括版本号和安装时启用的可选项。

    6.8 Vary

    Vary: Accept-Language

    • 首部字段 Vary 可对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的命令。
    • 从代理服务器接收到源服务器返回包含 Vary 指定项的响应之后,若再要进行缓存,仅对请求中含有相同 Vary 指定首部字段的请求返回缓存。即使对相同资源发起请求,但由于 Vary 指定的首部字段不相同,因此必须要从源服务器重新获取资源。
    6.9 WWW-Authenticate

    WWW-Authenticate: Basic realm="Usagidesign Auth"
    首部字段 WWW-Authenticate 用于 HTTP 访问认证。它会告知客户端适用于访问请求 URI 所指定资源的认证方案(Basic 或是 Digest)和带参数提示的质询(challenge)。

    7. 实体首部字段(HTTP/1.1)

    首部字段名 说明
    Allow 资源可支持的 HTTP 方法
    Content-Encoding 实体主体适用的编码方式
    Content-Language 实体主体的自然语言
    Content-Length 实体主体的大小(单位:字节)
    Content-Location 替代对应资源的 URI
    Content-MD5 实体主体的报文摘要
    Content-Range 实体主体的位置范围
    Content-Type 实体主体的媒体类型
    Expires 实体主体过期的日期时间
    Last-Modified 资源的最后修改日期时间
    7.1 Allow

    Allow: GET, HEAD

    • 首部字段 Allow 用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。
    • 当服务器接收到不支持的 HTTP 方法时,会以状态码 405 Method Not Allowed 作为响应返回。与此同时,还会把所有能支持的 HTTP 方法写入首部字段 Allow 后返回。
    7.2 Content-Encoding

    Content-Encoding: gzip

    • 首部字段 Content-Encoding 会告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。
    • 主要采用这 4 种内容编码的方式(gzip、compress、deflate、identity)。
    7.3 Content-Language

    Content-Language: zh-CN
    首部字段 Content-Language 会告知客户端,实体主体使用的自然语言(指中文或英文等语言)。

    7.4 Content-Length

    Content-Length: 15000
    首部字段 Content-Length 表明了实体主体部分的大小(单位是字节)。对实体主体进行内容编码传输时,不能再使用 Content-Length首部字段。

    7.5 Content-Location

    Content-Location: http://www.sample.com/index.html
    首部字段 Content-Location 给出与报文主体部分相对应的 URI。和首部字段 Location 不同,Content-Location 表示的是报文主体返回资源对应的 URI。

    7.6 Content-MD5

    Content-MD5: OGFkZDUwNGVhNGY3N2MxMDIwZmQ4NTBmY2IyTY==
    首部字段 Content-MD5 是一串由 MD5 算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。

    7.7 Content-Range

    Content-Range: bytes 5001-10000/10000
    针对范围请求,返回响应时使用的首部字段 Content-Range,能告知客户端作为响应返回的实体的哪个部分符合范围请求。字段值以字节为单位,表示当前发送部分及整个实体大小。

    7.8 Content-Type

    Content-Type: text/html; charset=UTF-8
    首部字段 Content-Type 说明了实体主体内对象的媒体类型。和首部字段 Accept 一样,字段值用 type/subtype 形式赋值。参数 charset 使用 iso-8859-1 或 euc-jp 等字符集进行赋值。

    7.9 Expires

    Expires: Mon, 10 Jul 2017 15:50:06 GMT

    • 首部字段 Expires 会将资源失效的日期告知客户端。
    • 缓存服务器在接收到含有首部字段 Expires 的响应后,会以缓存来应答请求,在 Expires 字段值指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。
    • 源服务器不希望缓存服务器对资源缓存时,最好在 Expires 字段内写入与首部字段 Date 相同的时间值。
    7.10 Last-Modified

    Last-Modified: Mon, 10 Jul 2017 15:50:06 GMT
    首部字段 Last-Modified 指明资源最终修改的时间。一般来说,这个值就是 Request-URI 指定资源被修改的时间。但类似使用 CGI 脚本进行动态数据处理时,该值有可能会变成数据最终修改时的时间。

    8. 为 Cookie 服务的首部字段

    首部字段名 说明 首部类型
    Set-Cookie 开始状态管理所使用的 Cookie 信息 响应首部字段
    Cookie 服务器接收到的 Cookie 信息 请求首部字段
    8.1 Set-Cookie

    Set-Cookie: status=enable; expires=Mon, 10 Jul 2017 15:50:06 GMT; path=/;

    下面的表格列举了 Set-Cookie 的字段值。

    属性 说明
    NAME=VALUE 赋予 Cookie 的名称和其值(必需项)
    expires=DATE Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止)
    path=PATH 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录)
    domain=域名 作为 Cookie 适用对象的域名 (若不指定则默认为创建 Cookie的服务器的域名)
    Secure 仅在 HTTPS 安全通信时才会发送 Cookie
    HttpOnly 加以限制,使 Cookie 不能被 JavaScript 脚本访问
    8.1.1 expires 属性
    • Cookie 的 expires 属性指定浏览器可发送 Cookie 的有效期。
    • 当省略 expires 属性时,其有效期仅限于维持浏览器会话(Session)时间段内。这通常限于浏览器应用程序被关闭之前。
    • 另外,一旦 Cookie 从服务器端发送至客户端,服务器端就不存在可以显式删除 Cookie 的方法。但可通过覆盖已过期的 Cookie,实现对客户端 Cookie 的实质性删除操作。
    8.1.2 path 属性

    Cookie 的 path 属性可用于限制指定 Cookie 的发送范围的文件目录。

    8.1.3 domain 属性
    • 通过 Cookie 的 domain 属性指定的域名可做到与结尾匹配一致。比如,当指定 example.com 后,除example.com 以外,www.example.comwww2.example.com 等都可以发送 Cookie。
    • 因此,除了针对具体指定的多个域名发送 Cookie 之 外,不指定 domain 属性显得更安全。
    8.1.4 secure 属性

    Cookie 的 secure 属性用于限制 Web 页面仅在 HTTPS 安全连接时,才可以发送 Cookie。

    8.1.5 HttpOnly 属性
    • Cookie 的 HttpOnly 属性是 Cookie 的扩展功能,它使 JavaScript 脚本无法获得 Cookie。其主要目的为防止跨站脚本攻击(Cross-site scripting,XSS)对 Cookie 的信息窃取。
    • 通过上述设置,通常从 Web 页面内还可以对 Cookie 进行读取操作。但使用 JavaScript 的 document.cookie 就无法读取附加 HttpOnly 属性后的 Cookie 的内容了。因此,也就无法在 XSS 中利用 JavaScript 劫持 Cookie 了。
    8.2 Cookie

    Cookie: status=enable
    首部字段 Cookie 会告知服务器,当客户端想获得 HTTP 状态管理支持时,就会在请求中包含从服务器接收到的 Cookie。接收到多个 Cookie 时,同样可以以多个 Cookie 形式发送。

    9. 其他首部字段

    HTTP 首部字段是可以自行扩展的。所以在 Web 服务器和浏览器的应用上,会出现各种非标准的首部字段。
    以下是最为常用的首部字段。

    9.1 X-Frame-Options

    X-Frame-Options: DENY
    首部字段 X-Frame-Options 属于 HTTP 响应首部,用于控制网站内容在其他 Web 网站的 Frame 标签内的显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。首部字段 X-Frame-Options 有以下两个可指定的字段值:

    • DENY:拒绝
    • SAMEORIGIN:仅同源域名下的页面(Top-level-browsing-context)匹配时许可。(比如,当指定 http://sample.com/sample.html 页面为 SAMEORIGIN 时,那么 sample.com 上所有页面的 frame 都被允许可加载该页面,而 example.com 等其他域名的页面就不行了)
    9.2 X-XSS-Protection

    X-XSS-Protection: 1
    首部字段 X-XSS-Protection 属于 HTTP 响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器 XSS 防护机制的开关。首部字段 X-XSS-Protection 可指定的字段值如下:

    • 0 :将 XSS 过滤设置成无效状态
    • 1 :将 XSS 过滤设置成有效状态
    9.3 DNT

    DNT: 1
    首部字段 DNT 属于 HTTP 请求首部,其中 DNT 是 Do Not Track 的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。首部字段 DNT 可指定的字段值如下:

    • 0 :同意被追踪
    • 1 :拒绝被追踪

    由于首部字段 DNT 的功能具备有效性,所以 Web 服务器需要对 DNT做对应的支持。

    9.4 P3P

    P3P: CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND
    首部字段 P3P 属于 HTTP 响应首部,通过利用 P3P(The Platform for Privacy Preferences,在线隐私偏好平台)技术,可以让 Web 网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。
    要进行 P3P 的设定,需按以下操作步骤进行:

    • 步骤 1:创建 P3P 隐私
    • 步骤 2:创建 P3P 隐私对照文件后,保存命名在 /w3c/p3p.xml
    • 步骤 3:从 P3P 隐私中新建 Compact policies 后,输出到 HTTP 响应中

    七、HTTP 响应状态码(重点分析)

    1. 状态码概述

    • HTTP 状态码负责表示客户端 HTTP 请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。
    • HTTP 状态码如 200 OK ,以 3 位数字和原因短语组成。数字中的第一位指定了响应类别,后两位无分类。
    • 不少返回的响应状态码都是错误的,但是用户可能察觉不到这点。比如 Web 应用程序内部发生错误,状态码依然返回 200 OK

    2. 状态码类别

    类别 原因短语
    1xx Informational(信息性状态码) 接收的请求正在处理
    2xx Success(成功状态码) 请求正常处理完毕
    3xx Redirection(重定向状态码) 需要进行附加操作以完成请求
    4xx Client Error(客户端错误状态码) 服务器无法处理请求
    5xx Server Error(服务器错误状态码) 服务器处理请求出错

    我们可以自行改变 RFC2616 中定义的状态码或者服务器端自行创建状态码,只要遵守状态码的类别定义就可以了。

    3. 常用状态码解析

    HTTP 状态码种类繁多,数量达几十种。其中最常用的有以下 14 种,一起来看看。

    3.1 200 OK

    表示从客户端发来的请求在服务器端被正常处理了。

    3.2 204 No Content
    • 代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。
    • 一般在只需要从客户端向服务器端发送消息,而服务器端不需要向客户端发送新消息内容的情况下使用。
    3.3 206 Partial Content

    表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 首部字段指定范围的实体内容。

    3.4 301 Moved Permanently

    永久性重定向。表示请求的资源已被分配了新的 URI。以后应使用资源现在所指的 URI。也就是说,如果已经把资源对应的 URI 保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。

    3.5 302 Found
    • 临时性重定向。表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
    • 301 Moved Permanently 状态码相似,但 302 Found 状态码代表资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的 URI 将来还有可能发生改变。
    3.6 303 See Other
    • 表示由于请求的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。
    • 303 See Other 和 302 Found 状态码有着相同的功能,但 303 See Other 状态码明确表示客户端应采用 GET 方法获取资源,这点与 302 Found 状态码有区别。
    3.7 304 Not Modified
    • 表示客户端发送附带条件的请求时,服务器端允许请求访问的资源,但未满足条件的情况。
    • 304 Not Modified 状态码返回时,不包含任何响应的主体部分。
    • 304 Not Modified 虽然被划分到 3xx 类别中,但和重定向没有关系。
    3.8 307 Temporary Redirect

    临时重定向。该状态码与 302 Found 有着相同的含义。

    3.9 400 Bad Request
    • 表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
    • 另外,浏览器会像 200 OK 一样对待该状态码。
    3.10 401 Unauthorized
    • 表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。
    • 另外,若之前已进行过 1 次请求,则表示用户认证失败。
    • 返回含有 401 Unauthorized 的响应必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询(challenge)用户信息。
    3.11 403 Forbidden

    表明对请求资源的访问被服务器拒绝了。服务器端没有必要给出详细的拒绝理由,当然也可以在响应报文的实体主体部分对原因进行描述。

    3.12 404 Not Found

    表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由的时候使用。

    3.13 500 Internal Server Error

    表明服务器端在执行请求时发生了错误。也可能是 Web 应用存在的 bug 或某些临时的故障。

    3.14 503 Service Unavailable

    表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入 Retry-After 首部字段再返回给客户端。

    八、HTTP 报文实体

    1. HTTP 报文实体概述

    HTTP 报文结构

    大家请仔细看看上面示例中,各个组成部分对应的内容。
    接着,我们来看看报文和实体的概念。如果把 HTTP 报文想象成因特网货运系统中的箱子,那么 HTTP 实体就是报文中实际的货物。

    • 报文:是网络中交换和传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。
    • 实体:作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。(实体首部相关内容在上面第六点中已有阐述。)

    我们可以看到,上面示例右图中深红色框的内容就是报文的实体部分,而蓝色框的两部分内容分别就是实体首部和实体主体。而左图中粉红框内容就是报文主体。
    通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。

    2. 内容编码

    • HTTP 应用程序有时在发送之前需要对内容进行编码。例如,在把很大的 HTML 文档发送给通过慢速连接上来的客户端之前,服务器可能会对其进行压缩,这样有助于减少传输实体的时间。服务器还可以把内容搅乱或加密,以此来防止未授权的第三方看到文档的内容。
    • 这种类型的编码是在发送方应用到内容之上的。当内容经过内容编码后,编好码的数据就放在实体主体中,像往常一样发送给接收方。

    内容编码类型:

    编码方式 描述
    gzip 表明实体采用 GNU zip 编码
    compress 表明实体采用 Unix 的文件压缩程序
    deflate 表明实体采用 zlib 的格式压缩的
    identity 表明没有对实体进行编码,当没有 Content-Encoding 首部字段时,默认采用此编码方式

    3. 传输编码

    内容编码是对报文的主体进行的可逆变换,是和内容的具体格式细节紧密相关的。
    传输编码也是作用在实体主体上的可逆变换,但使用它们是由于架构方面的原因,同内容的格式无关。使用传输编码是为了改变报文中的数据在网络上传输的方式。


    内容编码和传输编码的对比

    4. 分块编码

    分块编码把报文分割成若干已知大小的块。块之间是紧挨着发送的,这样就不需要在发送之前知道整个报文的大小了。分块编码是一种传输编码,是报文的属性。

    分块编码与持久连接
    若客户端与服务器端之间不是持久连接,客户端就不需要知道它在读取的主体的长度,而只需要读取到服务器关闭主体连接为止。
    当使用持久连接时,在服务器写主体之前,必须知道它的大小并在 Content-Length 首部中发送。如果服务器动态创建内容,就可能在发送之前无法知道主体的长度。
    分块编码为这种困难提供了解决方案,只要允许服务器把主体分块发送,说明每块的大小就可以了。因为主体是动态创建的,服务器可以缓冲它的一部分,发送其大小和相应的块,然后在主体发送完之前重复这个过程。服务器可以用大小为 0 的块作为主体结束的信号,这样就可以继续保持连接,为下一个响应做准备。
    来看看一个分块编码的报文示例:

    分块编码的报文

    5.多部分媒体类型

    MIME 中的 multipart(多部分)电子邮件报文中包含多个报文,它们合在一起作为单一的复杂报文发送。每一部分都是独立的,有各自的描述其内容的集,不同部分之间用分界字符串连接在一起。
    相应得,HTTP 协议中也采纳了多部分对象集合,发送的一份报文主体内可包含多种类型实体。
    多部分对象集合包含的对象如下:

    • multipart/form-data:在 Web 表单文件上传时使用。
    • multipart/byteranges:状态码 206 Partial Content 响应报文包含了多个范围的内容时使用。

    6. 范围请求

    假设你正在下载一个很大的文件,已经下了四分之三,忽然网络中断了,那下载就必须重头再来一遍。为了解决这个问题,需要一种可恢复的机制,即能从之前下载中断处恢复下载。要实现该功能,这就要用到范围请求。
    有了范围请求, HTTP 客户端可以通过请求曾获取失败的实体的一个范围(或者说一部分),来恢复下载该实体。当然这有一个前提,那就是从客户端上一次请求该实体到这一次发出范围请求的时间段内,该对象没有改变过。例如:

    GET  /bigfile.html  HTTP/1.1
    Host: www.sample.com
    Range: bytes=20224-
    ···
    
    实体范围请求示例

    上面示例中,客户端请求的是文档开头20224字节之后的部分。

    九、与 HTTP 协作的 Web 服务器

    HTTP 通信时,除客户端和服务器外,还有一些用于协助通信的应用程序。如下列出比较重要的几个:代理、缓存、网关、隧道、Agent 代理

    1.代理

    代理

    HTTP 代理服务器是 Web 安全、应用集成以及性能优化的重要组成模块。代理位于客户端和服务器端之间,接收客户端所有的 HTTP 请求,并将这些请求转发给服务器(可能会对请求进行修改之后再进行转发)。对用户来说,这些应用程序就是一个代理,代表用户访问服务器。
    出于安全考虑,通常会将代理作为转发所有 Web 流量的可信任中间节点使用。代理还可以对请求和响应进行过滤,安全上网或绿色上网。

    2. 缓存

    浏览器第一次请求:

    浏览器第一次请求

    浏览器再次请求:

    浏览器再次请求

    Web 缓存或代理缓存是一种特殊的 HTTP 代理服务器,可以将经过代理传输的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了。客户端从附近的缓存下载文档会比从远程 Web 服务器下载快得多。

    3. 网关

    HTTP / FTP 网关

    网关是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将 HTTP 流量转换成其他的协议。网关接收请求时就好像自己是资源的源服务器一样。客户端可能并不知道自己正在跟一个网关进行通信。

    4. 隧道

    HTTP/SSL 隧道

    隧道是会在建立起来之后,就会在两条连接之间对原始数据进行盲转发的 HTTP 应用程序。HTTP 隧道通常用来在一条或多条 HTTP 连接上转发非 HTTP 数据,转发时不会窥探数据。
    HTTP 隧道的一种常见用途就是通过 HTTP 连接承载加密的安全套接字层(SSL)流量,这样 SSL 流量就可以穿过只允许 Web 流量通过的防火墙了。

    5. Agent 代理

    自动搜索引擎“网络蜘蛛”

    Agent 代理是代表用户发起 HTTP 请求的客户端应用程序。所有发布 Web 请求的应用程序都是 HTTP Agent 代理。

    展开全文
  • HTTP与HTTPS协议:从原理到流程

    千人学习 2019-04-08 10:29:59
    每天,我们都在上网,用的就是HTTP以及HTTPS协议。 如果我们想深入了解这两种互联网上最常用的协议的话,就从这门课程开始吧。 本课程从互联网上最常用的HTTP协议开始,讲解了HTTP协议的报文结构以及报文的...
  • HTTP协议是构建在TCP/IP协议之上的,是TCP/IP协议的一个子集,所以要理解HTTP协议,有必要先了解下TCP/IP协议相关的知识。 由于TCP/IP协议族包含众多的协议,在这里我们无法一一讨论。接下来,我..
  • HTTP协议是构建在TCP/IP协议之上的,是TCP/IP协议的一个子集,所以要理解HTTP协议,有必要先了解下TCP/IP协议相关的知识。 由于TCP/IP协议族包含众多的协议,在这里我们无法一一讨论。接下来,我..
  • HTTP协议&HTTPS协议

    2020-07-16 18:38:36
    HTTP协议 HTTP协议是基于TCP协议的,当然是要先建立TCP连接了。目前使用的HTTP协议大部分都是1.1.在1.1的协议里面,默认是开启了Keep-Alive的,这样建立的TCP连接,就可以在多次请求中复用。 HTTP请求的构建 HTTP的...
  • http协议与https协议

    千次阅读 2015-07-21 19:47:01
    在介绍 HTTP 协议之前,先简单说一下TCP/IP协议的相关内容。TCP/IP协议是分层的,从底层至应用层分别为:物理层、链路层、网络层、传输层和应用层,如下图所示: 2、http协议简介 协议是指计算机通信网络中两台...
  • HyperText Transfer protocol

    千次阅读 2018-03-14 13:47:19
    HTTP:一种用于分布式、协作式和超媒体信息系统的应用层协议;常见的状态码HTTP 有 request 和 response,他们都有自己的报文结构:其中 response 有很多不同的状态码,这里呢就聊聊常见的状态码。404404 的含义...
  • HTTP协议分析

    万次阅读 多人点赞 2019-06-23 12:30:24
    HTTP简介 HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,它是万维网交换信息的基础,它允许将HTML(超文本标记语言)文档从Web服务器传送到Web...
  • 1:基本概念 1) 超文本:由多个信息源连接而成,该文本除了基本信息外,还可以有指向信息集合中其他文档的指针;... 2) URL:Uniform Resource Locator,统一资源定位符,也被称为网页地址,是互联网上标准的资源...
  • HTTP(超文本传输协议):一个基于请求与响应模式的、无效的、应用层的协议。常基于TCP的连接方式,绝大数的Web开发都是建立在HTTP 协议之上的Web应用。简单明了就是一个基于应用层的通信规范。  一. 概念  ...
  • 解决办法:webconfig中加入
  • http免费代理-2020-04-07

    万次阅读 2020-04-07 16:12:32
    http://210.72.14.142:80 http://106.14.5.129:8080 http://222.73.68.144:8090 http://211.95.2.37:3128 http://59.46.0.31:1080 http://120.198.248.30:8080 http://112.74.39.165:80...
  • 堡垒机阿里云安装包安装

    万次阅读 2016-06-29 13:50:13
    阿里云版本开源堡垒机可以加QQ群 548258314 在群文件中下载   一....如果是在自己服务器上装的centos 7.1版本,只需要用最小安装即可(不要选择其它安装包) ...二....堡垒机安装包要安装很多堡垒机需要的rpm包,因此...
  • [Java Web]Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors  今天对项目进行维护,突然发现修改内容后不能保存,前端页面显示白屏,后台tomcat在debug模式下出现:...
  • HTTPHTTP1.1、 HTTP/2的区别

    万次阅读 2018-11-11 16:12:48
    HTTPHTTP1.1、 HTTP/2的区别
  • Oracle OCP 11G 051答案解析目录

    万次阅读 多人点赞 2014-02-20 19:32:53
    Oracle OCP 11G 051答案解析目录 ...http://blog.csdn.net/rlhua/article/details/12184999 2 http://blog.csdn.net/rlhua/article/details/12905681 3 http://blog.csdn.net/rlhua/article/details/1290
  • Android-Skillful-Craftsman(Android能工巧匠)

    万次阅读 2016-11-03 15:07:16
    本文的内容整理自网络,本着知识交流分享的原则,请勿用于商业用途, 对于引用的部分,都已在文中指出,如果有遗漏的,可以联系本人加上,若有 侵权,也请指出,本人将及时删掉侵权内容,万分感谢。...
1 2 3 4 5 ... 20
收藏数 9,696,898
精华内容 3,878,759
关键字:

http