HTTP协议及状态码

  • HTTP协议及状态码已关闭评论
  • 15 次浏览
  • A+
所属分类:Web前端
摘要

概念流程首先客户端通过URL访问服务器建立SSL连接服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端


一、HTTP和HTTPS协议的概念及区别

1.HTTP

  • 概念
    • HTTP即超文本运输协议,是实现网络通信的一种规范,它定义了客户端和服务器之间交换报文的格式和方式,默认使用 80 端口。它使用 TCP 作为传输层协议,保证了数据传输的可靠性。
    • HTTP是一个传输协议,即将数据由A传到B或将B传输到A,并且 A 与 B 之间能够存放很多第三方,如: A<=>X<=>Y<=>Z<=>B;传输的数据并不是计算机底层中的二进制包,而是完整的、有意义的数据,如HTML 文件, 图片文件, 查询结果等超文本,能够被上层应用识别;在实际应用中,HTTP常被用于在Web浏览器和网站服务器之间传递信息,以明文方式发送内容,不提供任何方式的数据加密。
  • 优点
    • 支持客户/服务器模式
    • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
    • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
    • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间
    • 无状态:HTTP协议无法根据之前的状态进行本次的请求处理
  • 缺点
    • 无状态:HTTP 是一个无状态的协议,HTTP 服务器不会保存关于客户的任何信息
    • 明文传输:协议中的报文使用的是文本形式,这就直接暴露给外界,不安全
    • 不安全:通信使用明文(不加密),内容可能会被窃听;不验证通信方的身份,因此有可能遭遇伪装;无法证明报文的完整性,所以有可能已遭篡改

2.HTTPS

  • 概念

    • 为了保证这些隐私数据能加密传输,让HTTP运行安全的SSL/TLS协议上,即 HTTPS = HTTP + SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密;SSL 协议位于TCP/IP 协议与各种应用层协议之间,浏览器和服务器在使用 SSL 建立连接时需要选择一组恰当的加密算法来实现安全通信,为数据通讯提供安全支持
  • 流程

    • HTTP协议及状态码

    • 首先客户端通过URL访问服务器建立SSL连接

    • 服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端

    • 客户端的服务器开始协商SSL连接的安全等级,也就是信息加密的等级

    • 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站

    • 服务器利用自己的私钥解密出会话密钥

    • 服务器利用会话密钥加密与客户端之间的通信

  • 优点

    • 使用HTTPS协议可以认证用户和服务器,确保数据发送到正确的客户端和服务器
    • 使用HTTPS协议可以进行加密传输、身份认证,通信更加安全,防止数据在传输过程中被窃取、修改,确保数据安全性
    • HTTPS是现行架构下最安全的解决方案,虽然不是绝对的安全,但是大幅增加了中间人攻击的成本
  • 缺点

    • HTTPS需要做服务器和客户端双方的加密个解密处理,耗费更多服务器资源,过程复杂
    • HTTPS协议握手阶段比较费时,增加页面的加载时间
    • SSL证书是收费的,功能越强大的证书费用越高
    • HTTPS连接服务器端资源占用高很多,支持访客稍多的网站需要投入更大的成本
    • SSL证书需要绑定IP,不能再同一个IP上绑定多个域名

3.区别

  • HTTPS是HTTP协议的安全版本,HTTP协议的数据传输是明文的,是不安全的,HTTPS使用了SSL/TLS协议进行了加密处理,相对更安全
  • HTTP 和 HTTPS 使用连接方式不同,默认端口也不一样,HTTP是80,HTTPS是443
  • HTTPS 由于需要设计加密以及多次握手,性能方面不如 HTTP
  • HTTPS需要SSL,SSL 证书需要钱,功能越强大的证书费用越高

二、常见的HTTP请求方法

  • GET:向服务器获取数据
  • POST:将实体提交到指定的资源,通常会造成服务器资源的修改
  • PUT:上传文件,更新数据
  • DELETE:删除服务器上的对象
  • HEAD:获取报文首部,与GET相比,不返回报文主体部分
  • OPTIONS:询问支持的请求方法,用来跨域请求
  • CONNECT:要求在与代理服务器通信时建立隧道,使用隧道进行TCP通信
  • TRACE: 回显服务器收到的请求,主要⽤于测试或诊断

三、GET和POST的请求的区别

  • GET: 向服务器获取数据,POST:将实体提交到指定的资源,通常会造成服务器资源的修改
  • 区别如下
    • 应用场景:GET 请求是一个幂等的请求,一般 Get 请求用于对服务器资源不会产生影响的场景,比如说请求一个网页的资源。而 Post 不是一个幂等的请求,一般用于对服务器资源会产生影响的情景,比如注册用户这一类的操作。
    • 是否缓存:因为两者应用场景不同,浏览器一般会对 Get 请求缓存,但很少对 Post 请求缓存。
    • 发送的报文格式:Get 请求的报文中实体部分为空,Post 请求的报文中实体部分一般为向服务器发送的数据。
    • 参数传递方式:GET参数通过URL传递,POST放在Request body中。
    • 安全性:Get 请求可以将请求的参数放入 url 中向服务器发送,这样的做法相对于 Post 请求来说是不太安全的,因为请求的 url 会被保留在历史记录中。
    • 请求长度:浏览器由于对 url 长度的限制,所以会影响 get 请求发送数据时的长度。(url长度限制原因:实际上HTTP协议规范并没有对get方法请求的url长度进行限制,这个限制是特定的浏览器及服务器对它的限制。get方法中的URL长度最长不超过2083个字符,这样所有的浏览器和服务器都可能正常工作。)
    • 参数类型:get的参数类型只接受ASCII字符,post 的参数传递支持更多的数据类型。

