HTTP原理与概述

2019-03-10  本文已影响0人  YKBlog

更多内容请移步个人站:YKBLog.top

HTTP协议


HTTP简介

HTTP协议(HyperText Transfer Protocol,超文本传输协议)
  用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
  HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。在TCP/IP四层协议的应用层。关于TCP/IP四层结构。

HTTP 发展史

HTTP/0.9

最早版本是1991年发布的0.9版。
  该版本极其简单,只有一个命令GET。GET /index.html
  协议规定,服务器只能回应HTML格式的字符串,不能回应别的格式。服务器发送完毕,就关闭TCP连接。

HTTP/1.0

1996年5月,HTTP/1.0 版本发布,内容大大增加。
  首先,任何格式的内容都可以发送。这使得互联网不仅可以传输文字,还能传输图像、视频、二进制文件。这为互联网的大发展奠定了基础。
  其次,除了GET命令,还引入了POST命令和HEAD命令,丰富了浏览器与服务器的互动手段。
  再次,HTTP请求和回应的格式也变了。除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。其他的新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。

text/plain
text/html
text/css
image/jpeg
image/png
image/svg+xml
audio/mp4
video/mp4
application/javascript
application/pdf
application/zip
application/atom+xml
Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate

客户端在请求时,用Accept-Encoding字段说明自己可以接受哪些压缩方法。Accept-Encoding: gzip, deflate

缺点
  每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢(slow start)。所以,HTTP 1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题就愈发突出了。
  为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection字段。Connection: keep-alive
  这个字段要求服务器不要关闭TCP连接,以便其他请求复用。服务器同样回应这个字段。一个可以复用的TCP连接就建立了,直到客户端或服务器主动关闭连接。但是,这不是标准字段,不同实现的行为可能不一致,因此不是根本的解决办法。

HTTP/1.1

1997年1月,HTTP/1.1 版本发布,只比 1.0 版本晚了半年。
  它进一步完善了 HTTP 协议,一直用到了20年后的今天,直到现在还是最流行的版本。

缺点
  虽然1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为"队头堵塞"(Head-of-line blocking)。
  为了避免这个问题,只有两种方法:一是减少请求数,二是同时多开持久连接。这导致了很多的网页优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等等。如果HTTP协议设计得更好一些,这些额外的工作是可以避免的。

HTTP/2

2015年,HTTP/2 发布。
  它不叫 HTTP/2.0,是因为标准委员会不打算再发布子版本了,下一个新版本将是 HTTP/3。

主要特点

HTTP 模型和工作过程


HTTP 模型

HTTP由请求和响应构成,是一个标准的客户端服务器模型(B/S)。
HTTP协议永远都是客户端发起请求,服务器回送响应。如下图:

image
  HTTP是一个无状态的协议。
  无状态是指客户机(Web浏览器)和服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息.HTTP遵循请求(Request)/应答(Response)模型。客户机(浏览器)向服务器发送请求,服务器处理请求并返回适当的应答。所有HTTP连接都被构造成一套请求和应答。

HTTP工作过程

一次HTTP操作称为一个事务,其工作整个过程如下:

  1. 地址解析
      例如:用客户端浏览器请求这个页面:http://localhost.com:8080/index.html
      从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址, 在这一步,需要域名系统DNS解析域名'localhost.com',得主机的IP地 解析得到的结果如下:
    协议名:http
    主机名:localhost.com
    端口:8080
    对象路径:/index.html
  2. 封装数据报
    封装HTTP请求数据包
      把以上部分结合本机自己的信息,封装成一个HTTP请求数据包封装成TCP包。
    建立TCP连接(TCP的三次握手)
      在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80,这里是8080端口。
  3. 客户机发送请求命令
      建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。
  4. 服务器响应
      服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
      实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
  5. 服务器关闭TCP连接
      一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码
    Connection:keep-alive
      TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

http协议栈中各层数据流
  客户端会将请求封装成http数据包-->封装成tcp数据包-->封装成ip数据包--->封装成数据帧--->硬件将帧数据转换成bit流(二进制数据)-->最后通过物理硬件(网卡芯片)发送到指定地点。
  服务器硬件首先收到bit流, 然后转换成ip数据包。于是通过ip协议解析ip数据包,然后又发现里面是tcp数据包,就通过tcp协议解析Tcp数据包,接着发现是http数据包通过http协议再解析http数据包得到数据。
[图片上传失败...(image-9a4420-1552193867984)]

HTTPS 工作原理

HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer)
  是以安全为目标的HTTP通道,简单讲是HTTP的安全版。
  即HTTP下加入SSL层,HTTPS的安全基础是SSL。其所用的端口号是443。
  SSL:安全套接层,是netscape公司设计的主要用于web的安全传输协议。这种协议在WEB上获得了广泛的应用。通过证书认证来确保客户端和网站服务器之间的通信数据是加密安全的。
有两种基本的加解密算法类型

  1. 对称加密(symmetrcic encryption)
      密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES,RC5,3DES等;
      对称加密主要问题是共享秘钥,除你的计算机(客户端)知道另外一台计算机(服务器)的私钥秘钥,否则无法对通信流进行加密解密。解决这个问题的方案非对称秘钥。
  2. 非对称加密
      使用两个秘钥:公共秘钥和私有秘钥。私有秘钥由一方密码保存(一般是服务器保存),另一方任何人都可以获得公共秘钥。
      这种密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。
    下面看一下https的通信过程:
    image

过程大致如下

https通信的优点
通信安全,具体如下:

  1. 客户端产生的密钥只有客户端和服务器端能得到;
  2. 加密的数据只有客户端和服务器端才能得到明文;

其他


URL长度限制

Http协议并没有明确规定
  在Http1.1协议中并没有提出针对URL的长度进行限制,RFC协议里面是这样描述的,HTTP协议并不对URI的长度做任何的限制,服务器端必须能够处理任何它们所提供服务多能接受的URI,并且能够处理无限长度的URI,如果服务器不能处理过长的URI,那么应该返回414状态码。
  虽然Http协议规定了,但是Web服务器和浏览器对URI都有自己的长度限制。服务器的限制比如:Nginx和Tomcat对于url的长度限制,它们都是通过控制http请求头的长度来进行限制的,nginx的配置参数为large_client_header_buffers,tomcat的请求配置参数为maxHttpHeaderSize,都是可以自己去进行设置。

get和post的区别

跨站攻击


CSRF

CSRF(Cross-site request forgery,跨站请求伪造) 顾名思义,是伪造请求,冒充用户在站内的正常操作。
  例如,一论坛网站的发贴是通过 GET 请求访问,点击发贴之后 JS 把发贴内容拼接成目标 URL 并访问: http://example.com/bbs/create_post.php?title=标题&content=内容
  那么,我们只需要在论坛中发一帖,包含一链接:http://example.com/bbs/create_post.php?title=我是脑残&content=哈哈
  只要有用户点击了这个链接,那么他们的帐户就会在不知情的情况下发布了这一帖子。可能这只是个恶作剧,但是既然发贴的请求可以伪造,那么删帖、转帐、改密码、发邮件全都可以伪造。
如何防范 CSRF 攻击?可以注意以下几点:

Token使用原则

  • Token要足够随机—-只有这样才算不可预测
  • Token是一次性的,即每次请求成功后要更新Token—-这样可以增加攻击难度,增加预测难度
  • Token要注意保密性—-敏感操作使用 post,防止 Token 出现在 URL 中

注意:过滤用户输入的内容不能阻挡 csrf,我们需要做的是过滤请求的来源。

XSS

XSS( Cross Site Scripting,跨站脚本攻击),是注入攻击的一种。
  其特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径,例如发布评论,提交含有 JavaScript 的内容文本。这时服务器端如果没有过滤或转义掉这些脚本,作为内容发布到了页面上,其他用户访问这个页面的时候就会运行这些脚本。
  运行预期之外的脚本带来的后果有很多中,可能只是简单的恶作剧——一个关不掉的窗口:

  while (true) {
      alert("你关不掉我~");
  }

也可以是盗号或者其他未授权的操作。
  XSS 是实现 CSRF 的诸多途径中的一条,但绝对不是唯一的一条。一般习惯上把通过 XSS 来实现的 CSRF 称为 XSRF。
如何防御 XSS 攻击?
就是过滤用户的输入
  如果不需要用户输入 HTML,可以直接对用户的输入进行 HTML escape 。它现在会像普通文本一样显示出来,变得无毒无害,不能执行了。
  当我们需要用户输入 HTML 的时候,需要对用户输入的内容做更加小心细致的处理。仅仅粗暴地去掉 script 标签是没有用的,任何一个合法 HTML 标签都可以添加 onclick 一类的事件属性来执行 JavaScript。更好的方法可能是,将用户的输入使用 HTML 解析库进行解析,获取其中的数据。然后根据用户原有的标签属性,重新构建 HTML 元素树。构建的过程中,所有的标签、属性都只从白名单中拿取。

更多内容请移步个人站:YKBLog.top

上一篇下一篇

猜你喜欢

热点阅读