网络编程之HTTP协议

一、HTTP协议简介

基本概念

  • 协议:是指计算机通信网络的两台计算机之间进行通信所必须遵守的规定或规则
  • HTTP协议:超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器

这里写图片描述
C/S模式架构:
HTTP协议可以从我们服务器端获取到图片以及其他的数据,这是一个很明显CS模式结构,是客服端和服务端之间通信的结构,浏览器作为HTTP客户端通过URL向服务端发送请求,然后当我们服务端获得这个请求之后会做出响应并把数据返回给我们的客户端,把需要显示的内容显示到我们的浏览器上,这是就是CS架构的HTTP协议。
上面所提的客户端是通过URL向服务端发送请求,接下来介绍下URI与URL的区别

URI与URL的区别:

  • URI:是uniform resource identifier,统一资源标识符,可以唯一标识一个资源,比如:文件、视频、音频……有三个主要组成部分
    • 访问资源的命名机制
    • 存放资源的主机名
    • 资源自身的名称,由路径表示,着重强调于资源
      这里写图片描述
  • URL:是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源;主要由三个组成部分
    • 协议
    • 存放该资源的主机IP地址
    • 主机资源的具体地址
      这里写图片描述
      小结:URL是一种具体的URI,能定位到URI具体位置,URL强调是路径,而URI强调是资源。

HTTP协议的主要特点:

TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。

  • 简单快速:客户端像服务端发送请求,只需传送请求方法和路径。请求方法常用的有GET、POST、HEAD,每种方法规定了客户端与服务端的联系类型不同。由于HTTP协议简单,使得HTTP服务器程序规模小,因而通信速度很快。
  • 无连接:无连接的含义是每次链接只处理一个请求。服务器处理完客户的请求,并收到客服端的应答后,即断开连接。采用种方式可以节约传输时间。
  • 无状态:HTTP协议是无状态协议,无状态是指协议对于处理没有记忆能力。如果后续再处理同样的内容,需要前面的信息必须重传,这样可能导致每次连接传送的数据量增大;而另一方面,在服务器不需要先前信息时它的应答速度就较快。

二、HTTP消息报头

HTTP中常用的请求头(Request):

  • Host:请求主机名
  • User-Agent:告诉服务端,发送请求的浏览器类型、操作系统等信息
  • Accept:告诉服务器,客户端支持数据类型
  • Accpt-Cahrset:告诉服务器,客户端采用的编码
  • Accept-Encoding:告诉服务端,客户端可识别的数据编码
  • Accept-Language:告诉服务器,客户端所支持的语言类型
  • If-Modified-Since:告诉服务端,资源的缓存时间
  • Referer:告诉服务端,它是从哪个资源来访问服务器的(一般用于防盗链)
  • Cookie:客户机通过这个头告诉服务器,可以向服务器带数据。
  • Connection:客户机通过这个头告诉服务器,请求完后是关闭还是保持链接。
  • Date:客户机通过这个头告诉服务器,客户机当前请求时间。

HTTP中常用的响应头(Response)

  • Location:这个头配合302状态码使用,告诉用户端找谁。
  • Server:服务器通过这个头,告诉浏览器服务器的类型 。
  • Content-Encoding:服务器通过这个头,告诉浏览器数据内容的编码格式。
  • Content-Length:服务器通过这个头,告诉浏览器回送数据的长度。
  • Content-Language:服务器通过这个头,告诉服务器的语言环境。
  • Content-Type:服务器通过这个头,回送数据的类型
  • Last-Modified:服务器通过这个头,告诉浏览器当前资源的缓存时间。
  • Refresh:服务器通过这个头,告诉浏览器隔多长时间刷新一次。
  • Content-Disposition:服务器通过这个头,告诉浏览器以下载的方式打开数据。

    更详细可以访问:http://blog.csdn.net/hzw2017/article/details/79523203

三、 HTTP1.0与HTTP1.1的区别

  • HTTP1.0产生的背景
    超文本传输协议(HyperText Transfer Protocol)伴随着计算机网络和浏览器的诞生,HTTP1.0也随之而来,处于计算机网络中的应用层。
  • HTTP1.0所做的优化
    我们知道HTTP协议(应用层)是建立在TCP协议(传输层)之上,所以的HTTP协议的优化与瓶颈都是基于TCP协议本身的,比如说我们的TCP建立连接需要三次握手,断开连接需要四次挥手,以及每次连接带来的延迟时间,这些都是可以优化的角度。
    早在HTTP1.0建立的开始,主要是将HTML文档从Web服务器传输到客服端浏览器上,随着时间的推移,前端发展到现在,HTML文档变得更加复杂了,里面可能有很多图片以及大量的css样式和js代码来显示界面,不管这些内容如何的变化,本质上都是基于HTTP协议的。

    可以从以下几个方面进行优化

  • 带宽:带宽这块目前基本已经解决了,现在已经不是拨号上网的时代了,在拨号上网时可以会成为影响网络请求的重要因素,现在网络基础设施已经得到质的升级,基本不会担心因带宽带来影响网速问题。

  • 延迟(三个方面)

    • 浏览器阻塞:浏览器对于同一个域名,同时只能有4个连接,就是说浏览器因为一些网络原因阻塞请求,不同浏览器的连接数是有限制的,当请求数达到浏览器最大连接数时,后续的请求就会被阻塞,直到前面的请求执行完毕后,才会接着后面连接请求。
    • DNS查询:浏览器需要知道目标服务器的IP才能建立连接;将我们的域名解析IP的地址就是所谓的DNS请求,通常可以利用DNS缓存来达到减少请求的目的,比如说反复查询某个域名的IP地址,不需要每次通过这个请求,而是DNS缓存就可以达到这个目的。
    • 建立连接:三次握手;HTTP协议是基于在TCP协议之上的,浏览器最快最快也只能在第三次握手后才可以携带HTTP请求报文达到真正建立连接的目的,但是这些连接是无法复用的,这就导致了每次请求都要进行三次握手,这是比较头痛的地方,尤其是在一些高延迟的场景,三次握手的延迟会更加明显。

    HTTP1.1与HTTP1.0的具体区别

  • HTTP 1.1支持持久连接在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个TCP连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接;而HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。

  • HTTP 1.1增加了更多的请求头和响应头,例如,由于HTTP 1.0不支持Host请求头字段,WEB浏览器无法使用主机头名来明确表示要访问服务器上的哪个WEB站点,这样就无法使用WEB服务器在同一个IP地址和端口号上配置多个虚拟WEB站点。在HTTP 1.1中增加Host请求头字段后,WEB浏览器可以使用主机头名来明确表示要访问服务器上的哪个WEB站点,这才实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。

可以详见http://blog.csdn.net/woshixuye/article/details/18862361

HTTP1.1与HTTP1.0存在的问题

  • HTTP1.x在传输数据时,每次都需要重新建立连接,无疑增加了大量的延迟时间(主要是针对1.0)
  • HTTP1.x在传输数据时,所有传输的内容都是明文,客户端和服务端都无法验证对方的身份,在一定程度上无法保证数据的安全性(可以通过HTTPS协议来保证数据内容的安全性)
  • HTTP1.x在使用时,header里携带的内容过大 ,在一定程度上增加了传输的成本,同时每次请求的header都不怎么变化,这样在移动端增加了用户的流量
  • 虽然HTTP1.x支持了keep-alive,来弥补多次创建连接产生的延迟,但是keep-alive使用多了同样会服务端带来大量的性能压力。

猜你喜欢

转载自blog.csdn.net/hzw2017/article/details/79520755