应用层的HTTP协议

来源:互联网 发布:推广与优化的区别 编辑:程序博客网 时间:2024/05/11 14:35

应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文,特别是:

(1)交换的报文类型,例如请求报文和响应报文;

(2)各种报文类型的语法,例如报文中的各个字段及这些字段是如何描述的

(3)字段的语义,即这些字段中包含的信息的含义

(4)一个进程何时以及如何发送报文,对报文进行响应的规则

web的应用层协议是超文本传输协议(HyperText Transfer Protocol,HTTP),它是web的核心。HTTP由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中,通过交换HTTP报文进行会话。HTTP定义了这些报文的结构以及客户和服务器进行报文交换的方式。

基本思想就是:当用户请求一个web页面时,浏览器向服务器发出对该页面中所包含对象的HTTP请求报文,服务器接收到请求并用包含这些对象的HTTP请求报文进行响应。

HTTP使用TCP作为它的支撑运输协议,HTTP客户首先发起一个与服务器的TCP连接,一旦连接建立,该浏览器与服务器进程就可以通过套接字接口访问TCP。客户端的套接字接口是客户进程与TCP连接之间的门,在服务器端的套接字接口则是服务器与TCP连接之间的门。客户向它的套接字接口发送HTTP请求报文并从它的套接字接口接受HTTP响应报文,服务器类似。一旦客户向它的套接字接口发送了一个请求报文,该报文就脱离了客户控制并进入TCP的控制。TCP为HTTP提供可靠数据传输服务。这意味着,一个客户进程发出的每个HTTP请求报文最终能完整的到达服务器。这里就体现了分层协议的优点:即HTTP协议不用担心数据丢失,也不关注TCP从网络的的数据丢失和乱序故障中恢复的细节。

重要的是:服务器向客户发送被请求的文件,而不存储任何关于该客户的状态信息。假如某个特定的客户在短短几秒钟内两次请求同一个对象,服务器并不会因为刚刚为该客户提供了该对象就不再做出反应,而是重新发送该对象,就像服务器已经完全忘记不久之前所做过的事一样。因为HTTP服务器并不保存关于客户的任何信息,所以我们说HTTP是一个无状态协议。

HTTP规范包含了对HTTP报文格式的定义。HTTP报文有两种:请求报文和响应报文。

1、HTTP请求报文

下面提供一个典型的http请求报文,这是通过wireshark抓包,跟踪TCP流查看到的请求报文:


HTTP请求报文的第一行叫做请求行,请求行有三个地段:方法字段、URL字段和HTTP版本字段。方法字段可以取:get、post、head、put和delete,绝大部分的http请求报文使用get方法。

后继的行叫做首部行,其中:

host指明对象所在的主机;

accept-encoding指明文件的编码,采用gzip压缩;

有的请求报文中包含cookie,之后后续会总结一篇关于cookie的文章;

connection:keep-alive或者close,close指的是该浏览器告诉服务器不希望麻烦的使用持续连接,它要求服务器在发送完被请求的对象后就关闭这条连接;

User-agent用来指明用户代理,即向服务器发送请求的浏览器的类型,这对首部行是有用的,因为服务器可以有效地为不同类型的用户代理实际发送相同对象的不同版本,accept-language表示用户想得到该对象的语法版本,如果服务器存在的话,否则采用默认版本。

之后还会有实体行,即空行+实体,使用get方法时实体行为空,使用post方法时实体则一般为用户在表单字段中的输入值,但空行时一定要有的。

HTTP是经常采用get方法的,并在url中就会包含输入的数据,如上图,这种扩展的url成为head方法,当服务器接收到使用head方法的请求时,将会用一个HTTP报文进行响应,但是并不返回请求对象。

post请求:


Content-Type说明了请求主题的内容是如何编码的,浏览器始终以application/json的格式编码来传送数据。

2、HTTP响应报文

上图的蓝色字段即为响应报文。

它分为三个部分:一个是初始状态行,一个是首部行,然后是实体体。

状态行有3个字段:协议版本字段、状态码和响应状态信息。

首部行,有的connection:close首部行是告诉客户,发送完报文后将关闭该TCP连接;

date指示服务器产生并发送该响应报文的时间和日期,这个时间不是指对象创建或者最后修改的时间,而是服务器从它的文件系统中检索到该对象,插入到响应报文中,并发送响应报文的时间;

server指示该报文是由什么服务器产生的。Last-Modified首部行指示了对象创建或者最后修改的日期和时间,它对既可能在本地客户也可能在网络缓存服务器上的对象缓存来说非常重要;

Content-length首部行指示了被发送对象中的字节数;

Content-Type指示了实体体中的对象是html文本。

另外补充一些常见的状态码:

100-199:用于指定客户端相应的某些动作;

200-299:用于表示请求成功;

300-399:用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息;

400-499:用于指出客户端的错误;

500-599:用于支持服务器错误。

100 Continue:客户端询问是否可以在后续的请求中发送附件

200 OK:请求成功,信息在返回的响应报文中。

301 Moved Permanently:请求的对象已经被永久转移了,新的url定义在响应报文的Location:首部行中。客户软件将自动获取新的url。

400 Bad Request:一个通用差错代码,指示该请求不能被服务器理解。

404 Not Found:很常见的,被请求的文档不在服务器上

505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议版本。

分享一个http status检测器:https://seo.g2soft.net/online-tools/server_status_checker.php#code-302


0 0
原创粉丝点击