专栏首页Coding迪斯尼HTTP协议原理及java实现:数据的基本传输模式

HTTP协议原理及java实现:数据的基本传输模式

zu说到基于TCP协议的上层协议,绝对绕不开的是HTTP协议,在其设计之初,设计者绝对想不到该协议具备的灵活性能够让其成为最广泛使用的TCP上层协议,在我看来HTTP协议几乎能够取代任何基于TCP的上层协议,如今基于互联网的绝大多数移动应用,他们使用的都是HTTP协议,甚至苹果专用的流媒体传输协议HLS,使用的也是HTTP协议,同时现在非常流行的所谓小程序,它们也要基于HTTP协议实现客户端与服务器端的通讯,因此掌握TCP/IP协议就必须要掌握HTTP协议。

HTTP协议的目的非常简单,就是让客户端快速简洁的从服务器请求超文本文件,随着协议的不断进化,它的灵活性能引入更多复杂功能,在深入介绍其原理之前,我们先看看协议规范下,客户端如何与服务器沟通。HTTP协议的运行基于简单的请求-回应模式,首先客户端根据HTTP协议规定构造特定结构的HTTP文本,将客户端要请求的数据信息放置在文本中发送给服务器;服务器收到请求后,结合HTTP协议规范解读客户端发送来的信息,然后将客户端请求的数据返回,HTTP基本交互模式如下:

在HTTP1.0中,客户端与服务器属于“一夜情”模式,双方建立的连接在一次信息交互后立马断开,如果双方需要多次数据交互,那么就需要进行多次tcp连接,这是1.0版本让人诟病之处,HTTP协议在运行时经常使用到中介,于是客户端先把请求发送给中介,中介先对请求数据做预处理,如果客户端想要的数据已经存储在中介,那么中介就会立即将数据返回,于是客户端与服务器就没有交互。如果中介没有客户端想要的数据,他就会将请求转发给服务器,服务器应答请求后会将数据返回给中介,中介将数据缓存,然后将数据回发给客户端,基本流程如下:

从这里可以看到,中介相对于客户端,它扮演了服务器的角色,相对于服务器,它又扮演了客户端的角色。同时可以有多个中介存在于客户端与服务器之间正如上图所示。中介对数据的缓存对HTTP协议的效率提升非常有帮助,例如在我们浏览网页时,网页数据很可能被中介服务器缓存,如果我们下次想再次浏览相同网页,那么中介就可以直接将缓存的页面返还给浏览器,于是网页打开的速度会大大加快。例如在上图中,如果最左端的客户端请求的文件在第一个中介服务器就有缓存,那么数据就不要传输到最右端的服务器,最左边的缓存可以直接将数据返回给客户端,于是客户端的处理效率能大大提升。

在HTTP1.0模式中,客户端与服务器完成一次数据交互后就断开TCP连接。这种模式虽然简单但会带来效率问题。例如浏览器像服务器请求页面后,页面显示时会包含很多图片,此时浏览器又得与服务器经过多次TCP连接来下载页面所需图片,由于TCP连接非常耗时因此这种方式会大大降低页面的加载和渲染效率。HTTP1.1对该问题进行了改良,它让客户端与服务器保持持久连接,于是客户端和服务器就可以通过一次连接传输多种数据。HTTP1.1带来的持久连接还有一个好处就是能让客户端实现请求的管道化传输,如果客户端要向服务器请求数据A,B,C,那么它不用像HTTP1.0时代,先请求A,然后请求B最后再请求C,它可以一次把三个文件的请求发送给服务器,服务器也能一次将数据推送给客户端,从而减轻了服务器负载。

