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

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

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-07-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小白客

Web前端基础【4】--HTTP标准

HTTP协议(超文本传输协议),是用于从www服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,减少网络传输。 一:HTTP请求过程 HTTP协议...

3387
来自专栏大闲人柴毛毛

架构高性能网站秘笈(五)——Web组件分离

什么是Web组件? 网站的静态网页HTML、JavaScript脚本、CSS样式、图片、动态数据称为网站的Web组件。也就是说,一个Web应用由各种各样的We...

3608
来自专栏java思维导图

Cookie、Session、Token那点事儿

前言:新公司项目中使用到了Cookie,在各大Android技术讨论群向前辈们取经讨论这cookie、session、token这仨哥们的时候,很多开发者说法不...

723
来自专栏北京马哥教育

HTTP 协议漫谈

简介 网络上已经有不少介绍 HTTP 的好文章,对HTTP的一些细节介绍的比较好,所以本篇文章不会对 HTTP 的细节进行深究,而是从够高和更结构化的角度将 H...

27011
来自专栏LanceToBigData

TCP/IP(七)之玩转HTTP协议

前言   前面一篇的博文简单的介绍了一下属于应用层的HTTP协议,这一篇我将详细的学习HTTP协议,这也是做Web开发中一定要用到的协议。虽然我是做大数据的,但...

2049
来自专栏magicsoar

windows下的C++ socket服务器(4)

void handleAccept(int socket_fd) { char buf[1024] = { '\0' }; string cmd...

2065
来自专栏一个会写诗的程序员的博客

Cookie 和 Session 机制原理分析 & 区别对比

Web application servers are generally "stateless":

822
来自专栏前端知识分享

第206天:http协议终极详解---看这一篇就够了

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传...

684
来自专栏python学习指南

python爬虫(二)_HTTP的请求和响应

HTTP和HTTPS HTTP(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收HTML页面的方法 HTTPS(Hyp...

28910
来自专栏向治洪

Rest api简介

理解和使用内容协商 我们的开发者在发送一个 REST API 请求的同时,根据应用场景,针对相同的资源,可能会期待不同的返回形式。 比如,我希望根据用户客户端语...

1936

扫描关注云+社区