什么是网络协议
网络协议和我们人类的协议一样,就是事先的一种约定、规范!
协议为什么要分层?
分层的好处:
1,每一层只需要做好每一层的本职工作就行了,层与层之间是相互独立的!
2,下层永远为上层而服务,并且上层不需要知道下层究竟是如何实现的!
3,每一层的升级不影响其他的层,只需要保持他们之间的接口不变就行了!
4,每一层都有各自独立的协议!
三次握手协议:
http协议
HTTP:Hypetext Transfer Protocol,超文本传输协议!专门用来浏览器端与服务器端的交互协议!
浏览器请求服务器:要规定请求数据的格式
服务器响应浏览器:要规定响应数据的格式
HTTP协议的特点
1,HTTP也支持c/s模型 HTTP通常是基于b/s结构的访问,但是也支持c/s
2,灵活,可以用http协议传递任意类型的数据
3,无连接请求,每次连接只能处理一个请求,浏览器向服务器发起一次请求后,只能得到服务器的一次响应!
4,无状态(无记忆),意思是同一个浏览器向同一个服务器发起多次请求的时候,服务器不能识别该浏览器!
http协议分成两个部分
http请求:浏览器向服务器索要数据
http响应:服务器向浏览器反馈数据
注意:不管是请求还是响应,其实http协议都是由一个一个的简单的协议项组成的,形式如下:
协议名:协议内容(值) 并且,每一个协议项都独占一行!
http请求协议
含义:用于规范浏览器向服务器发送数据的格式!
http请求包含了四个部分:请求行(request_line)、请求头(request_header)、空行、请求数据(request_content)
请求行:请求行独占一行,用来说明当前请求的最基本的信息,分成了三个部分:
请求方式请求路径(资源地址)协议版本
注意:三者之间都以空格分开!
比如:GET /model/register.php HTTP/1.1,GET就是请求方式,/model/register.php就是请求路径(资源地址),HTTP/1.1 就是协议版本(以前是HTTP/1.0)
注意:请求路径不包含域名!
请求头:请求头就是所有当前需要用到的协议项的集合,也就是浏览器在请求服务器之前事先告诉服务器的一些信息,每个协议项都要独占一行
常见的请求头有下些:host:当前url中所要请求的服务器的主机名(域名) 比如:Host: www.php20.com
accept-encoding:是浏览器发给服务器,声明浏览器支持的压缩编码类型 比如gzip
比如:Accept-Encoding: gzip, deflate
accept_charset:表示,浏览器支持的字符集
referer:表示,此次请求来自哪个网址
比如:Referer: http://www.test.com/test.html
accept-language:可以接收的语言类型,cn,en等
比如:Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
cookie:如果之前当前请求的服务器在浏览器端设置了数据(cookie),那么当前浏览器再次请求该服务器的时候,就会把对应的数据带过去
user-agent:用户代理,当前发起请求的浏览器的内核信息
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:47.0) Gecko/20100101 Firefox/47.0
accept:表示浏览器可以接收的数据类型,text/html,image/img
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
content-length(post):只有post提交的时候才会有的请求头,显示的是当前要提交的数据的长度(字节)
if-modified-since(get):表示,在客户端向服务器请求某个资源文件时,询问此资源文件是否被修改过
content-type(post):用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件
空行:空行是用来分离请求头和请求数据的,也就是说,请求头到此结束!
请求数据:只有post方式提交的时候,才有会请求数据!除了firebug之外,还有一个查看http请求和响应数据更专业的工具:httpwatch
客户端模拟http请求
就是使用telnet客户端!
第一步:开启telnet客户端
控制面板→卸载程序→左边的打开或关闭windows功能,勾选上telnet客户端!
第二步:进入到telnet连接的界面
1,连接apache:telnet localhost 80
2,回车进入telnet连接界面,按ctrl+]进行数据回显!
3,再按回车,进入http请求
http响应协议
http响应也分成四个部分:状态行(响应行)、响应头、空行、响应数据(响应主体)
响应行:独占一行,分成三个部分:协议版本状态码 状态描述
比如:
HTTP/1.1 200 OK
状态码的基本描述:
1XX:代表http请求尚未成功
2XX:请求没有问题,同时服务器的响应也没有问题
3XX:重定向,服务器要求浏览器重新发送一次请求
4XX:请求错误,服务器不能正常的响应
5XX:服务器出现了错误,不能正常的作出响应
响应头:形式和请求头一样,也是响应头名称:值的形式,常见的有:server:服务器主机信息
比如:Server: Apache/2.2.22 (Win32) PHP/5.4.8
date:响应时间 比如:Date: Mon, 08 Aug 2016 02:04:46 GMT
last-modified:文件最后修改时间(对应请求中:if-modified-since)
content-length:响应主体的长度(字节)
比如:Content-Length: 4282
content-type:响应内容的数据类型:text/html,image/png等
比如:Content-Type: text/html;Charset=utf-8
location:重定向,浏览器遇到这个选项,就立马跳转(不会解析后面的内容)
refresh:重定向(刷新),浏览器遇到这个选项就会准备跳转,刷新一般有时间限制,时间到了才跳转,浏览器会继续向下解析
content-encodeing:文件编码格式
cache-control:缓存控制,no-cached不要缓存
空行:用来分割响应头和响应主体,响应主体(响应数据)就是服务器给浏览器发送的源码信息!
php模拟http响应
php模拟http响应,其实就是通过header函数修改http协议的响应头部分(就是协议项),常见的有:跳转,刷新,下载
跳转。意思就是浏览器请求到当前文件之后,直接跳转到其他的位置!对应的协议项:Location 具体的新位置
在php中的语法就是:header(‘location:新的url或uri’);
如果是站内跳转,就应该使用uri
注意:采用站内跳转的时候,前面不需要加上域名,系统会自动绑定!
刷新:刷新的本质其实还是跳转,不过刷新是告诉浏览器在多长时间之后进行刷新,可以是自己跳转到自己(也就是浏览器上的刷新按钮),也可以是请求其他的脚本:
语法如下:header(‘refresh:刷新等待的时间;url=刷新要请求的目标脚本’);
下载:其实,可以通过a链接实现下载!
但是,a链接在下载某个文件之前,浏览器会首先尝试去解析这个文件,如果解析成功,就直接在浏览器上输出,只有解析失败的时候,才通知用户进行下载操作!
所以,使用a标签实现下载的方式不可靠!可以通过http协议,告诉浏览器,不要解析,直接给用户下载!那么,如果告诉浏览器不要下载呢,还是通过header函数来实现!
1,告诉浏览器不要解析:header(‘content-type:application/octet-stream’);
2,指导浏览器如何来保存这个文件:header(‘content-disposition:attachment;filename=文件名称’);
file_get_contents的功能非常的强大,它不仅仅可以读取本地资源的内容,还能读取网络资源!