「计算机网络:自顶向下方法阅读笔记」Web和HTTP

《计算机网络:自顶向下方法》阅读笔记系列

HTTP由两个程序实现:一个客户程序和一个服务器程序,客户程序和服务器程序运行在不同的端系统中,通过交换HTTP报文进行会话。

Web页面是由对象组成,一个对象就是指一个HTML文件或者一个JPEG图形等,并且对象可以通过URL地址寻址。多数Web页面含有一个HTML基本文件以及几个引用对象。例如:如果一个Web页面包含HTML文本和5个JPEG图形,那么这个Web页面有6个对象。每个URL地址由两部分组成:存放对象的服务器主机名和对象的路径名。例如,URL地址http://www.someSchool.edu/someDepartment/picture.gif,其中www.someSchool.edu就是主机名,/someDepartment/picture.gif就是对象的路径名。

Web服务器(Web server)实现了HTTP的服务器端,用于存储Web对象,Apache就是一种Web服务器。

Web客户和服务器交互的过程

在这里插入图片描述

概括来说:当用户请求一个Web页面时,浏览器向服务器发出对该页面中所包含对象的HTTP请求报文,服务器接收到请求并用包含这些对象的HTTP响应报文进行响应。

HTTP使用TCP作为它的支撑运输协议。HTTP客户首先发起一个与服务器的TCP连接。一旦连接建立,该浏览器和服务器进程就可以通过套接字接口访问TCP,TCP为HTTP提供可靠的数据传输服务。

服务器向客户发送被请求的文件,而不存储任何关于该客户的状态信息。加入某个特性的客户在短短的几秒内两次请求同一对象,服务器并不会因为刚刚为该客户提供过该对象就不再作出反应,而是重新发送该对象。因为HTTP服务器不保存关于客户的任何信息,所以HTTP是一个无状态协议(stateless protocol)

非持续链接和持续链接

非持续和持续连接的区别在于,在客户与服务器的交互过程中(这种交互是经TCP进行的),每个请求/响应对是经一个单独的TCP连接发送,还是说所有的请求及响应经相同的一个TCP连接发送。采用前一种方法的应用程序使用的是非持续连接(non-persistent connection),采用后一种方法的应用程序使用的是持续连接(persistent connection)

HTTP既能够使用非持续连接,也能够使用持续连接。HTTP默认方式下使用持续连接,HTTP客户和服务器也能配制成使用非持续连接。

非持续连接

每个TCP连接在服务器发送一个对象后关闭,即该连接并不为其他的对象而持续下来,且每个TCP连接只传输一个请求报文和一个相应报文。

客户在获取多个对象时,能够配置浏览器来控制连接的并行度,大部分浏览器能够打开5-10个并行的TCP连接,每条连接处理一个请求响应事务,使用并行连接可以缩短响应时间。

**往返时间(Round-Trip Time,RTT)**是指一个短分组从客户到服务器然后再返回客户所花费的时间,包括分组传播时延、分组在中间路由器和交换机上的排队时延以及分组处理时延。

在这里插入图片描述

用户点击一个超链接时,会引起浏览器在它与Web服务器之间发起一个TCP连接,这涉及一次“三次握手”的过程:

  1. 客户向服务器发送一个小TCP报文段
  2. 服务器用一个 小TCP报文段作出确认和响应
  3. 客户向服务器返回确认,并与该确认信息相结合,发送一个HTTP请求报文

当请求报文到达服务器后,服务器就在该TCP连接上发送该HTML文件。

三次握手中前两个部分所耗费的时间占用了一个RTT。HTTP请求和响应占用了另一个RTT,因此粗略来看,总的响应时间就是两个RTT加上服务器传输HTML文件的时间。

非持续连接的缺点:
  1. 必须为每一个请求的对象建立和维护一个全新的连接,在客户和服务器中对于每个这样的连接,都要分配TCP的缓冲区和保持TCP变量,这给Web服务器带来严重的负担。
  2. 每一个对象经受两倍RTT的交付时延,即一个RTT用于创建TCP,另一个RTT用于请求和接收一个对象。

持续连接

在采用HTTP 1.1持续连接的情况下,服务器在发送响应后保持该TCP连接打开,后续的请求和相应报文能够通过相同的连接进行传送。

一个完整的Web页面可以用单个持续TCP连接进行传送,甚至是位于同一台服务器的多个Web页面在从该服务器发送给同一个客户时,可以在单个持续TCP连接上进行。

如果一条连接经过一定时间间隔(可配置的超时间隔)仍未被使用,HTTP服务器就关闭该连接。

HTTP/2是在HTTP 1.1基础上构建,允许在相同连接中多个请求和回答交错,并增加了在该连接中优化HTTP报文请求和回答的机制。

HTTP报文格式

HTTP有两种报文:请求报文和相应报文。

HTTP请求报文

示例:

GET  /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr

HTTP请求报文的第一行叫做请求行(request line),其后继的行叫做首部行(header line)

请求行有3个字段:

  1. 方法字段,包括GET、POST、HEAD、PUT和DELETE,绝大部分的HTTP请求报文使用GET方法
  2. URL字段,表示被请求对象的标识,如示例中的/somedir/page.html
  3. HTTP版本字段

首部行:

  1. Host: www.someschool.edu 指明了对象所在的主机
  2. Connection: close 要求服务器在发送完被请求的对象后就关闭这条连接
  3. User-agent: Mozilla/5.0 指明用户代理,即向服务器发送请求的浏览器的类型,便于服务器为不同类型的用户代理实际发送相同对象的不同版本
  4. Accept-language: fr 是HTTP中可用的众多内容协商首部之一

