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动词(请求方式)

  1. GET 获取资源 GET方法用来请求访问已被URL识别的资源,也就是指定服务器处理请求后响应的内容
  2. POST 创建资源 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中,POST请求可能会导致的资源的建立或已有的资源修改
  3. PUT 修改资源 从客户端向服务器发送的数据取代指定的内容。就是修改资源
  4. HEAD 获取报文首部 HEAD方法类GET方法,不同的是HEAD方法不要求返回数据。用于确认URL的有效性及资源更新时间等
  5. DELETE 删除文件 delete方法用来删除文件,与PUT方法相反。DELETE是要求返回URL指定的资源
  6. 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种。





posted @ 2021-09-05 18:29  成文的博客  阅读(157)  评论(0编辑  收藏  举报