四、POST和PUT请求的区别

  • PUT请求是向服务器端发送数据,从而修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。(可以理解为时更新数据)
  • POST请求是向服务器端发送数据,该请求会改变数据的种类等资源,它会创建新的内容。(可以理解为是创建数据)

五、常见的HTTP请求头和响应头

1.HTTP Request Header 常见的请求头

  • Accept:浏览器能够处理的内容类型
  • Accept-Charset:浏览器能够显示的字符集
  • Accept-Encoding:浏览器能够处理的压缩编码
  • Accept-Language:浏览器当前设置的语言
  • Connection:浏览器与服务器之间连接的类型
  • Cookie:当前页面设置的任何Cookie
  • Host:发出请求的页面所在的域
  • Referer:发出请求的页面的URL
  • User-Agent:浏览器的用户代理字符串

2.HTTP Responses Header 常见的响应头

  • Date:表示消息发送的时间,时间的描述格式由rfc822定义
  • server:服务器名称
  • Connection:浏览器与服务器之间连接的类型
  • Cache-Control:控制HTTP缓存
  • content-type:表示后面的文档属于什么MIME类型

六、浏览器地址栏输入URL 敲下回车后发生了什么

  1. 解析URL
    • 首先会对 URL 进行解析,分析所需要使用的传输协议和请求的资源的路径。如果输入的 URL 中的协议或者主机名不合法,将会把地址栏中输入的内容传递给搜索引擎。如果没有问题,浏览器会检查 URL 中是否出现了非法字符,如果存在非法字符,则对非法字符进行转义后再进行下一过程。
  2. 缓存判断
    • 浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么就直接使用,否则向服务器发起新的请求。
  3. DNS解析
    • 下一步首先需要获取的是输入的 URL 中的域名的 IP 地址,首先会判断本地是否有该域名的 IP 地址的缓存,如果有则使用,如果没有则向本地 DNS 服务器发起请求。本地 DNS 服务器也会先检查是否存在缓存,如果没有就会先向根域名服务器发起请求,获得负责的顶级域名服务器的地址后,再向顶级域名服务器请求,然后获得负责的权威域名服务器的地址后,再向权威域名服务器发起请求,最终获得域名的 IP 地址后,本地 DNS 服务器再将这个 IP 地址返回给请求的用户。用户向本地 DNS 服务器发起请求属于递归请求,本地 DNS 服务器向各级域名服务器发起请求属于迭代请求。
  4. 获取MAC地址
    • 当浏览器得到 IP 地址后,数据传输还需要知道目的主机 MAC 地址,因为应用层下发数据给传输层,TCP 协议会指定源端口号和目的端口号,然后下发给网络层。网络层会将本机地址作为源地址,获取的 IP 地址作为目的地址。然后将下发给数据链路层,数据链路层的发送需要加入通信双方的 MAC 地址,本机的 MAC 地址作为源 MAC 地址,目的 MAC 地址需要分情况处理。通过将 IP 地址与本机的子网掩码相与,可以判断是否与请求主机在同一个子网里,如果在同一个子网里,可以使用 APR 协议获取到目的主机的 MAC 地址,如果不在一个子网里,那么请求应该转发给网关,由它代为转发,此时同样可以通过 ARP 协议来获取网关的 MAC 地址,此时目的主机的 MAC 地址应该为网关的地址。
  5. TCP三次握手
    • 下面是 TCP 建立连接的三次握手的过程,首先客户端向服务器发送一个 SYN 连接请求报文段和一个随机序号,服务端接收到请求后向服务器端发送一个 SYN ACK报文段,确认连接请求,并且也向客户端发送一个随机序号。客户端接收服务器的确认应答后,进入连接建立的状态,同时向服务器也发送一个ACK 确认报文段,服务器端接收到确认后,也进入连接建立状态,此时双方的连接就建立起来了。
  6. HTTPS握手
    • 如果使用的是 HTTPS 协议,在通信前还存在 TLS 的一个四次握手的过程。首先由客户端向服务器端发送使用的协议的版本号、一个随机数和可以使用的加密方法。服务器端收到后,确认加密的方法,也向客户端发送一个随机数和自己的数字证书。客户端收到后,首先检查数字证书是否有效,如果有效,则再生成一个随机数,并使用证书中的公钥对随机数加密,然后发送给服务器端,并且还会提供一个前面所有内容的 hash 值供服务器端检验。服务器端接收后,使用自己的私钥对数据解密,同时向客户端发送一个前面所有内容的 hash 值供客户端检验。这个时候双方都有了三个随机数,按照之前所约定的加密方法,使用这三个随机数生成一把秘钥,以后双方通信前,就使用这个秘钥对数据进行加密后再传输。
  7. 返回数据
    • 当页面请求发送到服务器端后,服务器端会返回一个 html 文件作为响应,浏览器接收到响应后,开始对 html 文件进行解析,开始页面的渲染过程。
  8. 页面渲染
    • 浏览器首先会根据 html 文件构建 DOM 树,根据解析到的 css 文件构建 CSSOM 树,如果遇到 script 标签,则判端是否含有 defer 或者 async 属性,要不然 script 的加载和执行会造成页面的渲染的阻塞。当 DOM 树和 CSSOM 树建立好后,根据它们来构建渲染树。渲染树构建好后,会根据渲染树来进行布局。布局完成后,最后使用浏览器的 UI 接口对页面进行绘制。这个时候整个页面就显示出来了。
  9. TCP四次挥手
    • 最后一步是 TCP 断开连接的四次挥手过程。若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。但是因为 TCP 连接是双向的,所以服务端仍旧可以发送数据给客户端。服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态。客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,就进入 CLOSED 状态。当服务端收到确认应答后,也便进入 CLOSED 状态。

