计算机网络——HTTP协议

Posted into you~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机网络——HTTP协议相关的知识,希望对你有一定的参考价值。

一、HTTP协议简介

超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
HTTP由两个程序实现:一个客户程序和一个服务程序。分别运行在不同的端系统中,通过交换HTTP报文进行会。HTTP定义了这些报文的结构以及客户和服务器进行报文交换的方式。(在解释HTTP前应回顾一下web的术语)
web页面是由一个个对象构成的。一个对象只是一个文件,诸如一个html文件、一个JPEC图形或者java小程序等等。多数Web页面有一个HTML基本文件和多个对象。例,一个Web页面包含HTML文本和5个JPEC图形,那么这个页面由6个对象构成,在进行客户与服务器之间的报文交换时,客户需要请求的就是这些对象的报文形式。例如,URL地址 http://www,someSchool. edu/someDepartment/picture.gif,其中的 www.someSchool. edu就是主机名,/someDepartment/ picture. gif 就是路径名。因为Web浏览器(Web browser)实现了HTTP的客户端,所以在Web环境中我们经常交替使用“浏览器”-和“客户”这两个术语。Web服务器实现了HTTP 的服务器端,它用于存储Web对象,每个对象由URL寻址。

二、HTTP协议特点

1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力(不存储任何关于客户的状态信息)。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大(cookie的产生解决了这一问题)。另一方面,在服务器不需要先前信息时它的应答就较快。

三、URL

HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式为: http://host{":"port}{path}
http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;path指定请求资源的URI;如果URL中没有给出path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
ps.URI表示的是一个抽象的地址,URL表示的是一个详细的地址,详细见:https://blog.csdn.net/qq_32595453/article/details/80563142(URL和URI的比较与理解)

四、HTTP工作原理

首先我们先来确定一组概念,非持续连接持续链接
在许多因特网应用程序中,客户和服务器在一个相当长的时间范围内通信,其中客户发出一系列请求并且服务器对每个请求进行响应。这一系列请求可以以规则的间隔周期性地或者间断性地一个接一个发出。当这种客户-服务器的交互是经TCP进行的,应用程序的研制者就需要做一个重要决定,即每个请求/响应对是经一个单独的TCP连接发送,还是所有的请求及其响应经相同的TCP连接发送呢?采用前一种方法,该应用程序被称为使用非持续连接;采用后一种方法,该应用程序被称为使用持续连接。HTTP既能够使用非持续连接,也能够使用持续连接。尽管HTTP1.1在其默认方式下使用持续连接(HTTP1.0是非持续连接),HTTP客户和服务器也能配置成使用非持续连接。
以下是 HTTP 请求/响应的步骤:
1.客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.baidu.com。
2.发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文(HTTP报文,由请求行、请求头部、空行和请求数据4部分组成)。
3.服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4.释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接(非持续连接);若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求(持续连接);
5.客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
ps.在非持续连接中,每个TCP只传送一个请求报文和响应报文,在上例中,6个对象需要建立6个TCP连接。我们并未指明多个连接是串行还是并行,然而默认情况下,大部分浏览器会打开5~10个并行的TCP连接。

五、HTTP报文交换时间花销

首先我们来看两个概念;
RTT(Round Trip Time)
从客户端发送一个很小的数据包到服务器并返回所经历的时间
响应时间(Response time)
1.发起、建立TCP连接:1个RTT
2.发送HTTP请求消息到HTTP响应消息的前几个字节到达:1个RTT
响应消息中所含的文件/对象传输时间

由上图我们可以看到接受一个对象需要约为2RTT的时间。
非持续连接有一些缺点。第一,必须为每一个请求的对象建立和维护一个全新的连接。对于每个这样的连接,在客户和服务器中都要分配TCP 的缓冲区和保持TCP变量,这给Web服务器带来了严重的负担,因为一台Web服务器可能同时服务于数以百计不同的客户的请求。第二,就像我们刚描述的那样,每一个对象经受两倍RTT的交付时延,即一个RTT用于创建TCP,另一个RTT用于请求和接收一个对象。若对象数量庞大那么传输效率就会很低,有没有什么方法可以改进呢?
接下来我们从持续连接的角度去思考问题,首先介绍无流水/流水的持久连接:
无流水(pipelining)的持久性连接
1.客户端只有收到前一个响应后才发送新的请求
2.每个被引用的对象耗时1个RTT带有流水机制的持久性连接.HTTP1.1的默认选项
3.客户端只要遇到一个引用对象就尽快发出请求
4.理想情况下,收到所有的引用对象只需耗时约1个RTT
带有流水机制的持久性连接(HTTP1.1的默认选项)
1.客户端只要遇到一个引用对象就尽快发出请求
2.理想情况下,收到所有的引用对象只需耗时约1个RTT

