Http协议的完整配置

好的,推迟到这里,基本上理解了http协议的配置。接下来简单总结一下,http协议包含两条消息。一条是请求消息,一条是响应消息。

索要报纸

请求消息格式由三部分组成:起始行、第一个字段和正文

回应讯息

回应的信息形式也是如此。分为三部分

Http协议的扩展

Http协议除了这两个基本组件外,还有很多人比较常见的属性或配置。我也简单地列出来。

传输的文件太大怎么办?

服务器返回的资源文件相对较大。例如,某些js文件大小可能为几兆字节。

文件过大就会影响传输的效率,同时也会带来带宽的消耗。怎么办呢?

1. 常见的手段是,对文件进行压缩,减少文件大小。那压缩和解压缩的流程怎么实现呢?首先服务端需要能支持文件的压缩功能,其次浏览器能够针对被压缩的文件进行解压缩。浏览器可以指定 Accept-Encoding 来高速服务器我当前支持的编码类型

Accept-Encoding:gzip,deflate

那服务端会根据支持的编码类型,选择合适的类型进行压缩。常见的编码方式有:gzip/deflate

2. 分割传输

在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种把实体主体分块的功能称为分块传输编码(Chunked Transfer Coding)。

每次请求都要建立连接吗?

在最早的 http 协议中,每进行一次 http 通信,就需要做一次 tcp 的连接。而一次连接需要进行3 次握手,这种通信方式会增加通信量的开销。

所以在 HTTP 中改用了持久连接,就是在一次连接建立之后,只要客户端或者服务端没有明确提出断开连接,那么这个 tcp 连接会一直保持连接状态。

持久连接的一个最大的好处是:大大减少了连接的建立以及关闭时延。

HTTP1.1 中有一个 Transport 段。会携带一个 Connection:Keep-Alive,表示希望将此条连接作为持久连接。

HTTP 持久连接在默认情况下是激活的,除非特别指明,否则 HTTP 假定所有的连接都是持久的,要在事务处理结束之后将连接关闭,HTTP 应用程序必须向报文中显示地添加一个 Connection:close 首部。

HTTP1.1 客户端加载在收到响应后,除非响应中包含了 Connection:close 首部,不然 HTTP连接就仍然维持在打开状态。但是,客户端和服务器仍然可以随时关闭空闲的连接。不发送Connection:close 并不意味这服务器承诺永远将连接保持在打开状态。

管道化连接: http 允许在持久连接上使用请求管道。以前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。

Http 协议的特点

Http 无状态协议

HTTP 协议是无状态的,什么是无状态呢?就是说 HTTP 协议本身不会对请求和响应之间的通信状态做保存。

但是现在的应用都是有状态的,如果是无状态,那这些应用基本没人用,你想想,访问一个电商网站,先登录,然后去选购商品,当点击一个商品加入购物车以后又提示你登录。这种用户体验根本不会有人去使用。那我们是如何实现带状态的协议呢?

客户端支持的 Cookie

Http 协议中引入了 cookie 技术,用来解决 http 协议无状态的问题。通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态;Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。

服务端支持的 session

服务端是通过什么方式来保存状态的呢? 在基于 Tomcat 这类的 jsp/servlet 容器中,会提供Session 这样的机制来保存服务端的对象状态,服务器使用一种类似于散列表的结构来保存信息,当程序需要为某个客户端的请求创建一个 session 的时候,服务器首先检查这个客户端的请求是否包含了一个 session 标识- session id;

如果已包含一个 session id 则说明以前已经为客户端创建过 session,服务器就按照 session id 把这个 session 检索出来使用(如果检索不到,会新建一个);

如果客户端请求不包含 sessionid,则为此客户端创建一个 session 并且生成一个与此 session相关联的 session id, session id 的值是一个既不会重复,又不容易被找到规律的仿造字符串,这个 session id 将会返回给客户端保存。

Tomcat 实现 session 的代码逻辑分析

我们以 HttpServletRequest#getSession() 作为切入点,对 Session 的创建过程进行分析

我 们 的 应 用 程 序 拿 到 的 HTTPServletRequest 是

org.a(除非某些 Filter 进行了特殊处理 ),它是org.a 的门面模式。首先,会判断 Request 对象中是否存在 Session,如果存在并且未失效则直接返回。

如果不存在 Session,则尝试根据 requestedSessionId 查找 Session,如果存在 Session 的话则直接返回,如果不存在的话,则创建新的 Session,并且把 sessionId 添加到 Cookie 中,后续的请求便会携带该 Cookie,这样便可以根据 Cookie 中的 sessionId 找到原来创建的Session 了。

Https 协议基本分析

由于 HTTP 协议在通信过程中,是基于明文通信,并且底层是基于 TCP/IP 协议进行通信,那么按照 TCP/IP 协议族的工作机制,通信内容在所有的通信线路上都有可能遭到拦截和窃取。窃取这个过程其实很简单,通过抓包工具 Wireshark 就可以截获请求和响应的内容。

https 安全传输协议

由于 HTTP 协议通信的不安全性,所以人们为了防止信息在传输过程中遭到泄漏或者篡改,就想出来对传输通道进行加密的方式 https。

https 是一种加密的超文本传输协议,它与 HTTP 在协议差异在于对数据传输的过程中,https对数据做了完全加密。由于 http 协议或者 https 协议都是处于 TCP 传输层之上,同时网络协议又是一个分层的结构,所以在 tcp 协议层之上增加了一层 SSL(Secure Socket Layer,安全层)或者 TLS(Transport Layer Security) 安全层传输协议组合使用用于构造加密通道;Ssl 是 netscape 公司设计的(Secure sockets layer),后来互联网标准化组织 ISOC 接替了NETScape 公司,发布了 SSL 的升级版 TLS。接着 TLS 的版本又进行了多次升级; 实际上我们现在的 HTTPS 都是用的 TLS 协议,但是由于 SSL 出现的时间比较早,并且依旧被现在浏览器所支持,因此 SSL 依然是 HTTPS 的代名词。

相关推荐