HTTP 协议原理

339 阅读13分钟

了解HTTP协议

了解HTTP协议基础,熟知HTTP协议的发展,从TCP/IP协议族群中理解HTTP工作原理

浏览器背后的故事

  • HTTP 超文本传输协议(HTTP)是一种通讯协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器
  • HTTP是一个属于应用层的面向对象的协议,由于其简洁、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断的完善和扩展

HTTP协议的发展历史

  1. 1990年十月:万维网之父TimBerners-Lee最早提出了HTTP协议
  2. 1991年:HTTP0.9诞生
  3. 1996年5月:HTTP1.0发布 (增加了请求头域和响应的头域,增加了header和post方法,支持一些长链接和缓存等等)
  4. 1997年1月:HTTP1.1发布
  5. 2015年5月:HTTP2.0提出 (http性能提升,提升了低延迟和高吞吐量)
  6. 至今:HTTP3.0 QUIC协议 (基于UDP,面向无连接通信,TCP面向链接通信)

透过TCP/IP看HTTP

HTTP协议是构建在TCP / IP协议之上的,是TCP / IP协议的一个子集,为了更好的理解HTTP协议,我们先了解一个TCP / IP的相关知识

  1. TCP / IP协议族

    • TCP / IP协议其实是一系列与互联网相关的协议集合起来的总称
    • 分层管理是TCP/IP协议的重要特征
  2. TCP/IP协议族分层

    • TCP/IP协议族分层是由一个四层协议组成的系统,这四层分别为: ***

    1. 应用层
      • 应用层一般是我们编写的应用程序,决定了向用户提供了应用服务。应用层可以通过系统调用与传输层进行通讯。如:FTP、DNS、HTTP等。
    2. 传输层
      • 传输层通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能。
      • 在传输层有两个性质不同的协议:TCP(面向连接)/和UDP(无连接)
    3. 网络层
      • 网络层用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传输给对方。

    4. 数据链路层
      • 链路层用来处理连接网络的硬件部分,包括控制操作系统、硬件设备驱动、NIC(Network Interace Card,网络适配器)以及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。

  3. 数据包的封装过程

    从上至下执行,买一层都会添加该层信息向下传输,链路层还会添加头部和尾部信息 ***

  4. http 数据传输过程

    发送端发送数据时,数据会从上层传输到下层,且每经过一层都会被打上该层的头部信息。而接受端接收数据时,数据会从下层传输到上层,传输前会把下层的头部信息删除。

    ***

  5. 传输层——TCP 三次握手

    使用 TCP 协议进行通信的双方必须建立连接,然后才能开始传输数据。为了确保连接上方可靠性,在双方建立连接时,TCP 协议采用了三次握手策略 TCP三次握手

    1. 第一次握手

      第一次握手:客户端发送带有SYN标志的连接请求报文段,然后进入SYN_SEND状态,等待服务端确认。

    2. 第二次握手

      第二次握手:服务端接收到客户端的SYN报文段后,需要发送ACK信息对这个SYN报文段进行确认。同时,还要发送自己的SYN请求信息。服务端会将上述的信息放到一个报文段中(SYN + ACK报文段),一并发送给客户端,此时服务端将会进入SYN_RECV状态

    3. 第三次握手

      客户端接收到服务端的SYN+ACK报文段后,会向服务端发送ACK确认报文段,这个报文段发送完毕后,客户端和服务端都进入 ESTABLISHED 状态,完成 TCP 三次握手

    4. 三次握手的意义就是确认多方是否具备发送和接收能力,建立连接最少需要建立三次通信

      • 第一次握手:客户端发送请求给服务端,这时服务端接收到了客户端的请求,但此时客户端并不知道服务端是否接收到了自己的请求。

      • 第二次握手:服务端响应客户端的请求,这时客户端就知道了服务端具备接收和响应的能力,但是服务端不知道自己是不是发送了过去。

      • 第三次握手:客户端发送请求给服务端,表示我已经接收到了你的请求,这时双方都知道了自己具备通信的能力,然后开始连接通信。

DNS 域名解析概述

通常我们访问一个网站,使用的是主机名或者域名来进行访问的,因为相对于IP地址(一组纯数字),域名更容易让人记住。但 TCP / IP 协议使用的是IP地址进行访问的,所以必须有个机制或服务器把域名换成IP地址。DNS服务就是用来解决这个问题的,它提供域名到IP地址之间的解析服务

DNS 预解析是符合一定原则的,也就是常说的就近原则,首先将我们经常使用的一些域名和相应的IP地址建立一个映射关系,并且保存到我们的系统host文件中,所有在访问一些WEB服务器时,系统会优先从本地host文件里面寻找对应的IP地址,如果找到就直接使用host文件中的IP地址,毕竟这是最快的。

在生活中要访问Google或者其他操作会涉及到修改host文件,这个文件中的域名可能指向了一个香港的地址或者是一个镜像,通过这种强制修改的方式来指定域名对应的IP。

如果在host文件中并没有我们要的IP地址,系统会向本地的DNS服务发起请求,但本地的DNS服务是有限的,如果本地的DNS服务没有找到对应的IP地址,那本地的DNS服务会一层一层的向上一级的DNS服务器发送请求直到DNS根服务器,如果找到了的话就会进行回传,最终把找到的IP地址返回给浏览器。

回溯HTTP事务处理过程

http事务处理过程

  • 当客户端访问Web站点时,首先会通过DNS服务器查询到域名的IP地址。然后浏览器生成HTTP请求,并通过TCP/IP协议发送给WEB服务器。WEB服务器接收到请求后会根据请求生成响应内容,并通过TCP/IP协议返回给客户端。

