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 条评论
登录 后参与评论

相关文章

来自专栏决胜机器学习

《Redis设计与实现》读书笔记(十六) ——Redis文件事件 (原创内容,转载请注明来源,谢谢)

《Redis设计与实现》读书笔记(十六) ——Redis文件事件 (原创内容,转载请注明来源,谢谢) 一、概述 redis服务器是一个事件驱动...

32460
来自专栏Java技术分享

PDF.js专题

前言     英文是github上的原文,找不到中文资料,我根据自己理解翻译的,有些词意思拿不准就直接把单词留在原地了,看这个文档应该可以凑合着用了。 PDF....

2K100
来自专栏java思维导图

http超文本协议,让http不再难懂

先来个导图,再来分解: ? 导图详情: 协议 HyperText Transfer Protocol,超文本传输协议 一个无状态的请求/响应协议 是因特网上应...

34670
来自专栏Spark学习技巧

高性能:MYSQL异步客户端

实时处理领域,当需要使用外部存储数据染色的时候,需要慎重对待,不能让与外部系统之间的交互延迟对流的整个进度取决定性的影响。

51620
来自专栏Linyb极客之路

网络编程之HTTP协议的请求方法

HTTP是一个基于TCP/IP通信协议来传递数据,包括html文件、图像、结果等,即是一个客户端和服务器端请求和应答的标准。

46840
来自专栏smy

webpack打包速度和性能再次优化

一. 改单dll为双dll ? 因为上图原因,使用CommonsChunkPlugin时,导致其打包出来的vendors.js内的模块ID会因为其他文件引用模块...

83880
来自专栏大闲人柴毛毛

Linux系统服务——Daemon

什么是Daemon? Daemon是Linux的一些系统服务,它们是一些常驻内存的进程。 Daemon分类 Daemon拥有两种分类方式,按照“daemon是...

40940
来自专栏zaking's

RFC2616-HTTP1.1-Status Code(状态码规定部分—译文)

part of Hypertext Transfer Protocol -- HTTP/1.1

13010
来自专栏Albert陈凯

HTTP、TCP、UDP:通信协议的规则和区别

TCP、HTTP、UDP:都是通信协议,也就是通信时所遵守的规则,只有双方按照这个规则“说话”,对方才能理解或为之服务。 TCP HTTP UDP三者的...

32980
来自专栏运维

Nginx1.10.2稳定版本tcp四层负载安装配置过程略解

nginx1.10.2(2016.10.18)是最新稳定版,适合线上运行,最新开发版为1.11.8(2016.12.27)

15710

扫码关注云+社区

领取腾讯云代金券