HTTP 详解(中)---会话跟踪、 长短连接、 长短连接,get post区别
1. 抓包测试
1.1. 首先在服务器创建一个简单的 HTML 文件,用浏览器访问一下,成功表示 HTML 页 面。Fiddler 就会产生下面的捕获信息。 需要留意的是
(1)因为是第一次访问该页面,客户端发请求时,请求头中没有 If-Modified-Since 标 签。
(2)服务器返回的 HTTP 状态码是 200,并发送页面的全部内容。
(3)服务器返回的 HTTP 头标签中有 Last-Modified,告诉客户端页面的最后修改时间。
1.2. 在浏览器中刷新一下页面,Fiddler 就会产生下面的捕获信息。 需要注意的是
(1)客户端发 HTTP 请求时,使用 If-Modified-Since 标签,把上次服务器告诉它的文 件最后修改时间返回到服务器端了。
(2)因为文件没有改动过,所以服务器返回的 HTTP 状态码是 304,没有发送页面的内 容。
1.3. 用文本编辑器稍微改动一下页面文件,保存。再用浏览器访问一下,Fiddler 就会产 生下面的捕获信息。
需要留意的是
(1)客户端发 HTTP 请求时,使用 If-Modified-Since 标签,把上次服务器告诉它的文 件最后修改时间返回到服务器端了。
(2)因为文件被改动过,两边时间不一致,所以服务器返回的 HTTP 状态码是 200,并 发送新页面的全部内容。
(3)服务器返回的 HTTP 头标签中有 Last-Modified,告诉客户端页面的新的最后修改 时间。
2. Http1.1 和 Http1.0 的区别
2.1. 默认持久连接和流水线 HTTP/1.1 默认使用持久连接,只要客户端服务端任意一端没有明确提出断开 TCP 连 接,就一直保持连接,在同一个 TCP 连接下,可以发送多次 HTTP 请求。同时,默认采用 流水线的方式发送请求,即客户端每遇到一个对象引用就立即发出一个请求,而不必等到收到前一个响应之后才能发出下一个请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。
HTTP/1.0 默认使用短连接,要建立长连接,可以在请求消息中包含 Connection: Keep-Alive 头域,如果服务器愿意维持这条连接,在响应消息中也会包含一个 Connection: Keep-Alive 的头域。Connection 请求头的值为 Keep-Alive 时,客户端通知服务器返回本次 请求结果后保持连接;Connection 请求头的值为 close 时,客户端通知服务器返回本次请 求结果后关闭连接。
2.2. 分块传输数据 HTTP/1.0 可用来指定实体长度的唯一机制是通过 Content-Length 字段。静态资源的 长度可以很容易地确定,但是对于动态生成的响应来说,为获取它的真实长度,只能等它完全生成之后,才能正确地填写 Content-Length 的值,这便要求缓存整个响应,在服务器端占用大量的缓存,从而延长了响应用户的时间。
HTTP/1.1 引入了被称为分块(chunked)的传输方法。该方法使发送方能将消息实体 分割为任意大小的组块(chunk),并单独地发送他们。在每个组块前面,都加上了该组块 的长度,使接收方可确保自己能够完整地接收到这个组块。更重要的是,在最末尾的地方,发送方生成了长度为零的组块,接收方可据此判断整条消息都已安全地传输完毕。这样也 避免了在服务器端占用大量的缓存。Transfer-Encoding:chunked 向接收方指出:响应 将被分组块,对响应分析时,应采取不同于非分组块的方式。
2.3. 状态码 100 Continue HTTP/1.1 加入了一个新的状态码 100 Continue,用于客户端在发送 POST 数据给服 务器前,征询服务器的情况,看服务器是否处理 POST 的数据。 当要 POST 的数据大于 1024 字节的时候,客户端并不会直接就发起 POST 请求, 而 是会分为 2 步: 1. 发送一个请求, 包含一个 Expect:100-continue, 询问 Server 是否愿意接受数据。 2. 接收到 Server 返回的 100 continue 应答以后, 才把数据 POST 给 Server。 这种情况通常发生在客户端准备发送一个冗长的请求给服务器,但是不确认服务器是否有能力接收。如果没有得到确认,而将一个冗长的请求包发送给服务器,然后包被服务器给抛弃了,这种情况挺浪费资源的。
2.4. Host 域 HTTP1.1 在 Request 消息头里多了一个 Host 域,HTTP1.0 则没有这个域。 在 HTTP1.0 中认为每台服务器都绑定一个唯一的 IP 地址,这个 IP 地址上只有一个主机。但随着虚拟 主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个 IP 地址。不同的域名访问不同的虚拟主机。
———-https://www.cnblogs.com/frankyou/p/6145485.html (http2.0 与http1.1 区别)
3. http 的请求方式 get 和 post 的区别
3.1. GET 一般用于获取或者查询资源信息,这就意味着它是幂等的(对同一个 URL 的 多个请求返回同样的结果)和安全的(没有修改资源的状态),而 POST 一般用于更新资 源信息,POST 既不是安全的,也不是幂等的。
3.2. 采用 GET 方法时,客户端把要发送的数据添加到 URL 后面(就是把数据放置在 HTTP 协议头中,GET 是通过 URL 提交数据的),并且用“?”连接,各个变量之间用“&” 连接; HTTP 协议没有对 URL 长度进行限制,由于特定的浏览器及服务器对 URL 的长度存 在限制,所以传递的数据量有限; 通过 GET 提交数据,用户名和密码将明文出现在 URL 上,因为(1)登录页面有可能被 浏览器缓存,(2)其他人查看浏览器的“历史纪录”,那么别人就可以拿到你的账号和密码 了。
而 POST 把要传递的数据放到 HTTP 请求报文的消息体中; HTTP 协议也没有进行大小限制,起限制作用的是服务器的处理程序的能力,但是,传送的数据量比 GET 方法更大 些;由于传递的数据在消息体中,安全性高,但其实用抓包软件(如 httpwatch)进行抓包 的话,可以看到传递的数据内容的。
3.3. GET 请求的数据会被浏览器缓存起来,会留下历史记录;而 POST 提交的数据不 会被浏览器缓存,不会留下历史记录。
4. 为什么 HTTP 是无状态的?如何保持状态(会话跟踪技术、状态管理)?
4.1 HTTP 无状态
无状态是指协议对于事务处理没有记忆能力,不能保存每次客户端提 交的信息,即当服务器返回应答之后,这次事务的所有信息就都丢掉了。如果用户发来一 个新的请求,服务器也无法知道它是否与上次的请求有联系。
这里我们用一个比较熟悉的例子来理解 HTTP 的无状态性,如一个包含多图片的网页 的浏览。步骤为:①建立连接,客户端发送一个网页请求,服务器端返回一个 html 页面(这 里的页面只是一个纯文本的页面,也就是我们写的 html 代码),关闭连接;②浏览器解析 html 文件,遇到图片标记得到 url,这时,客户端和服务器再建立连接,客户端发送一个图 片请求,服务器返回图片应答,关闭连接。(这里又涉及到无状态定义:对于服务器来说,这次的请求虽然是同一个客户端的请求但是服务器还是不知道这个是之前的那个客户端,即对于事务处理没有记忆能力)
4.2 优缺点
优点:服务器不用为每个客户端连接分配内存来记忆大量状态,也不用在客户端失去连接时去清理内存,节省服务器端资源,以更高效地去处理业务。
缺点:缺少状态意味着如果后续处理需要前面的信息,则客户端必须重传,这样可能导
致每次连接传送的数据量增大
4.3四种会话跟踪技术
针对这些缺点,可以采用会话跟踪技术来解决这个问题。把状态保存在服务器中,只发送回一个标识符,浏览器在下次提交中把这个标识符发送过来;这样,就可以定位存储在服务器上的状态信息了。
1.COOKIE
2.Session
3.URL 重写
4.作为隐藏域嵌入 HTML 表单中(隐藏表单域)
在浏览器和服务器之间来回传递一个标识符,这就是所谓的会话(session)跟踪。来 自浏览器的所有包含同一个标识符(这里是 SESSIONID)的请求同属于一个会话。
会话的有效期直到它被显式地终止为止,或者当用户在一段时间内没有动作,由服务器自动设置为过期。目前没有办法通知服务器用户已经关闭浏览器,因为在浏览器和服务器之间没有一个持久的连接,并且浏览器关闭时也不向服务器发送信息。同时,关闭浏览 器通常意味着会话 ID 丢失,COOKIE 将过期,或者注入了信息的 URL 将不能再使用。所以 当用户再次打开浏览器的时候,服务器无法将新得到的请求与以前的会话联系起来,则只能创建一个新的会话。然而,所有与前一个会话有关的数据依然存放在服务器上,直到会话过期被清除为止。
5. Http 的短连接和长连接的原理
HTTP 协议既可以实现长连接,也可以实现短连接。
5.1. HTTP1.0 实现长连接
在 HTTP/1.0 中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次 HTTP 操作,就建立一次连接,但任务结束就中断连接。如果客户端访问的某个 HTML 或其他类 型的 Web 页中包含有其他的 Web 资源,如 JavaScript 文件、图像文件、CSS 文件等.当浏览器每遇到这样一个 Web 资源,就会建立一个 HTTP 会话。 HTTP1.0 需要在 request 中增加”Connection:keep-alive“ header 才能够支持长连接。
HTTP1.0 KeepAlive 支持的数据交互流程如下:
a) Client 发出 request,其中该 request 的 HTTP 版本号为 1.0。同时在 request 中包含一个 header:”Connection: keep-alive“。
b) Web Server 收到 request 中的 HTTP 协议为 1.0及”Connection: keep-alive“就认为是一个长连接请求,其将在 response 的 header 中也增 加 ”Connection: keep-alive“。同时不会关闭已建立的 tcp 连接。
c)Client 收到 WebServer 的 response 中包含”Connection: keep-alive“,就 认为是一个长连接,不关闭 tcp 连接。并用该 tcp 连接再发送 request。(跳转到 a))。
5.2 HTTP1.1 使用长连接
但从 HTTP/1.1 起,默认使用长连接,用以保持连接特性。使用长连接的 HTTP 协议, 会在请求头和响应头加入这行代码
connection:keep-alive
Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。长连接中关闭 连接通过 Connection:closed 头部字段。如果请求或响应中的 Connection 被指定为 closed,表示在当前请求或响应完成后将关闭 TCP 连接。
TCP 的 keep alive 是检查 当前 TCP 连接是否活着;HTTP 的 Keep-alive 是要让一个 TCP 连接活久点。
5.3 长连接短连接的优缺点
http 长连接的优点:
1.通过开启和关闭更少的 TCP 连接,节约 CPU 时间和内存。
2.通过减少 TCP 开启和关闭引起的包的数目,降低网络阻塞。
http 长连接的缺点:
服务器维护一个长连接会增加开销。
http 短连接的优点:
服务器不用为每个客户端连接分配内存来记忆大量状态,也不用在客户端失去连接时去清理内存,节省服务器端资源,以更高效地去处理业务。
http 短连接的缺点: 如果客户请求频繁,将在 TCP 的建立和关闭操作上浪费时间和带宽
6. http 的安全问题
a、通信使用明文不加密,内容可能被窃听
b、不验证通信方身份,可能遭到伪装
c、无法验证报文完整性,可能被篡改
6.1 Https 的作用
HTTPS 就是 HTTP 加上加密层处理(一般是 SSL 安全通信线路)实现身份认证+完整性保护+加密传输。
1.内容加密 建立一个信息安全通道,来保证数据传输的安全;
相关技术:
对称加密算法——用于对真正传输的数据进行加密。
2.身份认证 确认网站的真实性
相关技术:
非对称加密算法——A传资料给大家时,会以自己的私钥做签章,如此所有收到讯息的人都可以用A的公钥进行验章,便可确认讯息是由 A 发出来的了
3.数据完整性 防止内容被第三方冒充或者篡改
相关技术:
散列算法——用于验证数据的完整性
非对称算法——发送的内容必须加密,在邮件的传输过程中不能被别人看到。
当A->B资料时,A会使用B的公钥加密,这样才能确保只有B能解开
非对称加密算法:用于在握手过程中加密生成的密码。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄露。(现在由数字证书中有网站的公钥)
数字证书:其实就是一个小的计算机文件,其作用类似于我们的身份证、护照,用于证明身 份,在 SSL 中,使用数字证书来证明自己的身份。
因此https 中:客户端有公钥,服务器有私钥,客户端用公钥对对称**
进行加密,将加密后的对称**发送给服务器,服务器用私钥对其进行解密,所以客户端和服务器可用对称**来进行通信。公钥和私钥是用来加***,而对称**是用来加密数据,分别利用了两者的优点。