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

相关文章

来自专栏武培轩的专栏

HTTP 0.9 HTTP 1.0 HTTP 1.1 HTTP 2.0区别

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

2905
来自专栏沈唁志

解决 TP3 框架 引入 Log.class.php 文件报错方法

朋友的这个问题真的很无语,可能会出现在使用 SVN 的情况下,使用 Git 进行团队开发忽略以后是不会出现这种问题的

721
来自专栏决胜机器学习

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

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

2896
来自专栏大闲人柴毛毛

Linux系统服务——Daemon

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

3014
来自专栏SDNLAB

【连载-4】数据中心网络虚拟化 配置管理技术

在构建虚拟网络时,管理员需要进行大量的配置工作,例如端口的ip地址和VXLAN配置等等。显然,没有人愿意在系统每次启动时都将繁琐的配置工作重复一遍,所以将配置信...

2685
来自专栏Linyb极客之路

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

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

2434
来自专栏pythonlove

FTP使用MariaDB完成虚拟用户认证

文件传输协议(英文:File Transfer Protocol,縮寫:FTP)是用於在網絡上進行文件傳輸的一套標準協議。它属于网络传输协议的应用层。FTP是一...

924
来自专栏Albert陈凯

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

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

2798
来自专栏zaking's

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

part of Hypertext Transfer Protocol -- HTTP/1.1

941
来自专栏人人都是极客

Linux下so动态库一些不为人知的秘密

Linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面知识。

902

扫码关注云+社区