计算机网络-6-5-超文本传输协议HTTP

超文本传输协议HTTP

HTTP操作过程

HTTP协议定义了浏览器(万维网客户进程)怎么向万维网服务器请求万维网文档,以及服务器怎么把文档传送给浏览器。从层次的角度来看,HTTP是面向事物的应用层协议。

每个万维网网点都有一个服务器进程,,它不断地监听 TCP 的端口 80,以便发现是否有浏览器(即万维网客户。请注意,浏览器和万维网客户是同义词)向它发出连接建立请求。一旦监听到连接建立请求并建立了 TCP 连接之后,浏览器就向万维网服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应。最后,TCP 连接就被释放了。在浏览器和服务器之间的请求和响应的交互,必须按照规定的格式和遵循一定的规则。这些格式和规则就是超文本传送协HTTP。

HTTP使用了面向连接的TCP作为运输层协议,保证了数据的可靠传输,HTTP不必考虑数据在传输过程中被丢弃后又怎样被重传。但是HTTP协议本身是无连接的。这就是说HTTP协议采用了TCP连接,但是通信双方在交换HTTP报文之前不需要建立HTTP连接。在1997年采用的是RFC 1945定义的HTTP/1.0协议。现在普遍使用的是升级版本HTTP/1.1[RFC 7231]。

HTTP协议是无状态的,HTTP的无状态特性简化了服务器的设计,使得HTTP更容易支持大量并发的HTTP请求。

下面我们粗略估算一下,从浏览器请求一个万维网文档到收到整个文档所需的时间(图 6-10)。用户在点击鼠标链接某个万维网文档时,HTTP 协议首先要和服务器建立 TCP连接。这需要使用三报文握手。当建立 TCP 连接的三报文握手的前两部分完成后(即经过一个RTT时间后),万维网客户就把HTTP请求报文,作为建立TCP连接的三报文握手中的第三个报文的数据,发送给万维网服务器。服务器收到HTTP请求之后就把所请求的文档作为响应报文返回给客户。

image

从图 6-10 可看出,请求一个万维网文档所需的时间是该文档的传输时间(与文档大小成正比)加上两倍往返时间 RTT(一个RTT用于连接TCP 连接,另一个RTT用于请求和接收万维网文档。TCP 建立连接的三报文握手的第三个报文段中的数据,就是客户对万维网文档的请求报文)。

HTTP/1.0协议的主要缺点,就是每次请求报文的时候,就是每次请求一个文档就需要两倍RTT时间的开销,这种非持续连接会使得万维网服务器负担很重。因此使用并行TCP连接可以很好的解决这个问题。

HTTP/1.1协议较好的解决了这个问题,它使用持续连接(persistent connection),所谓持续连接就是万维网服务器在发送响应后仍然在一段时间内能够继续保持这条连接,使同一个客户和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。

HTTP/1.1的工作方式有两种:

  1. 非流水线特点(without pipelining):是客户在收到前一个响应后才能发出下一个请求。因此,在TCP建立连接后,客户每访问一次对象都要用去一个往返时间RTT,这比非持续连接要用去两倍RTT时间的开销,节省了建立TCP连接所需的一个RTT时间。这比非持续连接要用去两倍的RTT开销,节省了建立TCP连接所需的一个RTT时间,但非流水线方式还是有缺陷的,因为服务器发完一个对象后,其TCP处于空闲状态,浪费了服务器资源。

  2. 流水线特点:是客户收到HTTP的响应报文之前就能够发送新的请求报文。于是一个接着一个的请求报文到达服务器后,服务器就可以连续的发回响应报文。因此,使用流水线方式时,客户访问所有的对象只需要花费一个RTT时间,流水线工作方式使得TCP连接中的空闲时间减少,提高了下载文档的效率。

代理服务器

代理服务器(proxy server)是一种网络实体,它又成为万维网高速缓存(Web cache)。代理服务器把最近的一些请求和响应暂存到本地磁盘中,当新的请求到达的时候,若代理服务器发现这个请求与暂时存放的请求相同,就返回暂存的响应,而并不需要要再根据URL再次请求网络资源。代理服务器可以在客户端或者服务端工作,也可以在中间系统上工作。

HTTP的报文结构

HTTP有两种报文:

  1. HTTP请求报文:从客户向服务器发送请求报文(图6-12a)
  2. HTTP响应报文:从服务器到客户的回答(图6-12b)

image

由于HTTP是面向报文的(text-oriented),因此在报文中的每一个字段都是一些ASCII码串,因而各个字段的长度都是不确定的。

HTTP请求报文和响应报文都是由三个部分组成。可以看出,这两种报文格式的区别就是开始行不同

  1. 开始行:用于区分是请求报文和响应报文。在请求报文中的开始行叫做请求行(Request-Line),而在响应报文中的开始行叫做状态行(Status-Line)。在开始行的三个字段之间都以空格分隔开,最后的CR和LF代表回车和换行。
  2. 首部行:用来说明服务器、浏览器等相关报文的一些信息。首部行既可以有好几行,也可以没有。在每一个首部行中都有首部字段名和它的值,在每一行结束的时候都有“回车”和“换行”。
  3. 实体主体(entity body):一般不使用。

在服务器上存放用户的信息:Session

在客户浏览器上存放信息:Cookie

posted @ 2021-09-09 00:32  LilyFlower  阅读(150)  评论(0编辑  收藏  举报