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协议头字段详解大全

HTTP Header非常之多,很少有人能完全分清这些Header到底是干什么的。鉴于RFC文件规范艰深晦涩难懂,本文对协议规范中列出的HTTP Header进...

661
来自专栏程序猿DD

从零开始的Spring Session(一)

新媒体管家 Session和Cookie这两个概念,在学习java web开发之初,大多数人就已经接触过了。最近在研究跨域单点登录的实现时,发现对于Sessio...

1938
来自专栏Jackson0714

不惧面试:HTTP协议(1) - 基础扫盲

1753
来自专栏IMWeb前端团队

HTTP缓存控制小结

引言 通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了访问者的数据成本。...

2408
来自专栏好好学java的技术栈

http简介看这篇就够了

协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要...

952
来自专栏安富莱嵌入式技术分享

【RL-TCPnet网络教程】第41章 HTTP超文本传输协议基础知识

本章节为大家讲解HTTP(HyperText Transfer Protocol,超文本传输协议),从本章节开始,正式进入嵌入式Web的设计和学习。

682
来自专栏Golang语言社区

【Go 语言社区】学习网页开发基础 HTTP 方法:GET 对比 POST

两种最常用的 HTTP 方法是:GET 和 POST。 什么是 HTTP? 超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信。 HTTP 的...

35710
来自专栏好好学java的技术栈

「文末赠书」http协议简介看这篇就够了

协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要...

753
来自专栏漏斗社区

有一种内涵叫Z-BlogGetShell漏洞分析

3196
来自专栏Jackson0714

不惧面试:HTTP协议(1) - 基础扫盲

2807

扫码关注云+社区