七、URL组成部分

例如:http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

  • 协议部分
    • 该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符
  • 域名部分
    • 该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用
  • 端口部分
    • 跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口(HTTP协议默认端口是80,HTTPS协议默认端口是443)
    • 作用:一台主机(对应一个IP地址)可以提供很多服务。如果只有一个IP,就无法区分不同的网络服务,所以采用”IP+端口号”来区分不同的服务
  • 虚拟目录部分
    • 从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”
  • 文件名部分
    • 从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名
  • 参数部分
    • 从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符
  • 锚部分
    • 从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

八、常见状态码

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

1. 1xx

  • 代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。
  • 100:(客户端继续发送请求,这是临时响应):这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。
  • 101:服务器根据客户端的请求切换协议,主要用于websocket或http2升级。

2. 2xx

  • 代表请求已成功被服务器接收、理解、并接受。
  • 200(成功):请求已成功,请求所希望的响应头或数据体将随此响应返回。
  • 201(已创建):请求成功并且服务器创建了新的资源。
  • 202(已创建):服务器已经接收请求,但尚未处理。
  • 203(非授权信息):服务器已成功处理请求,但返回的信息可能来自另一来源。
  • 204(无内容):服务器成功处理请求,但没有返回任何内容。
  • 205(重置内容):服务器成功处理请求,但没有返回任何内容。
  • 206(部分内容):服务器成功处理了部分请求。

3. 3xx

  • 表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
  • 300(多种选择):针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
  • 301(永久移动):请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
  • 302(临时移动): 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
  • 303(查看其他位置):请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
  • 304 (not modified):表示服务器允许访问资源,但因发生请求未满足条件的情况。
  • 305 (使用代理): 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
  • 307 (临时重定向): 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求,临时重定向,和302含义类似,但是期望客户端保持请求方法不变向新的地址发出请求。

4. 4xx

  • 代表了客户端看起来可能发生了错误,妨碍了服务器的处理。
  • 400(错误请求): 服务器不理解请求的语法。
  • 401(未授权): 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
  • 403(禁止): 服务器拒绝请求。
  • 404(未找到): 服务器找不到请求的网页。
  • 405(方法禁用): 禁用请求中指定的方法。
  • 406(不接受): 无法使用请求的内容特性响应请求的网页。
  • 407(需要代理授权): 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
  • 408(请求超时): 服务器等候请求时发生超时。

5. 5xx

  • 表示服务器无法完成明显有效的请求。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生。
  • 500(服务器内部错误):服务器遇到错误,无法完成请求。
  • 501(尚未实施):服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
  • 502(错误网关): 服务器作为网关或代理,从上游服务器收到无效响应。
  • 503(服务不可用): 服务器目前无法使用(由于超载或停机维护)。
  • 504(网关超时): 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
  • 505(HTTP 版本不受支持): 服务器不支持请求中所用的 HTTP 协议版本。

九、HTTP状态码304是多好还是少好

  • 服务器为了提高网站访问速度,对之前访问的部分页面指定缓存机制,当客户端在此对这些页面进行请求,服务器会根据缓存内容判断页面与之前是否相同,若相同便直接返回304,此时客户端调用缓存内容,不必进行二次下载。状态码304不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应。搜索引擎蜘蛛会更加青睐内容源更新频繁的网站。通过特定时间内对网站抓取返回的状态码来调节对该网站的抓取频次。若网站在一定时间内一直处于304的状态,那么蜘蛛可能会降低对网站的抓取次数。相反,若网站变化的频率非常之快,每次抓取都能获取新内容,那么日积月累的回访率也会提高。

十、同样是重定向,307、303、302的区别

  • 302是http1.0的协议状态码,在http1.1版本的时候为了细化302状态码⼜出来了两个303和307。
  • 303明确表示客户端应当采⽤get⽅法获取资源,它会把POST请求变为GET请求进⾏重定向。
  • 307会遵照浏览器标准,不会从post变为get。