HTTP|HTTP是什么?是怎么发展的?( 三 )



在一个HTML网页中,可能会通过超链接引用n个资源(Web对象),而这n个web对象每一个都有自己的URL。而动态网页生成的HTML结果中也可以引用web对象,这些web对象是静态的,所以动态网页包含:静态内容(无需改变或无需执行的内容如:图片、文件、rar压缩包)和动态内容(需要执行一次才能返回给客户端,只有动态内容才需要运行)。在http1.0之后就能支持这些机制了,正是1.0中引入了MIME,使得Web服务对于多媒体的支持得到了极大的扩展,也正是1.0系列的出现,使得web服务器迅速流行开来并大大的促进了互联网的发展。

我们再来详细讨论一下整个过程:
以纯静态页面来讲,所有用户访问的内容都是一样的,由此我们来分析一个问题:
一个客户端发起Web服务请求到服务器需要经过多少个层次呢?如在浏览器输入一个url访问,第一步需要把FQDN转换成IP地址,因此在请求发出之前需要先通过DNS服务器解析FQDN,而DNS服务器可能会递归、迭代,需要消耗一些时间(在第一次访问时,记录未缓存到本地),之后客户端输入地址发送请求给服务器,服务器接收请求后,在内部需要有一个机制能够接收用户的请求,这种机制就叫做监听,监听在某个端口上,等待客户端的请求。
一旦用户请求来了,而内核通过TCP/IP协议栈发现有人监听在这个端口上,于是这个请求就可以交给这个套接字了。但如果本地没有任何一个用户进程监听在某个套接字,但有客户端来访问了,此时内核无法知道有谁能够响应这个请求,此时就会拒绝客户端请求,如:此地未启动这个服务,因此必须到内核中去注册需要使用哪一个端口并一直在这个端口上处于等待状态。所以当有请求到来时,通过TCP/IP协议的首部解码后发现用户访问的是这么一个端口,于是就把这个请求转交给这个端口,而进程又一直监听在这个端口,一旦有请求来了,可进行响应。

http报文:
TCP/IP协议在封装报文时,TCP首部主要是源端口(Source Port)、目标端口(Destination Port),IP首部主要是源IP地址(Source IP)、目标IP地址(Destination IP)。但却并没有明确说明具体访问哪个文档或资源,因此某一特定的应用在通过TCP/IP协议往外发送时,TCP/IP最多就是将报文传递到目的地,到达目的地后还需要具体协议的报文首部。因此http协议也有自己的首部,叫http首部,它明确定义了基于哪种协议获取哪个资源的,需要说明获取什么文档,
如:GET /2.html,并且还需要说明获取哪个主机的资源,因此通常还有一个首部叫:Host 加主机是HTTP1.0中引入的一种机制,在发起获取资源请求时,不但要指明获取哪个资源,还要再加上获取哪个主机的资源,这个主机一定是主机名称,这是为虚拟主机做准备的)。说白了,这一切就叫http报文。
IP:
Source IP
Destination IP
TCP:
Source Port
Destination Port
http首部:
GET/2.html
http报文分为两种:请求报文、响应报文。
报文语法:
 HTTP|HTTP是什么?是怎么发展的?
文章图片

上面两个报文的第一行称为报文"起始行(start line)";后面的标签格式的内容称作首部域(Header field),每个首部域都由名称(name)和值(value),中间用逗号分隔,另外,响应报文通常还有一个称作Body的信息主体,即响应给客户端的内容。
请求报文:
method:资源获取方法;
request-URL:请求的资源是什么;
version:对应请求资源协议的版本号;
headers:http协议首部;
headers后的空白行是必须的;
entity-body:空白行后有一些报文主体(报文内容)
响应报文:
version:对应请求的版本
status:状态(代)码,请求结果正确与否的标识符
状态码分为5类:
1xx:纯信息,与请求的资源没有太大的关系;
2xx:“成功”类的状态码信息,常用状态码:200(表示请求资源正常,已获取到正常响应);
3xx:重定向类的信息,表示请求的资源已存在,但资源已被挪到其它地方了,如:给了一个参考答案说这个资源已经被挪走了,请重新发起请求另外一个地址,并且把另外的参考地址也响应给客户端了。常用的状态码:301(表示永久重定向,永久的挪到了那个位置了)、302(临时重定向,繁忙时重定向到指定位置寻找)、304(表示请求的内容未发生任何改变,若缓存过直接使用缓存即可)。需要注意的是,重定向的信息未必都是重定向,如304状态码;
4xx:客户端错误类信息,常用状态码:404(请求了一个不存在的文件);
5xx:服务器端错误类信息;
reason-phrase:定义解释status的意义;
headers:响应报文首部;
entity-body:报文主体;
报文举例:
 HTTP|HTTP是什么?是怎么发展的?
文章图片

GET/HTTP/1.1中的/表示访问一个网站但没有明确指定访问哪个页面,/表示访问对方的默认页面(主页)。

缓存:在http/1.0中,引入缓存的机制时为了加速系统访问、节省网络带宽的。


推荐阅读