HTTP协议

HTTP工作原理  (摘自PHP核心技术与最佳实践一书)
首先客户端发送一次请求(Request)给服务器,服务器在接收到这个请求后生成一个响应(Response)返回给客户端。一次HTTP操作成为一个事务,其工作过程可分为四部:
1) 客户机与服务器需要建立连接。 单击某个超链接,HTTP协议的工作开始。
2) 建立连接后,客户机发送一次请求给服务器。
格式为:前边是统一资源标识符(URL)、中间是协议版本号、后边是MIME信息(包含请求修饰符、客户机信息和可能的内容)。
3)服务器接到请求后,给予相应的响应信息。
格式为:首先是一个状态行(包括信息的协议版本号、一个成功或者错误的代码),然后是MIME信息(包含服务器信息、实体信息和可能的内容)。
4)客户端接受服务器返回的信息并现实在用户的显示屏上,然后客户机与服务器断开连接。
如果以上过程中的某一步出现错误,产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP协议自己完成的,用户只要用鼠标单击,等待信息现实就OK。

简单介绍HTTP协议中一些主要概念

1.请求
    在发起请求前,需要先建立连接。
    连接是一个传输层的实际环流,它建立在两个相互通信的应用程序之间。在HTTP 1.1协议中,request和response头中都有可能出现一个connection的头,其决定当Client和Server通信时对于长连接如何进行处理。
    HTTP1.1协议中,Clinet和Server默认对方支持长连接,如果Client使用HTTP1.1协议,但又不希望使用长连接,需要在 header中指明connection的值为close;如果Server方也不想支持长连接,则在response中需要明确说明 connection的值为close。不论request还是response的header中包含了值为close的connection,都表明当 前正在使用的TCP连接在请求处理完毕后会被断掉,以后Clinet再进行新的请求时必须创建新的TCP连接。
 
HTTP请求由三部分组成:请求行、消息报头、请求正文。请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式:Method Request-URI HTTP-Version CRLF
Method: 请求方法 (GET POST HEAD PUT DELETE TRACE CONNECT OPTIONS)
Request-URI: 一个统一资源表示符。
HTTP-Version: 请求的协议版本。
CRLF: 回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

2.响应
    在接受和解释请求消息后,服务器返回一个HTTP响应消息。HTTP响应也有三个部分组成,分别是:状态行、消息报头、响应正文。
    状态行格式如下: 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 Unauthorize:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
    403 Forbidden: 服务器收到请求,但是拒绝提供服务
    404 Not Found: 请求资源不存在,例输入错误的URL
    500 Internal Server Error:服务器发生不可预期的错误
    503 Server Unavailable: 服务器当前不能处理客户端的请求,一段时间后可能回复正常。

3.报头
    HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。每个报头域组成形式如下:
    名字 + : + 空格 + 值  (报头域的名字是不区分大小写、报头都是自解释的)

    1)普通报头中有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息(如缓存控制、连接控制等)。
    2)请求报头允许客户端向服务器传递请求的附加信息以及客户端自身的信息(如UA头、Accept等)。
    3) 响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息(如Location)。
    4)实体报头定义了关于实体正文和请求所标识的资源的元信息,例如有无实体正文。

比较重要的几个报头:

Host:头域指定请求资源的Internet主机和端口号,必须表示请求URL的原始服务器或网关的位置。HTTP1.1请求必须包含主机头域,否则系统会以400状态码返回。

User- Agent:简称UA,内容包含发出请求的用户信息。通常UA包含浏览者的信息,主要是浏览器的名称版本和所用的操作系统。(UA头不仅仅是使用浏览器才 存在,只用使用了基于HTTP协议的客户端软件都会发送这个请求,无论是手机端还是PDA等。这个头是辨别客户端所用设备的重要依据)。

Accept:告诉服务器可以接受的文件格式。

Cookie:Cookie分两种,
一种是客户端向服务器端发送的,使用Cookie报头,用来标记一些信息;另一种是服务器发送给浏览器的,报头为Set-Cookie。
二者的主要区别是Cookie报头的value里可以有多个Cookie值,并且不需要显示指定domain(域名)等。而Set-Cookie报头里一条记录只能有一个Cookie的value,需要指明domain、path等。

Cache-Control:制定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。
请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached;
响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。

Referer:头域允许客户端指定请求URI的源资源地址,这可以允许服务器生成回退链表,可用来登录、优化缓存等。

Content-Length:内容长度。

Content-Range:响应的资源范围。可以在每次请求中标记请求的资源范围,在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,实现断点续传。(迅雷就是基于这个原理,使用多线程分段读取网络上的资源,最后合并)

Accept-Encoding:制定所能接受的编码方式。通常服务器会对页面进行GZIP压缩后再输出以减少流量,一般浏览器均支持对这种压缩后的数据进行处理。

自定义报头:在HTTP消息中,也可以使用一些在HTTP1.1正是规范里没有定义的头字段,这些头字段统称为自定义的HTTP头或者拓展头。在PHP里,使用header函数即可实现。

转载于:https://www.cnblogs.com/liuxl/p/3780811.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值