http协议
关于http协议
为什么要有HTTP协议?其实就跟春秋战国时期,秦国为什么要一统,统一文字、货币... 很久很久以前,多种类型的浏览器(谷歌、ie、火狐...)要和多种服务器(Apache、Nginx、Tomcat)交互,就如同我们和多个国家的朋友讲段子,我们需要一种标准的语言(英语)来交流,这个语言在浏览器和服务器之间就是HTTP协议。
“作为一个优秀的web开发人员,只有理解http,才能更好的开发、维护和扩展一个项目” --- 聂哥
一、什么是HTTP协议
为了统一,服务器跟浏览器提要求;你们发的信息的格式一定要一样的格式 浏览器要跟服务器提要求:要求的不同服务器发送的响应 数据格式要一直统一
HTTP就是一个基于TCP/IP协议的应用层的通信规范:双方要通信,大家就约定遵守一个规范,即 浏览器客户端与服务器端的数据传输格式规范
HTTP是基于TCP传输层协议实现的;有时候也承载于TLS和SSL协议层之上(HTTPS),HTTP的端口是80端口,HTTPS的端口号为443
二、HTTP的版本发展
- 1995 1.0版本 HTTP/1.0 版的主要缺点是,每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接
- 1997 1.1 直到现在还是最流行的版本,1.1 版的最大变化,就是引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明
Connection: keep-alive
- 2015 HTTP/2 发布。它不叫 HTTP/2.0,是因为标准委员会不打算再发布子版本了,下一个新版本将是 HTTP/3。
Telnet 程序和功能 打开Windows功能 ctrl+]
GET /message/add.php HTTP/1.1
Host: www.study.com
GET /message/add.php HTTP/1.0
Host: www.study.com
三、HTTP的特点
HTTP协议是无状态的 就是说每次HTTP请求都是独立的,在这个两个请求之间没有什么必然的联系
多次HTTP请求 在客户端请求网页时,多数并不是一次请求就能成功的,服务器首先是响应HTTP页面,然后浏览器收到响应之后发现HTTP页面还引用了其他资源。例如,CSS、Js文件、图片等等,还会自动发送HTTP请求这些需要的资源。
基于TCP协议 HTTP协议目的是规定客户和服务器数据的传输的格式和数据交互行为,并不负责数据传输的细节,底层是基于TCP实现的。现在使用的版本当中是默认持久化连接的,也就是多次HTTP请求使用的一个TCP连接
问题:
1、一个网站 一个页面有三个图片 总共几次请求。
2、如果三张相同的图片呢?
3、如果优化请求?
四、HTTP之URL
URL全称:统一资源定位符,是互联网上用来标识某一处资源的地址。所谓标识某一处资源地址的意思就是,通过这个URL,我们可以在互联网上找到这个资源
https://www.aipanshi.com:80/blog/lanmp/mysql-database-design.html?name=jack&age=18#bottom
标识 | 说明 |
---|---|
https | 协议名称(http/https) |
www.aipanshi.com | 主机域名地址(IP地址) |
80 | 端口号(默认不显示) |
/blog/lanmp | 资源路径 |
?name=jack&age=18 | 参数传递 |
bottom | 锚点 |
五、HTTP的组成
HTTP协议分为 请求 和 响应 两个部分。请求是指客户端向服务器发送的消息,响应时指服务器收到的消息后向客户端返回的消息。
5.1、HTTP请求
http请求由三部分组成,分别是:请求行、消息报头、请求正文
,请求头信息与主体信息之间要有一个空行
- 请求行(请求方法 URL路径 协议版本)
- 请求头信息(格式为key:value)
- 空行
- 请求主体(可选)发送的内容
GET / HTTP/1.1
Host: www.54daniu.cn
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
5.2、响应头格式:
- 状态行
- 响应报头(格式为key:value)
- 响应内容
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 10 May 2019 07:47:40 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.6.36
Transfer-Encoding: chunked
5.3、HTTP动词(请求方式)
- GET 获取资源 GET方法用来请求访问已被URL识别的资源,也就是指定服务器处理请求后响应的内容
- POST 创建资源 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中,POST请求可能会导致的资源的建立或已有的资源修改
- PUT 修改资源 从客户端向服务器发送的数据取代指定的内容。就是修改资源
- HEAD 获取报文首部 HEAD方法类GET方法,不同的是HEAD方法不要求返回数据。用于确认URL的有效性及资源更新时间等
- DELETE 删除文件 delete方法用来删除文件,与PUT方法相反。DELETE是要求返回URL指定的资源
- OPTIONS 询问支持的方法 因为并不是所有的服务器都支持规定的方法。为了安全有些服务器会禁用一些方法。例如DELETE、PUT等,那OPTIONS就是用来询问服务器支持的方法
GET与POST 请求方式区别
- get请求方式一般用于向服务端获取数据,post方式主要用于向web服务器提交数据
- post方式通过实体内容传递数据,传输数据大小理论上没有限制,但是服务器端会限制,而get方式通过URL参数传递数据,受限于URL的长度,通常不超过1KB
- post比get请求方式更安全,get方式的参数信息会在URL中直接显示,而post方式传递的参数隐藏在实体内容中。相对安全些
六、HTTP状态码与状态文字
状态码 用来反映服务器响应状态。 状态文 字是用来描述状态码的
HTTP状态码分类
HTTP状态码由三个十进制的数组成。第一个数定义的状态码类型,后两个数字没有分类的作用。HTTP状态码其分为5中类型
分类 | 分类描述 |
---|---|
1xx | 指示信息 - 请求已经接收,继续处理 |
2xx | 成功 - 请求已经成功接收处理 |
3xx | 重定向 - 要完成请求需要进行更近一步的操作 |
4xx | 客户端错误 - 请求有语法错误或请求无法的请求 |
5xx | 服务器端错误 - 服务器未能实现合法的请求 |
常用的状态码、状态描述和说明
状态码 | 说明 |
---|---|
200 | OK:客户端请求成功 |
301 | 永久重定向 |
302 | 临时重定向 |
304 | 当客户端向服务端请求时,服务端告诉客户端缓存的文档没有过期可以继续使用 |
400 | Bad Request:客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthorize:请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用 |
403 | Forbidden:请求的对应资源禁止被访问 |
404 | Not Found:请求资源不存在,例如输入了错误的URL |
500 | Internal Server Error:服务器发生了内部不可预期的错误 |
503 | Server Unavailable:服务器忙,当前不能处理客户端的请求,一段时间后可能恢复正常 |
7、http和https的区别
http
- http是超文本传输协议
- 效率高
- 使用80端口和tcp/ip进行通信,信息明文传输
https
- https 安全超文本传输协议
- 安全性更高 对传输的数据进行了加密
- 端口443,需要CA机构wosign颁发的SSL证书
8、PHP远程请求方式
- file_get_contents
- cURL
应确保
php.ini
中的“allow_url_fopen”配置项处于开启状态,否则PHP不允许远程请求。
9、输出缓冲
输出缓冲(Output Buffer)是一种缓存机制,它通过内存预先保存PHP脚本的输出内容,当缓存的数据量达到设定的大小时,再将数据传输到浏览器。
简单来说,高速的cpu早早处理完自己的数据,想通过线路传递给用户,但是线路太窄了,一下输送不过去。如果引入缓冲区,cpu可以将快速将生成的数据放入缓冲区,然后自己哪儿凉快儿哪儿呆着这歇着去了。缓冲区根据指令适时将数据输出。这个样就合理解决了高速cpu与低速I/O设备的矛盾了
ob缓存的作用:解决header头前有输出的问题
Warning: Cannot modify header information - headers already sent by...
究其发生错误的原因:是因为响应头和相应主体位置错位导致的!正常情况下,服务器返回给浏览器的相应内容,应该是:响应头+响应主体!,再编写代码的时候 我们在header函数或setcookie、session_start()函数前有输出。所谓输出可能是echo print_r var_dump、或是html中的空格回车,再或者是因为utf有bom的原因。
如果我们开启了ob缓存,可以使其输出的实体内容延缓到HTTP消息头的后面被发送。
Web页面向后台提交数据的方式和选择
1、通过表单提交
这是HTML支持最传统的提交方法,需要创建表单,然后表单包含各种类型的表单元素,还要有一个提交按钮,通过提交按钮来提交到后台,这种方式提交后页面会刷新。
2、通过网页链接提交
可以在网页的链接附上需要提交的参数,当用户点击链接后,浏览器发起向链接的访问,从而也把链接附带的参数提交到后台,这种方式提交后页面也会刷新。
3、通过ajax提交
Javascript支持ajax方式创建HTTP请求,可以通过在HTML页面元素的事件处理函数中创建ajax请求,在url参数里携带所需提交的参数,从而提交到后台,这种方式提交后页面不会刷新。
在实际Web页面中,我们要根据实际用户交互的需要来选择合适的提交方式。
1、如果需要使用一些的表单类型用户输入,比如文本框、单选框、下拉框,那么可以选择第1种和第3种方式,如果希望提交后页面刷新就选第1种,如果不希望提交后页面刷新就选第3种。
2、如果不需要表单类型输入,那么可以选择第2种和第3种方式,如果希望提交后页面刷新就选第2种,如果不希望提交后页面刷新就选第3种。