目录
简介
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
HTTP是基于TCP/IP协议的应用程序协议,它并不包括数据包的传输,主要规定了客户端与服务器的通信格式,默认使用的是80端口。
发展史
(1)HTTP/0.9
a.只有一个GET命令
b.没有HEADER等描述数据的信息,服务器只能返回HTML格式的字符串数据
c.服务器发送完毕便立即关闭TCP连接
(2)HTTP/1.0
a.新增了POST命令和HEAD命令。
b.新增了Status Code和HTTP Header。
c.多字符集的支持、多部分发送、权限和缓存等。
d.缺点是每个TCP连接还是和之前一样,每次只能发送一个请求。数据发送完毕,连接就关闭,如果还要请求其他资源,就必须新建一个连接。
(3)HTTP/1.1
a.支持持久连接。这是此版本较于上一版本的最大变化。持久连接即为TCP连接在服务器发送完数据默认不关闭,可以被多个请求复用
b.引入管道机制(Pipelining)。即在同一个TCP连接里面,客户端可以同时发送多个请求。
c.增加了Host和其他一些命令。Host用来指定服务器域名。有了Host我们便可以在同一物理服务器上运行多个web服务。
(4)HTTP/2
a.二进制传输。规定所有的数据皆以二进制传输。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。
b.多路复用。同一个连接里面发送多个请求不再需要按照顺序来。也就是复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。多路复用即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
c. 服务端推送(server push),服务端推送是一种在客户端请求之前发送数据的机制。在 HTTP/2 中,服务器可以对客户端的一个请求发送多个响应。
d.有效的减少带宽使用。
总结
HTTP2.0的多路复用和HTTP1.X中的长连接复用有什么区别?
-
HTTP/1.0 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接;
-
HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;
-
HTTP/2多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行;
HTTP常用的请求方式
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。 |
2 | POST | 向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。 |
3 | HEAD | 与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。 |
4 | PUT | 向指定资源位置上传其最新内容 |
5 | DELETE | 请求服务器删除Request-URI所标识的资源 |
6 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
7 | CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。 |
8 | OPTION | 这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。 |
9 | PATCH | 对PUT方法的补充,对已知资源进行局部更新 |
总结:
GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。GET是用于获取数据的,POST一般用于将数据发给服务器之用。
链接问题:
从参数
的传递方面来看,GET请求的参数是直接拼接在地址栏URL的后面,而POST请求的参数是放到请求体里面的.
从长度限制
方面来看,GET请求有具体的长度限制,一般不超过1024KB,而POST理论上没有,但是浏览器一般都有一个界限.
从安全
方面来看,GET请求相较于POST,因为数据都是明文显示在URL上面的,所以安全和私密性不如POST
从本质
上来说,GET和POST都是TCP连接,并无实质的区别.但是由于HTTP/浏览器的限定,导致它们在应用过程中体现出了一些不同.GET产生一个数据包,POST产生两个数据包.对于GET请求,浏览器会把http header 和 data 一并发出去,服务器响应200(返回数据).而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok
HTTP请求头
Host 请求报头域主要用于指定被请求资源的Internet主机和端口。
User-Agent 请求报头域允许客户端将它的操作系统、浏览器和其他属性告诉服务器。
Referer 包含一个URL,代表当前访问URL的上一个URL,也就是说,用户是从什么地方来到本页面。当前请求的原始URL地址。
Cookie 是非常重要的请求头,常用来表示请求者的身份等。
Accept 这个消息头用于告诉服务器客户端愿意接受那些内容,比如图像类,办公文档格式等等。
HTTP响应头
序号 | 应答头 | 说明 |
---|---|---|
1 | Content-Encoding | 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。 |
2 | Content-Type | **表示后面的文档属于什么MIME类型。**Servlet默认为text/plain,但通常需要显式地指定为text/html。 |
3 | Date | 当前的GMT时间。 |
4 | Expires | 应该在什么时候认为文档已经过期,从而不再缓存它 |
5 | Server | 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。 |
6 | Set-Cookie | 设置和页面关联的Cookie。 |
HTTP状态码
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态代码的第一个数字代表当前响应的类型:
- 1xx消息——请求已被服务器接收,继续处理
- 2xx成功——请求已成功被服务器接收、理解、并接受
- 3xx重定向——需要后续操作才能完成这一请求
- 4xx请求错误——请求含有词法错误或者无法被执行
- 5xx服务器错误——服务器在处理某个正确请求时发生错误
COOKIE和SESSION
cookie 和session 的区别:
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
- 考虑到安全应当使用session
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
- 考虑到减轻服务器性能方面,应当使用COOKIE
- 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
HTTPS
1.浏览器将自己支持的一套加密规则发送给网站。
2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3.获得网站证书之后浏览器要做以下工作:
a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4.网站接收浏览器发来的数据之后要做以下的操作:
a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
b) 使用密码加密一段握手消息,发送给浏览器。
5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。