在这里插入图片描述

除了请求行和首部行之外,在其后面还有一个实体体(entity body)

使用GET方法时实体体为空,而使用POST方法时才使用该实体体。POST方法常用于用户提交表单时,实体体中包含的就是用户在表单字段中的输入值。

需要注意的是用表单生成的请求报文不是必须使用POST方法。

HEAD方法类似于GET方法,当服务器收到一个使用HEAD方法的请求时,将会用一个HTTP报文进行响应,但是并不返回请求对象,应用程序开发者常用HEAD方法进行调试跟踪。

PUT方法允许用户上传对象到指定的Web服务器上指定的路径,PUT方法也被那些需要向Web服务器上传对象的应用程序使用。

DELETE方法允许用户或者应用程序删除Web服务器上的对象。

HTTP响应报文

示例:

HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last_Modified: Tue, 18 Aug 2015 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data ... )

响应报文由三个部分组成,一个初始状态行(status line)6个首部行(header line),然后是实体体(entity body)

状态行有3个字段:

  1. 协议版本字段
  2. 状态码
  3. 相应状态信息

一些常见的状态码和相关的短语包括:

  • 200 OK:请求成功,信息在返回的响应报文中
  • 301 Moved Permanently:对象已被永久转移,在Location首部行中返回新的URL,客户软件自动获取新的URL
  • 400 Bad Request:通用差错代码,表示请求不能被服务器理解
  • 404 Not Found:对象不在服务器上
  • 505 HTTP Version Not Supported:请求报文中的HTTP版本不被服务器支持

首部行:

  1. Connection: close 告诉客户,发送完报文后将关闭该TCP连接
  2. Date 指示服务器产生并发送该相应报文的日期和时间
  3. Server 指示该报文是由一台Apache Web服务器产生的
  4. Last-Modified 指示对象创建或者最后修改的日期和时间
  5. Content-Length 指示被发送对象中的字节数
  6. Content-Type 指示实体体中的对象的类型

首部行字段还有很多,可以被浏览器、Web服务器和Web缓存服务器插入。

实体体:

包含的是报文的主要部分,即请求的对象本身。

在这里插入图片描述

cookie

HTTP使用cookie来帮助Web站点服务器识别用户,对用户进行跟踪。

cookie技术有4个组件:

  1. 在HTTP响应报文中一个cookie首部行
  2. 在HTTP请求报文中一个cookie首部行
  3. 在用户端系统中保留有一个cookie文件,并由用户的浏览器进行管理
  4. 位于Web站点的一个后端数据库

在这里插入图片描述

cookie的工作过程可以描述如下(以访问amazon.com为例):

  1. 首次访问amazon.com时,发送请求报文到达该Amazon Web服务器,该Web站点将产生一个唯一识别码,并以此作为索引在后端数据库中产生一个表项
  2. Web服务器用一个包含Set-cookie首部的HTTP响应报文对客户的浏览器进行响应,Set-cookie首部中含有该识别码
  3. 浏览器收到响应报文时,在它管理的特定cookie文件中添加一行,该行包含服务器的主机名和识别码
  4. 客户继续访问Amazon网站时,每请求一个Web页面,浏览器就会查询该cookie文件并抽取对于这个网站的识别码,并将识别码放置到请求报文的Cookie首部行中
  5. Amazon服务区就可以根据cookie来识别用户,并提供购物车等服务

Web缓存

Web缓存器(Web cache)也叫代理服务器(proxy server),它是能够代表初始Web服务器来满足HTTP请求的网络实体。

Web缓存器会在自己的磁盘存储空间中存储最近请求过的对象的副本。

在这里插入图片描述

客户的浏览器可以被配置从而使得所有的HTTP请求首先被指向到Web缓存器。

Web缓存器的工作过程为:

  1. 浏览器创建一个到Web缓存器的TCP连接,并向Web缓存器中的对象发送一个HTTP请求
  2. Web缓存器检查本地是否存储了该对象副本,有的话直接对客户进行响应
  3. 没有的话,就打开一个与该对象的初始服务器的TCP连接并发送一个对该对象的HTTP请求,初始服务器收到请求后,向Web缓存器发送具有该对象的HTTP响应
  4. Web缓存器接收到该对象后,在本地存储空间存储一份副本,并向客户的浏览器用HTTP响应报文发送该副本

Web缓存器通常由ISP购买并安装。

Web缓存器的带来的优化:

  1. 大大减少客户请求的响应时间
  2. 大大减少一个机构的因特网的通信量
  3. 从整体上大大降低因特网上的Web流量,从而改善了所有应用的性能

通过使用内容分发网络(Content Distribution Network,CDN),Web缓存器正在因特网中发挥着越来越重要的内容。

条件GET方法

Web缓存器的引入带来了新的问题,即存放在缓存器中的对象副本可能是陈旧的。

HTTP协议中的条件GET(conditional GET)方法允许缓存器证实它的对象是最新的。

何为条件GET?

  1. 请求报文中使用GET方法
  2. 请求报文中包含一个“If-Modified-Since:”首部行

需要注意的是条件GET方法是Web缓存器向初始服务器发送的HTTP请求。

当Web缓存器中存储的对象副本已经好久没更新时,就向初始服务器发送条件GET,其中If-Modified-Since首部行中指明了对象的最新修改时间,服务器在收到该请求后,如果对象没有被修改过,则返回的响应报文中不会包含该对象,以此来防止浪费带宽。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值