HTTP协议简介
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。
HTTP工作原理
- 客户端与浏览器建立TCP连接
- 客户端发送HTTP请求
- 浏览器接收请求并作出响应
- 关闭TCP连接
- 浏览器解析HTML内容
面试题:
- 浏览器地址栏输入地址之后,经历的流程
- DNS解析域名为IP地址
- 根据IP地址和端口号建立TCP连接
- 客户端发送HTTP请求
- 浏览器作出响应
- 关闭TCP连接
- 客户端浏览器解析HTML内容
HTTP协议的特点
- 无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作
- 无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
- 基于请求和响应:基本的特性,由客户端发起请求,服务端响应
- 简单快速、灵活
- 通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性
HTTPS的工作原理
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。
(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
(5)Web服务器利用自己的私钥解密出会话密钥。
(6)Web服务器利用会话密钥加密与客户端之间的通信。
HTTP协议和HTTPS的区别
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
HTTP协议常见状态码
1XX:接收的请求正在处理
2XX:请求正常处理完毕
3XX:重定向状态码
301 :永久重定向。会按照Location首部字段提示的新URI更新书签。页面内容更新,且地址栏网址也更新
302 :临时重定向。不更新书签。页面内容更新,但地址栏网址不更新。一般用来做临时跳转,比如,未登录状态访问权限页面,会重定向到登录页面
4XX:客户端出问题了
400:请求报文中存在语法错误
404:服务器找不到资源
405:请求方式有问题
5XX:服务器端出问题了
500:服务器内部错误
501:请求方式有问题
503:服务器暂时处于超负载或正在进行停机维护,现在无法处理请求(服务器挂了)
505: 服务器不支持请求中所用的 HTTP 协议版本。
Http协议首部字段
通用首部字段(请求报文与响应报文都会使用的首部字段)
Date:创建报文时间
Connection:连接的管理
Cache-Control:缓存的控制
Transfer-Encoding:报文主体的传输编码方式
请求首部字段(请求报文会使用的首部字段)
Host:请求资源所在服务器
Accept:可处理的媒体类型
Accept-Charset:可接收的字符集
Accept-Encoding:可接受的内容编码
Accept-Language:可接受的自然语言
响应首部字段(响应报文会使用的首部字段)
Accept-Ranges:可接受的字节范围
Location:令客户端重新定向到的URI
Server:HTTP服务器的安装信息
实体首部字段(请求报文与响应报文的的实体部分使用的首部字段)
Allow:资源可支持的HTTP方法
Content-Type:实体主类的类型
Content-Encoding:实体主体适用的编码方式
Content-Language:实体主体的自然语言
Content-Length:实体主体的的字节数
Content-Range:实体主体的位置范围,一般用于发出部分请求时使用
HTTP请求方式
get和post请求方式的区别
GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
- GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET参数通过URL传递,POST放在Request body中。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET请求只能进行url编码,而POST支持多种编码方式。
- 回退或者刷新时,get无害,post会刷新
- GET产生一个TCP数据包;POST产生两个TCP数据包。GET可能会比POST更高效
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
但是GET并不是一定比POST更有效
1. GET与POST都有自己的语义,不能随便混用。
2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
参考资料:
https://www.cnblogs.com/mark5/p/11075383.html