理解HTTP协议

来源:互联网 发布:flame软件 编辑:程序博客网 时间:2024/05/21 17:44

网络协议

任何两个不同的事物之间进行通信都需要具有一定的规则,将数据按照规定的方式组织起来便成了可用的网络包。
就像人与人交流一样,光有各种词汇(相当于数据)是不够的,需要按照事先规定好的语法(相当于协议)组织起来才能让人听明白。

网络协议就像语言一样多种多样,在不同情形下使用不同的协议(语言)。当然,每个人都可以创建属于自己的协议(语言)。

HTTP协议

总领


HTTP协议是最常见的协议,常用于浏览器和WEB服务器之间通信。

当我们在浏览器上键入某个URL并确认时,浏览器便会按照HTTP协议规定的语法将我们的请求(网络包)发送给WEB服务器,而WEB服务器在收到这个请求后便也会根据HTTP协议规定的语法来解析这个请求,并且再次按照HTTP协议规定的语法将响应(网络包)发送给浏览器,于是浏览器再次根据HTTP协议规定的语法来解析这个响应最终呈现给客户。

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


HTTP协议之请求

HTTP请求由三部分组成,分别是:请求行、消息报头、请求正文

1、请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:

Method Request-URI HTTP-Version CRLF
//其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;

CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
 
请求方法(所有方法全为大写)有多种,各个方法的解释如下: 
GET 请求获取Request-URI所标识的资源 (常用)
POST 在Request-URI所标识的资源后附加新的数据 (常用)
HEAD 请求获取由Request-URI所标识的资源的响应消息报头 
PUT 请求服务器存储一个资源,并用Request-URI作为其标识 
DELETE 请求服务器删除Request-URI所标识的资源 
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断 
CONNECT 保留将来使用 
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
掌握GET和POST即可,其中GET请求没有请求正文,而POST请求则可以有请求正文(POST字面意思就是打包发送的意思),如提交表单内容时使用POST,此时表单内容会被加入到请求正文中。

2、请求报头用来描述请求的一些属性,常用属性有:

Accept:用于指定客户端接受哪些类型的信息,如 image/gif 等
User-Agent:用来描述客户代理的信息(浏览器便是典型的客户代理)
HOST:主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,eg: 我们在浏览器中输入:http://www.guet.edu.cn/index.html 浏览器发送的请求消息中,就会包含Host请求报头域: Host:www.guet.edu.cn

等等,一般看字面意思就能明白。

3,、请求正文用来存放额外的内容,如提交的表单内容等等。


一个提交表单的请求例子:
POST /reg.jsp HTTP/1.1 (CRLF)                       //请求行结束,后接消息报头Accept:image/gif,image/x-xbit,... (CRLF)    ... HOST:www.guet.edu.cn (CRLF) Connection:Keep-Alive (CRLF) Cache-Control:no-cache (CRLF) (CRLF)      //该CRLF表示消息报头已经结束,后可接请求正文user=hello&password=123                                     //此行及以下为提交的数据(请求正文),提交了一个 user 字段和 password 字段(2个input元素)



HTTP协议之响应

HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文

1、状态行格式如下

HTTP-Version Status-Code Reason-Phrase CRLF//其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求

常见状态代码、状态描述、说明:
200 OK      //客户端请求成功
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

2、响应报头与请求报头类似,用来描述响应的属性,不再细说

3、响应正文用来存放响应的文件,如与客户请求对应的HTML文件,图片等等

浏览器最终呈现出来的便是HTML文件与图片,视频的组合

一个响应的例子:
HTTP/1.1 200 ok (CRLF)            //状态行Location:https://www.hahaha.com/ (CRLF)   //报头开始,描述服务器IP(域名)及端口Content-Type:text/html; charset=utf-8 (CRLF)     //描述响应正文类型及编码类型..... (CRLF)(CRLF)<h1>hello</h1>           //响应正文,此处为text/html类型<p>hello world!</p>

0 0