当然持久连接也有代价,那就是增加了复杂性。由于服务器一次将所有数据推送给客户端,于是客户端就得负责处理一次到来的大堆数据,特别是服务器很可能把多个文件以数据流的方式推送给客户端,因此后者必须小心切分数据流将多个数据文件瓦解开来。在HTTP1.1版本中,服务器会在80端口等待客户端的连接。客户端主动发起TCP握手,实现两者的TCP连接,成功连接后客户端必须通知服务器它想使用哪个版本的HTTP协议。如果使用HTTP1.0,那么服务器会在推送一次数据后主动断开连接,如果客户端使用HTTP1.1,但它又希望服务器在推送一次数据后主动断开连接,那么它在请求数据里就要添加字段“Connection:close”,这样服务器就会在推送一次数据后断开连接。

在持久连接情况下,客户端必须要记录它从服务器获得了哪些数据。因为连接可能会因为各种原因中断。如果客户端在接收数据时连接突然中断,那么客户端需要知道哪些数据已经获取,哪些数据还没得到,那么它下次主动发起连接时就只需要请求那些还没有获得的数据。从下一节开始我们分析HTTP的数据包格式,为代码实现HTTP协议做准备。

更多精彩内容请点击’阅读原文‘连接。

本文分享自微信公众号 - Coding迪斯尼(gh_c9f933e7765d),作者:陈屹

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HTTP数据包头部格式解读1

    HTTP协议的大部分功能其实通过其协议包头来实现。因为HTTP协议包头作用如此重要,因此需要单独列出一节来详细讲解。协议包头大体上分为4类,分别为通用包头,请求...

    望月从良
  • java开发HTTP协议:HTTP协议的方法详解

    第一行第一个单词是”GET”,客户端会根据对服务器的请求来指定该单词,因此第一行第一个单词被称为HTTP协议的方法。客户端发送给服务器的请求数据包,第一个单词永...

    望月从良
  • TCP窗口调整与数据流控制以及病态窗口症状

    TCP协议主要依赖不断调整窗口大小来保证数据收发吞吐率。在三次握手时,客户端会告诉服务器自己一次能接收数据量的大小,这就对应客户端的接收窗口以及服务器的发送端口...

    望月从良
  • 前端|五分钟了解http协议

    长话短说,直接进入正题。http协议翻译成汉语就是超文本传输协议,是一个简单的请求-响应协议。它在应用层进行使用,属于Web协议族中的一种。该协议运行在TCP之...

    算法与编程之美
  • python技术面试题(五)

    What the caterpillar calls the end, the rest of the world calls a butterfly

    小闫同学啊
  • 用不到 100 行的 Golang 代码实现 HTTP 代理

    我们的目标是实现一个能处理 HTTP 和 HTTPS 的代理服务器。代理 HTTP 请求的过程其实就是一个解析请求、将该请求转发到目的服务器、读取目的服务器响应...

    企鹅号小编
  • 「首席看应用架构」轮询,SSE 和WebSocket,如何选择合适的?

    构建实时Web应用程序有点挑战,我们需要考虑如何将数据从服务器发送到客户端。能够“主动”实现这一功能的技术已经存在了很长时间,并且仅限于两种通用方法:客户端请求...

    首席架构师智库
  • WebSockets实战:在 Node 和 React 之间进行实时通信[每日前端夜话0x6C]

    Web 为了支持客户端和服务器之间的全双工(或双向)通信已经走过了很长的路。这是 WebSocket 协议的主要目的:通过单个 TCP 套接字连接在客户端和服务...

    疯狂的技术宅
  • java开发HTTP协议:HTTP协议的方法详解

    第一行第一个单词是”GET”,客户端会根据对服务器的请求来指定该单词,因此第一行第一个单词被称为HTTP协议的方法。客户端发送给服务器的请求数据包,第一个单词永...

    望月从良
  • 手游后台PVP系统网络同步方案总结

    来源:游迅网 发布者:wuyu 概述   PVP系统俨然成为现在新手游的上线标配,手游Pvp系统体验是否优秀,很大程度上决定了游戏的品质。从最近半年上线的新...

    编程范 源代码公司

扫码关注云+社区

领取腾讯云代金券