通信协议之应用层

2023-11-14

通信协议之应用层

应用层包含所有的高层协议,例如FTP (File Transfer Protocol的简写,中文名称是文件传输协议)、SMTP (Simple Mail Transfer Protocol的简写,中文名称是简单电子邮件传输协议)、DNS (Domain Name Service的简写,中文名称是域名服务)和HTTP(HyperText Transfer Protocol的简写,中文名称是超文本传送协议等。HTTP是当今互联网应用中使用最广泛的应用层协议,也是应用程序间远程通信所采用比较多的协议。

HTTP是HyperText Transfer Protocol的简写,中文名称是超文本传输协议。它是互联网中应用最为广泛的协议,基于浏览器的HTML、XML、JSON等格式的文本都是通过HTTP进行传输的。它非常便捷,客户端向服务端请求服务时,只需发送路径、参数以及请求方法即可。请求方法常用的有GET、POST、UPDATE、DELETE等,它们组成RESTful架构风格的不可或缺的一部分。

HTTP/1.1

HTTP/1.1是自1999年正式标准化,到目前为止采用广泛。

HTTP/1.1是无连接且无状态的,无连接是指每次连接只处理一个请求,服务端处理完该请求并收到应答后,即断开连接。无状态是指协议对于业务事务处理并没有记忆能力,如果后续处理需要之前的信息,则本次请求必须一次性的包含之前的信息。

在HTTP/1.1时代,由于无法在同一个连接上并发请求,浏览器需要花费大量的时间等待每一个资源被响应。因此,浏览器通常需要开启多个连接来加速请求资源的过程。但过多连接开启的代价是十分昂贵的,所以,现代浏览器通常都有最多开启 6至8 个 HTTP/1.1 连接的限制。因此才会产生各种CSS,JavaScript以及图片合并技术,用于将众多小文件和并未一个完整的大文件来降低文件的个数,来提升浏览器加载的性能的效果。但不幸的是,单一的大文件会阻塞后续的请求,极度影响用户体验。总之,连接的限制逐渐成为了整个WEB 系统的性能瓶颈。

HTTP/2

直到2015年,HTTP才进行了首次重大的升级,这就是HTTP/2。HTTP/2 的目标是在与 HTTP/1.1语义完全兼容的前提下,进一步减少网络延迟。也就是说,HTTP/2 是在不改变原有 WEB 体系的同时,使性能进行提升。HTTP/2通过多路复用机制,来提升HTTP/1.1的性能。

HTTP/2 的多路复用机制,允许通过单一的连接同时发起多个的请求和响应的消息,这极大地提升了网络传输的性能 。通过下图可以清晰的看到HTTP/1.1和HTTP/2的差别。

HTTP/1.1和HTTP/2的差别
HTTP/1.1和HTTP/2的差别

在HTTP/1.1协议中,展现一个包含CSS和JavaScript的HTML页面,需要以下9个步骤:

  1. 浏览器和服务器创建连接。

  2. 客户端通过GET方法请求index.html来获取页面内容。

  3. 服务器返回index.html的内容。

  4. 客户端通过GET方法请求style.css来获取页面样式表。

  5. 服务器返回style.css的内容。

  6. 客户端通过GET方法请求script.js来获取JavaScript脚本渲染页面。

  7. 服务器返回script.js的内容。

  8. 浏览器加载完毕,开始渲染页面。

  9. 关闭连接。

可以看到,对于渲染每个页面,都需要加载一个页面的HMTL、CSS和JavaScript文件,它们是同步等待的过程,虽然可以通过开启多个连接来加速加载,但会增加服务器端的负荷。并且每次请求结束之后,浏览器和服务器之间的连接即关闭,下次请求还需要经过握手并建立连接的过程。
HTTP/2协议将展现一个页面的过程进行了很大的优化,它只包含7个步骤:

  1. 浏览器和服务器创建连接。由于HTTP/2协议支持长连接,因此如果上次的连接仍然存在,则此步骤可以省略。

  2. 客户端通过GET方法请求index.html来获取页面内容。因为必须先获取了HTML的内容,才能知道该页面中还包含哪些资源需要加载,因此获取页面内容是同步的。

  3. 服务器返回index.html的内容。

  4. 客户端通过GET方法请求style.css和script.js来获取页面样式表和JavaScript脚本。通过一个连接的多路复用可以同时请求多个文件。

  5. 服务器通过连接的多路复用返回style.css和script.js的内容。

  6. 浏览器加载完毕,开始渲染页面。

  7. 保留连接,以便下次请求时使用。可以通过设置连接保留时间和最大连接限制以避免用户离开网站以及服务端持有的连接过多的问题。

关于HTTP/2比HTTP/1.1的性能对比,感兴趣的读者不妨访问一下https://http2.akamai.com/demo

这是Akamai公司建立的一个官方演示,这个演示同时请求379张图片,用于展示HTTP/1.1和HTTP/2的性能差距。不同的电脑配置、网络情况以及服务器负载等情况不同,得到的结果肯定也不同,下图是笔者使用自己的电脑加载时间截图。

这里写图片描述
HTTP/2 通过数据流(stream)的方式支持连接的多路复用。一个连接可以包含多个数据流,多个 流发送的数据互相不影响,将请求和响应在同一个连接中分成不同的数据流可以进一步的提升交互的性能。HTTP/2将每次请求和响应以帧(frame)为单位进行了更细粒度的划分,所有的帧都在数据流上进行传输,数据流会确定好帧的发送顺序,另一端会按照接收的顺序来处理。除了多路复用,HTTP/2还提供服务器推送和请求头压缩等功能。

长连接 VS 短连接

长连接和短连接是指客户端连接服务端的方式。长连接指客户端与服务端长期保持连接,连接不会在一次业务操作结束后断开,连接一旦创建成功,将进行最大限度的复用以节省资源开销和性能的提升。长连接的维护成本较高,需要实时的监控检查用以保持连接的连通性。短连接指客户端和服务端在处理完一次请求之后即断开连接,下次请求的处理则需要重新建立连接。虽然每次建立连接的消耗较大,但短连接无需维护连接的状态,实现复杂度大幅降低。

对于长连接和短连接的认识,有几个常见的误区。第一个误区认为区分TCP和HTTP的关键在于TCP是长连接,HTTP是短连接。通过前面章节的阐述,读者可以理解到TCP与HTTP处于不同的网络分层,而HTTP是基于TCP的,因此TCP和HTTP的区别并不是长连接和短连接。第二个误区认为HTTP只能使用短连接。前面的章节也阐述过,HTTP自HTTP/2以来,已经全面支持长连接,而TCP也可以实现为短连接,这仅仅取决于客户端是否在完成一次请求之后即断开连接。那么,对于长连接还是短连接,应该如何选择呢?

长连接更加适合于端对端的频繁通信。每个基于TCP的连接都需要经过三次握手,高频度的通信如果将时间都浪费在连接的建立上,就很不划算了。但是,由于维护连接所带来的消耗,连接的数量则无法无限制的增长。综上所述,长连接更加适合于面向后端的系统之间的交互。例如:应用系统之间交互,数据库访问服务与数据库交互等。它们的共同特点是交互频度高且连接个数有限。

对于基于B/S的浏览器与服务器交互的情况,更加合适使用短连接。由于HTTP是无状态的,浏览器和服务器每进行一次交互,则建立一次连接,任务结束后直接关闭连接。面向互联网海量用户的网站,为每一个用户维持一个连接,是无法承受的成本,而且相对于服务之间的交互,人为操作的频度并不是一个数量级。除了面向用户的连接外,面向服务的后端场景也是有可能使用短连接的,由于基于HTTP的短连接实现非常便捷,因此如果服务间交互的性能不是系统瓶颈的话,使用短连接也是合适的。

总之,选择长连接还是短连接不能一言以蔽之,而是应该视情况而定。

查看原文服务化基石之远程通信系列二:通信协议之应用层

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通信协议之应用层 的相关文章

随机推荐

  • C语言-宏定义

    C语言 宏定义 1 宏定义是什么 2 宏定义怎么用 2 1 宏定义常量 2 1 1 预定义宏 2 1 2 自定义宏 2 2 带参数的宏 2 3 编译预处理 3 宏展开 4 编译预处理指令 1 宏定义是什么 宏是用来表示一段代码的标识符 宏也
  • how to unzip split file

    1 how to unzip split file cat zipfile tar gz tar zxv
  • springBoot整合log4j2

    文章目录 什么是log4j2 springBoot依赖的引入 接下来是log4j2的示例配置 首先在application yml制定采用哪个配置文件 在resources目录下新建log4j2 xml文件 什么是log4j2 Apache
  • Linux系统:stress-ng测压工具

    目录 一 理论 1 stress工具简介与安装 2 语法及参数 3 具体安装 二 实验 1 运行8 cpu 4 fork 5 hdd 4 io 50 vm 10小时 2 CPU测试 3 内存测试 4 IO测试 5 磁盘及I O测试 三 问题
  • Java同步代码块详解

    目录 一 什么是内置锁 二 什么是重入 三 活跃性与性能 四 对象的共享 1 可见性 2 非原子的64位操作 3 volatile变量 一 什么是内置锁 Java提供了一种内置的锁机制来支持原子性 同步代码块 同步代码块包含两部分 一个作为
  • SQL,如何更新表结构

    We can alter an existing table structure using the ALTER TABLE command followed by the alteration you want to make 我们可以使
  • 【Unity】[帮助文档] AddForce函数详解,参数ForceMode(Acceleration、Force、Impulse 和 VelocityChange)的选择

    背景 经常忘 经常查 倒不如我自己写一篇给自己方便参考 毕竟每次都在某N站查出来的都是不知道互抄到哪一年的机翻文章 本文涉及代码与测试参考unity版本为2021 3 AddForce 用于对rigidbody组件对象添加力的作用 其参数决
  • 编程题思路1

    1反转链表 2节点两两反转 3判断链表是否有环 1 0 5毫秒内是否出现Null 2 set中查重 3 快慢指针 4匹配左右括号 5实时判断第K大的元素 大顶堆 实时排序 6 乱序判断 法一 sort NlogN return sorted
  • 手机屏幕的DPI和PPI有什么区别?

    为什么有的手机厂商在屏幕参数一栏标注PPI 而有的手机却标注DPI 这其中又有什么猫腻呢 不同的标注方法会对手机产生那些影响 PPI和DPI的区别是什么 分别都是如何计算的 对你的视觉体验会产生多大的影响呢 DPI即dot per inch
  • 抽取式文档摘要方法(一)

    1 抽取式 从文档中抽取已有句子形成摘要 实现简单 能保证句子的可读性 可看作一个组合优化问题 可与语句压缩一并进行 可看作混合式方法 2 抽取式文档摘要的关键技术 重要信息评估 冗余信息的过滤 碎片化信息的聚合 多源信息的篇章组织 其中单
  • JavaScript——操作浏览器窗口

    学习内容 今天学习了alert提示框 提示框中的内容 就是alert后边小括号中的内容 例如 alert 我要学JavaScript alert 我要学习 学习总结 日常小总结 例如 后面的分号 可以随便去掉 不影响运行效果 不能去掉小括号
  • 在“信创”大背景下 美信时代的业务思路

    数据量的飞速增长 并不是单纯对云端进行扩容就可以完全应对的 大量的数据汇聚到云端进行处理 带来的延迟逐渐让人无法忍受 在移动智能设备终端 延迟往往令实时互动滞后 严重影响体验 在制造业领域 监控瞬时数据量巨大 留给异常数据的处理窗口很小 传
  • lvgl小部件-基础对象学习篇(二)

    lvgl小部件 基础对象学习篇 二 学习材料 工具 QT Creator 5 12 3 lvgl 源代码 极客笔记 学习过程 内容 LVGL 基础对象 坐标 尺寸 位置 对齐 父子关系 屏幕 层次 事件处理 部件 状态 风格 属性 保护 组
  • FreeRTOS学习(三)开关中断

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 背景知识 Cotex M3的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽 NMI 1个Systick 滴答定时器 Cortex M处理
  • Camunda流程驳回至上一节点

    文章目录 前言 一 版本 二 实现 1 回退至上一节点 2 回退至开始节点 3 测试方法 前言 Camunda驳回至上一节点 网上大多都是回退至开始节点 这样逻辑比较简单清晰 但实际使用中 往往需要驳回至上一节点 甚至需要连续驳回多次 流程
  • 读书:《完美主义扼杀效率》

    作者是日本人 全书对比了33条完美主义和实效主义的做法 我只挑几条有感觉的记录在一页纸上 时刻提醒自己 做事的时候不过于追求完美 而是要抓住重点
  • Python脚本05 —— 从七牛服务器下载图片

    coding utf 8 从测试七牛服务器下载图片 import sys import urllib urllib2 import os from qiniu import Auth from qiniu import BucketMana
  • HA集群--corosync+pacemaker

    一 高可用集群的架构 从微观上讲 高可用集群可分为4个层次 1 第一层是信息和基础架构层 主要用于节点之间传心跳信息 节点之间通过UDP传递心跳信息 可以通过广播 组播 单播等方式 2 第二层是成员关系层 作用是主节点通过cluster c
  • C++ 单链表数据操作

    此程序演示带头结点的单链表的实现 数据元素是整数 include
  • 通信协议之应用层

    通信协议之应用层 应用层包含所有的高层协议 例如FTP File Transfer Protocol的简写 中文名称是文件传输协议 SMTP Simple Mail Transfer Protocol的简写 中文名称是简单电子邮件传输协议