HTTP概述
web通信
HTTP是现代全球因特网中使用的公共语言,Web浏览器、服务器和相关的Web应用程序都是通过HTTP相互通信的。且因为HTTP使用的是可靠的数据传输协议(TCP),能够确保数据在传输过程中不会被损坏或产生混乱。
最常见的HTTP客户端就是Web浏览器,如chrome、edge等,Web内容存储在Web服务器上,因使用HTTP协议,也会被称为HTTP服务器。
大致了解了通信过程,那么客户端是怎么发起请求?请求又是怎么找到对应的服务器?服务器又是怎么返回内容给客户端的呢?
报文格式
在互联网体系结构中,各层中报文在不同层中以不同的形式传递,因为不同报文格式不一样,每一层都需要协议来规定统一,这个协议的报文格式就是用来统一的工具,这样为了易于机器的传递与理解。
在应用层中的HTTP协议中便定义了请求报文和响应报文
报文格式包含以下三个部分:
- 起始行 : 在请求报文中说明要做什么,在响应报文中说明出现什么情况
- 首部字段 : name :value
- 主体 : 请求主体包含了发送给服务器的数据,响应主体装载了返回给客户端的数据。
说明了通信规则后,让我们来看看是怎么进行通信的。
连接
在互联网体系结构中,某一层不需要知道它的下一层是如何实现的,仅需要知道该层通过层间接口所提供的服务。HTTP是应用层协议,将联网的细节交给了通用、可靠的因特网传输协议TCP/IP。
那么如何建立一条TCP/IP连接呢?
在HTTP双方通信之前,需要用网际协议(IP)地址和端口号在客户端和服务器之间建立一条TCP/IP连接。这个地址和端口号的信息就在URL中。如
http://202.108.22.5:80/index.html
http://baidu.com:80/index.html
http://baidu.com/index.html
如果是使用域名,则会从DNS服务器中获取到对应的IP地址
如果URL中没有端口号,默认为80
资源
我们经常上网获取资源,这个资源也就是Web资源,储存在Web服务器中。资源分为
静态资源: 文本文件、HTML文件、JPEG以及AVI等
动态资源: 根据需要生成的内容
Web服务器会为所有HTTP对象附加一个MIME(Multipurpose Internet Mail Extension)类型。当Web浏览器从服务器中取回一个对象时,会去查看相关的MIME类型,来确定应该如何处理该对象。
每个资源都需要有个名字(标识),以便于你在茫茫的网络海洋中找到你想要的资源。
URI
URI(Uniform Resource Identifier,统一资源标识符)是一种概念,可以定位到唯一资源的名字都可以称为URI。目前URI有两种形式:URL、URN
URL
URL(Uniform Resource Location,统一资源定位符),是资源标识符最常见的形式,它描述了一台特定服务器上的某资源的特定位置。大部分的URL都遵循以下的标准格式
- URL的第一部分被称为方案,说明了访问资源所使用的协议类型。如http://, https://
- 第二部分是服务器的因特网地址
- 剩余部分指定了Web服务器上的某个资源
http:// (方案) www.baidu.com (因特网地址 ) /zhidao/index.html (资源)
现在,几乎所有的URI都是URL
URN
URN(Uniform Resource Name,统一资源名),作为特定内容的唯一名称使用,与资源的所在地无关。使用这些位置无关的URN,就可以将资源四处转移,还可以通过原有URN定位,另外还可以使用多种网络访问协议来访问资源。
当然,URN不可能平白无故的就可以定位到四处移动的资源位置,它需要一个支撑架构来解析资源的位置,而这类架构的缺乏延缓了URN的应用进度。但URN确实为未来带来些期待,大家可以不用担心因网站的迁移,导致访问原有珍藏的URL,得到的却是404页面了。
协议版本
我们展望了未来,现在也来回顾一下历史。
主要说一下目前使用的HTTP版本
HTTP/1.0
1.0是HTTP第一个得到广泛使用的版本。1.0 中添加了版本号、各种HTTP首部、一些额外的方法,以及对多媒体对象的处理。1.0 规定浏览器与服务器只保持短暂的链接,浏览器的每次请求都需要与服务器建立一个TCP连接。请求一个资源所需的时间是该资源的传输时间 + 两倍往返时间RTT(一个RTT用于TCP连接,一个RTT用于请求和接收资源)
这也就意味着,每请求一个资源就要有两倍的RTT开销,而如今的服务器往往需要同时服务于大量客户的请求,每一次链接下载都导致两倍RTT的开销。另外,客户端和服务器每一次建立新的TCP连接都需要分配缓存和变量。这种非持续连接会使服务器的负担很重,这也是1.0的主要缺点。
HTTP/1.1
1.1协议较好地解决了这个问题,它是用持续连接,也就是服务器在发送响应后,仍然在一段时间内保持这条连接,使同一个客户端和该服务器可以继续在这条连接上传输后续的HTTP请求报文和响应报文。目前一些流行的浏览器的默认设置就是使用1.1的协议。
HTTP/1.1协议的持续连接有以下两种工作方式
非流水线方式:客户端在收到前一个响应之后才能发起下一个请求,因此在TCP连接建立猴,客户端每访问一次对象对咬用去一个RTT时间,相比于1.0节省了一次建立TCP连接所需要的一个RTT时间。但这种方式有个缺点,即服务器在发送完一个对象后,连接就处于空闲状态,浪费了服务器资源。
流水线方式:客户端在收到服务器的响应报文前,就可以接着发送新的请求。一个接一个的请求报文抵达服务器之后,服务器就可以连续的发回响应报文。这样的工作方式使的TCP连接中的空闲时间减少,减少了摸鱼时间,那么下载资源的效率自然就提高了。