接下来引入一个计算实例:
假设你在浏览某网页时点击了一个超链接,URL为“https://www.kicker.com.cn/index.html”,且该URL对应的IP地址在你的计算机上没有缓存;文件index.html引用了8个小图像。域名解析过程中,无等待的一次DNS解析请求与响应时间记为RTTd,HTTP请求传输Web对象过程的一次往返时间记为RTTh。请回答下列问题:
1)你的浏览器解析到URL对应的IP地址的最短时间是多少?最长时间是多少?
2)若浏览器没有配置并行TCP连接,则基于HTTP1.0获取URL链接Web页完整内容(包括引用的图像,下同)需要多长时间(不包括域名解析时间,下同)?
3) 若浏览器配置5个并行TCP连接,则基于HTTP1.0获取URL链接Web页完整内容需要多长时间?
4) 若浏览器没有配置并行TCP连接,则基于非流水模式的HTTP1.1获取URL链接Web页完整内容需要多长时间?基于流水模式的HTTP1.1获取URL链接Web页完整内容需要多长时间?
解答:
1)最短时间:
当本地域名解析服务器中包含要访问的URL所对应的IP地址时,所需的时间时间最短,为RTTd。
最长时间:
当本地域名解析器中不包含并且需要从根域名服务器解析时所需的时间最长,解析路径如下:客户端-本地域名服务器、本地域名服务器-根域名服务器、本地域名服务器-com.cn、cn-com、本地域名服务器-权威域名服务器,因此所需的时间为5RTTd。
2)需要html文件本身,外加8个小图像连接。时间包括发起建立TCP连接一个RTTh,HTTP请求传输Web对象过程的一次往返时间RTTh。一共29 = 18 RTTh
3)一开始建立TCP连接,获得index.html文件2个RTTh。然后由图像地址信息,在2轮并行处理下完成8个图像的加载工作。2
2个RTTh。2 + 4 = 6 RTTh。
4)无流水情况下,客户端只有收到前一个响应后才发送新的请求,每个被引用的对象耗时一个RTT。
有流水情况下,客户端只要遇到一个引用就尽快发出请求。
无流水: 2 + 8 = 10 RTTh。有流水: 2 + 1 = 3 RTTh

六、HTTP报文格式

HTTP报文分为请求报文和响应报文:
请求报文如下:

我们可以看到该报文是由ASCII码文本书写的,可以进行阅读。
1.请求行(第一行)由方法字段、URL字段和HTTP协议版本字段。
方法字段可以取不同的值,包括POST、GET、HEAD、PUT、DELETE等。
2.请求头部:位于请求行的下面
请求报文中常见的标头有:
Connetion标头(连接管理)、Host标头(指定请求资源的主机)、Range标头(请求实体的字节范围)、User-Agent标头(包含发出请求的用户信息)、Accept标头(首选的媒体类型)、Accept-Language(首选的自然语言)
3.实体体
若采用方法GET则实体体为空,采用POST实体体包含的就是用户在表单字段中输入的值。
接下来我们可以对照着以上例子观察HTTP请求报文的通用格式:

响应报文如下:

HTTP响应报文同样也分为三部分,有状态行、首部行、实体
状态行(HTTP响应报文的第一行)包括三个字段:协议版本、状态码与原因短语。
1.状态码:
1xx:这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。
2xx:这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
3xx:这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。
4xx:这类的状态码代表客户端类的错误
5xx:服务器类的错误、常遇到的状态码说明
2.响应首部(首部行):位于响应报文状态行之后
Date标头:消息产生的时间
Age标头:(从最初创建开始)响应持续时间
Server标头: 向客户端标明服务器程序名称和版本
ETage标头:不透明验证者
Location标头:URL备用的位置
Content-Length标头:实体的长度
Content-Tyep标头:实体的媒体类型
3.实体体:报文的主要部分,包含了所请求的对象本身。
接下来我们看一看响应报文的通用格式:

以上是关于计算机网络——HTTP协议的主要内容,如果未能解决你的问题,请参考以下文章

计算机网络HTTP协议(格式报头请求响应)

计算机网络HTTP协议详解

计算机网络---应用层(http协议)

计算机网络——HTTP协议

计算机网络HTTP 协议详解

计算机网络HTTP 协议详解