http事务处理过程

近距离接触HTTP

http 协议特点

  • 协议特点
    1. 支持客户端/服务端模式
      • 客户端/服务器模式工作的方式是有客户端向服务端发出请求,服务端响应请求,并执行相应服务.
    2. 简单快速
      • 客户端向服务端发送请求时,只需要传送请求方法和路径
      • 常用的请求方法GET POST HEAD,每一种方法规定了客户端与服务端联系的类型不同.
      • 由于HTTP协议简单,使得HTTP服务端的程序规模小,因而通信速度很快
    3. 灵活
      • HTTP允许传输任意类型的数据对象
      • 正在传输的类型由 Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记
    4. 无连接
      • 无连接的含义是限制每次连接只处理一个请求
      • 服务器处理完客户端请求,并收到客户端的应答后,即断开连接
      • 采用这种方式可以节省传输时间
    5. 无状态
      • HTTP协议是无状态协议

        无状态是指对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则必须重新传送,这样可能导致每次连接传送的数据量增大

      • 另一方面,在服务器不需要先前信息时它的应答就较快

蜜汁兄弟——URI与URL

Q: 我们在浏览器中输入的Web地址应该叫URL还是URi ?

A: 我们访问的就是 URL

B: 不!其实那是URI好不好!

  • URI: 一个紧凑的字符串,用来标示抽象或物力资源
  • A URI 可以进一步被分为定位符/名字或两者都是
  • 术语: "Uniform Resource Locator" (URL)是URI的子集,除了确定一个资源,还提供了一种定位该资源的主要访问机制(如网络"位置")

看看无所不能的维基百科如何解释它们之间的关系

  • URI 可以分为 URL&URN或同时具备locators和names特性的一个东西

  • URN 作用就好像一个人的名字,URL就像一个人的地址

  • 换句话说:URN 确定了东西的身份,URL提供了找到它的方式

  • 总结:

    1. URL 是 URI 的一种,但不是所有的URI都是URL
    2. URI 和 URL 最大的差别是"访问机制"
    3. URN 是唯一标识的一部分,是身份信息
  • 练习

    	
       - 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 URN
       
    

HTTP报文结构分析-请求报文

请求报文图

  • HTTP 的报文头大体可以分为四类,分别是
    1. 通用报文头

    2. 请求报文头

    3. 响应报文头

    4. 实体报文头

ACCEPT

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

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

Accept: / 代表浏览器可以处理任何类型

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

Accept-Encoding

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

Accept-Language

  • 作用:浏览器申明自己接收的语言
    	Accept-Language:zh-cn,zh:q=0.7,en-us,en;q=0.3
    
    客户端在服务器有中文版资源的情况下,会请求其返回中文版对应的响应,没有中文版是,则请求返回英文版响应。

Connection

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

Host/Origin

  • 作用:请求报头域主要用于指定被请求资源的Internet主机和端口号,他通常从HTTP URL中提取出来的。 我们在浏览器中输入:www.fljf.com:8080

浏览器发送的请求信息中,就会包含Host请求报头域,如下:Host: www.fljf.com:8080

Referer

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

User-Agent

  • 作用:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本。
  • 很多情况下我们会通过User-Agent来判断服务器类型,从而进行不同的兼容设计。

Content-Type

  • 作用:说明了报文体内对象的媒体类型
    1. text/html: HTML格式

    2. text/plain: 纯文本格式

    3. text/xml: XML格式

    4. image/jpeg: jpg图片格式

    5. image/png: png 图片格式

    6. application/xhtml+xml: XHTML格式

    7. application/xml :XML数据格式

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

    9. application/json:JSON数据格式

    10. application/pdf:pdf格式

    11. application/msword:Word文档格式

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

    13. application/x-wwww-form-urlencoded: 表单提交

报文结构分析-响应报文

响应报文图片

HTTP 请求方法剖析

  • HTTP/1.1 常用方法
    1. GET
      • GET 方法用来请求访问已被URI识别的资源
      • 指定的资源经服务端解析后返回响应内容
      • 数据作为url中的一部分
      • 容量限制
        1. iE 2803
        2. firefox 65536
        3. chrome 8132
        4. safiar 80000
        5. opera 190000
    2. POST
      • POST 方法与GET功能类似,一般用来传输实体的主体
      • POST 方法的主要目的不是获取响应主体的内容
      • 数据作为请求体中的一部分
      • 与GET请求的区别:
        1. GET是通过URL传递数据,而POST传递的数据在HTTP数据包的body里面
        2. 大小限制
        3. 安全性
    3. PUT
      • 从客户单向服务端传送数据取代指定的文档的内容
      • PUT方法与POST方法最大的不同是:PUT是幂等的(不管进行多少重复的操作,都是实现同样的结果,总在一个地方重复操作)
      • 因此,我们更多的时候将PUT方法用作传输资源
      • HTTP1.1 的 PUT 默认不带验证机制
    4. HEAD
      • 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
      • 验证超链接的可用性
    5. DELETE
      • 请求服务端删除指定的资源。
      • HTTP1 中也同样不带有验证机制
    6. OPTIONS
      • 用来查询针对请求的URI指定的资源支持的方法
      • OPTIONS方法图片
    7. TRACE
      • 回显服务器收到的请求,主要用于测试或诊断
      • 容易引发XST(跨站攻击)
    8. CONNECT
      • 开启一个客户端与所请求资源之间的双向沟通的通道,他可以用来创建隧道