您的位置:首页 > 理论基础 > 计算机网络

计算机网络相关知识点整理-HTTP

2018-06-29 03:26 483 查看

什么是HTTP协议?

HTTP(超文本传输协议,HyperText Transfer Protocol)定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及定义了怎样把文档传送给浏览器,是面向事务的应用层协议。默认使用80端口。

HTTP协议的特点

  1. 使用面向连接的TCP作为运输层协议,保证了数据的可靠传输。
  2. HTTP协议本身是无连接的。 通信双方在交换HTTP报文之前不需要先建立HTTP连接(通过TCP三次握手建立连接)。
  3. HTTP协议是无状态的,HTTP协议不对请求和响应之间的通信状态进行保存。也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时相同。(使用Cookie技术可以保存客户端与服务器之间的状态信息)。

HTTP报文结构

HTTP请求报文与响应报文都是由三个部分组成的,分别为开始行(请求行)、首部行(请求头部)、实体主体(请求数据)。

  1. 请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
    HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
    请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

  2. 请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
    User-Agent:产生请求的浏览器类型。
    Accept:客户端可识别的内容类型列表。
    Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

  3. 请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

响应报文状态行:包含HTTP版本、状态码、状态码的原因短语

常见状态码

状态码都是三位数字的,分为5大类,原先有33种[RFC 2616] ,后来又增加了几种[RFC 6585]。详细状态码参考

  • 1xx:指示信息–表示请求已接收,继续处理。
  • 2xx:成功–表示请求已被成功接收、理解、接受。
  • 3xx:重定向–要完成请求必须进行更进一步的操作。
  • 4xx:客户端错误–请求有语法错误或请求无法实现。
  • 5xx:服务器端错误–服务器未能实现合法的请求。

常见状态代码、状态描述的说明如下。

  • 200 OK:客户端请求成功。
  • 301 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。
  • 302 请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。
  • 303 对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。
  • 304 如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。
  • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
  • 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
  • 403 Forbidden:服务器收到请求,但是拒绝提供服务。
  • 500 Internal Server Error:服务器发生不可预期的错误。
  • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

GET、POST区别

  1. get常用于从服务器上获取数据,post常用于向服务器传送数据

  2. GET提交,请求的数据会附在URL之后, 以?分割URL和传输数据,多个参数用&连接;例如:

    login.action?name=hyddd& password=idontknow

    如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

    POST提交:把提交的数据放置在是HTTP包的包体<request-body>中。

    因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变。

  3. 传输数据的大小:

    首先声明,HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 而在实际开发中存在的限制主要有:

    GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

    因此对于GET提交时,传输数据就会受到URL长度的限制。

    POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

  4. 安全性:

    POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了。

HTTP的缺点

  • 通信使用明文不加密,内容可能被窃听
  • 不验证通信方身份,可能遭到伪装
  • 无法验证报文完整性,可能被篡改

HTTP/1.0 、HTTP/1.1、HTTP/2.0

HTTP/1.0主要缺点:每请求一个文档就要有两倍RTT的开销,若一个网页上有很多歌链接对象(如图片等)需要依次进行链接,那么每一次链接下载都导致2*RTT的开销;另一种开销就是万维网客户与服务器每一次建立新的TCP连接都要分配缓存和变量。(浏览器并行TCP连接可以缩短响应时间)。

HTTP/1.0 VS HTTP/1.1

HTTP/1.1特点

  • 长连接 HTTP1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接

    HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用个长连接来发多个请求。

  • 带宽优化
    HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。

    这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。

    另外HTTP还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传的基础。

  • HOST域
    现在可以web server例如tomat,设置虚拟站点是非常常见的,也即是说,web
    server上的多个虚拟站点可以共享同一个ip和端口

    HTTP1.0是没有host域的,HTTP1.1才支持这个参数。

  • 错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

  • 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity
    tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

HTTP/1.1 VS HTTP/2.0

  • 新的二进制格式(Binary
    Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。

  • 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的
    id将request再归属到各自不同的服务端请求里面。

  • header压缩 HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

  • 服务端推送 把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。

HTTP2.0的多路复用和HTTP1.X中的长连接复用

  • HTTP/1.* 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接;

  • HTTP/1.1
    Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;

  • HTTP/2.0**多个请求可同时在一个连接上并行执行**。某个请求任务耗时严重,不会影响到其它连接的正常执行;

HTTP 与 HTTPS

  • HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
  • HTTP协议运行在TCP之上,所有传输的内容都是明文HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  • HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。

参考文献:
《计算机网络》谢希仁 第七版
HTTP1.0、HTTP1.1和HTTP2.0的区别

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: