前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP网络技术(一)——HTTP协议

PHP网络技术(一)——HTTP协议

作者头像
用户1327360
发布2018-03-07 14:59:29
1.2K0
发布2018-03-07 14:59:29
举报
文章被收录于专栏:决胜机器学习决胜机器学习

PHP网络技术(一)——HTTP协议

(原创内容,转载请注明来源,谢谢)

一、概述

HTTP协议是一个基于应用层的通信规范,通信双方都遵守此协议。RFC2016定义了现在普遍使用的HTTP1.1版本。HTTP是应用层协议,由请求和相应构成,是一个标准的客户端服务器模,通常承载于TCP之上,默认端口号80。HTTPS协议除在TCP之上,还在TLS、SSL之上,默认端口号443。层级结构如下图所示。

HTTP协议下的客户端和服务器属于问答式交互,客户端发请求服务端响应,但是服务端不会主动发请求,而且TCP经常不断的连接和断开,交互效率不高。因此,Google退出SPDY协议,优化浏览器和服务器的通信,支持流复用、主动发请求等。

二、HTTP协议工作

1、工作概述

浏览器发一个请求(request)给服务器,服务器收到请求并处理完毕后,生成一个响应(response)给客户端。一般分为四个步骤。

1)客户端与服务器建立连接。例如输入一个URL,HTTP协议开始工作。

2)连接建立后,客户端发送一个请求给服务器,格式包括URL、协议版本、请求修饰符等。

3)服务器接收到请求后,处理完毕后,进行相应,格式包括状态行(协议版本号以及状态码)、服务器信息、实体信息。

4)客户端接收后展示在屏幕上,并与服务器断开连接。

2、请求

发送请求前,要建立连接,并且请求和响应都有带上connection头,决定出现长链接时该如何处理。如果不想长链接,应该在connection的值设置为close。

HTTP请求分为三部分:请求行、消息报头、请求正文。格式如下:

Method Request-URI HTTP-Version CRLF

上述四个词分别为:请求方法、请求URL、请求的HTTP协议版本、回车换行。

请求方法有很多种,最常用的有GET、POST。

3、响应

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

HTTP-Version Status-Code Reason-PhraseCRLF

上述前三个词分别为:服务器HTTP协议版本、状态码、状态码的文本描述。

状态码是一个三位数字,第一个数字定义了响应的类别,共有五种类别:

1)1xx:指示信息——请求已经接受,继续处理。

2)2xx:成功——请求成功接收、理解、接受。

3)3xx:重定向——要完成请求必须进行更进一步的操作,常被包含在定位头信息中指定新的地址信息。

4)4xx:客户端错误——请求有语法错误或者请求无法实现。

5)5xx:服务端错误——服务器未能实现合法请求。

常见的状态码如下:200 OK-请求成功。301redirect:永久性转移(Permanently Moved),302 redirect:暂时性转移(Temporarily Moved ),401 Unauthorized:未授权,403 Forbidden:禁止,404 NotFound:找不到页面,501 Not Implemented:服务器不支持当前请求所需要的某个功能,502 Bad Gateway:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。

通常,作为服务端编程人员,看到报5xx错误,必须马上处理,因为这类错误说明服务端业务逻辑存在问题或者出现bug。

注:301和302的区别:

301,302对用户来说没有区别,他们看到效果只是一个跳转,浏览器中旧的URL变成了新的URL。页面跳到了这个新的url指向的地方。

但是302转向可能会有URL规范化及网址劫持的问题。可能被搜索引擎判为可疑转向,甚至认为是作弊。因为302是临时重定向,从网址A做一个302重定向到网址B时,主机服务器的隐含意思是网址A随时有可能改主意,重新显示本身的内容或转向其他的地方。

网站劫持的含义:搜索引擎在遇到302重定向时会进行判断,如果网址A较短而且人性化,而网址B很长而且还带有一堆参数,有可能网页跳转到网址B,但是浏览器还显示的是网址A,这样做网址B的人的内容就被网址A给劫持了。

而当网页A用301重定向转到网页B时,搜索引擎可以肯定网页A永久的改变位置,或者说实际上不存在了,搜索引擎就会把网页B当作唯一有效目标。

在nginx上,配置页面跳转,在server下,对于rewrite命令,301是用permanent,302是用redirect。

4、报头

HTTP报头包括普通报头、请求报头、响应报头、实体报头。报头不区分大小写。每个报头的格式:

名字+:+空格+值

主要有如下几个报头:

1)Host

Host指定请求资源的Internet主机和端口号,必须请求URL的原始服务器或网关地址,否则会收到400的状态码。

2)User-Agent

简称UA,内容包含客户端的信息,主要包括浏览器信息、操作系统信息、浏览器与操作系统内核等。UA头是辨别用户客户端设备的重要依据。

常见UA头:

搜狗浏览器-windows 7 X86:Mozilla/5.0(Windows NT 6.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84Safari/535.11 SE 2.X MetaSr 1.0

火狐-windows X64:Mozilla/5.0(Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre

3)Accept

该字段告诉服务器可以接受的文件格式。通常各浏览器该值都差不多,主要包括test/html,application/xhtml+xml,application/xml等。

4)Cookie

Cookie分两种,一种是浏览器发出的报头,用来标记信息,字段为Cookie;一种是服务器发送的报头,字段为Set-Cookie。区别客户端里可以有多个Cookie值,服务器只能有一个值。具体Cookie与Session的问题,后面的章节再提。

5)Cache-Control

指定请求和响应遵循的缓存机制。好的缓存机制可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担。HTTP缓存指我们用浏览器访问网站时,根据服务器返回的HTTP缓存响应头设置,缓存相应的数据,下次访问就可以直接使用,或者去服务器验证数据是否过期。这样可以大大减轻宽带压力,加快网页加载速度。

Cache-Control分为请求和响应,包含的内容不一样。

请求的主要设置有no-cache(不要读缓存文件)、no-store(请求和响应都禁止缓存)、max-age(设置缓存持续时间,以秒为单位)、only-if-cached(如果有缓存就读缓存,没有过期时间)等。

响应的主要设置有public(数据内容皆被储存起来,安全性低)、private(数据内容被存到私有的缓存,特定用户看的到)、no-cache(可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端)、no-store(请求和响应都禁止缓存)、max-age(本次响应过期的时间,以秒为单位)等。

另外,Expires属性和Cache-Control的max-age属性类似,但是Expires和特定的日期做比较,如果缓存者自身时间不准确,影响比较大;而max-age是以当前时间开始计数,比较准确。max-age的优先级也比Expires大。

Nginx的ngx_http_headers_module模块可以对Cache-Control头相关的东西进行配置,配置方式:if(url){add_header Cache-Control max-age=3600;},其中url为正则表达式匹配的url值。

6)Referer

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。

头域允许客户端指定请求URI的源资源地址。Referer可以记录访问的来源,统计访问量,可以用来防盗链。但是该数据不安全,虽然客户端用js不能篡改Referer,但是用一些插件什么的可以达到伪造的目的。另外可以使用Fiddler修改Referer。

PHP曾经有过自带的获取Referer的函数$_SERVER['HTTP_REFERER'],现在已经被删除,也不建议这样使用,因为这样获取到的内容很有可能是伪造的。

7)Content-Length

该字段表示内容的长度。

8)Content-Range

该字段表示响应的资源范围,即断点续传,从文件已经下载的地方开始继续下载。在以前版本的 HTTP 协议是不支持断点的,HTTP/1.1 开始就支持了。一般断点下载时才用到 Range 和 Content-Range 实体头。

9)Accept-Encoding

指定所能接受的编码方式,通常服务器会对页面进行压缩后再传输,以减少流量。

——written by linhxx 2017.07.15

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 决胜机器学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档