一、应用层简述

应用层提供网络应用程序和对应的协议,常见的如web,email和DNS等。应用程序的结构有两种:C/S(client/server)结构和P2P结构。

在CS结构中,服务端IP地址固定,所以,客户端可以通过该IP地址与服务端通信。如果单台服务器的无法服务所有的客户端,就会有多台服务器(可能有十几万台)共同提供服务

P2P结构不必有专门的服务器,而只是客户主机和客户主机之间进行通信,比如BitTorrent

计算机应用程序通信实际是两个进程通信,进程通过对套接字(socket)文件进行读写来收发网络报文。如下图这样

当一个进程向另外一个进程发送数据时,需要指定两个信息,主机的地址和接受报文数据的进程标识符,其中主机地址用IP地址表示,进行标识符用端口号表示

二、应用层协议

网络报文的发出都是在应用层开始的,应用层协议定义了不同系统下的应用如何相互传递报文,包括报文类型(比如请求报文和响应报文)、报文语法语义(报文中应该有啥,每部分都代表啥)、进程发送报文的时机与响应规则。

三、HTTP

3.1、HTTP概述

HTTP全名叫超文本传输协议,是web的应用层协议。HTTP分别由客户端和服务端实现,通过交换客户端和服务端的http报文来进行通信。

HTTP是使用TCP作为传输层协议(因为TCP是可靠传输)。HTTP客户端首先向服务器发一个TCP连接请求,连接建立后,客户端浏览器通过套接字文件发送HTTP请求报文,服务端也通过套接字接受请求报文并发送对应的响应报文。接着客户端通过套接字接收来自服务端的HTTP响应报文。HTTP报文发送后,就进入传输层通过TCP进行实际的传输

示例

上述报文是打开陈硕大佬的博客(http://www.cppblog.com/Solstice/)时的报文,可见,在http报文被发出之前,先是TCP连接的建立,当TCP连接建立后,报文才会被发出

3.2、HTTP是无状态协议

客户端如果连续两次请求同一个对象,服务器并不会因为前一次的请求而不作出反应,而是重新发送http响应报文,这是因为http服务器不保存客户端的任何信息,HTTP是无状态协议

示例

上述报文是刷新两次陈硕大佬的博客时的报文,可见,HTTP服务器发送了两次响应报文

HTTP本身是无状态的协议,但是为了管理状态,引用了cookie机制,用来管理用户的状态

3.3、HTTP的持续连接和非持续连接

持续连接的意思就是所有的应用层请求都由相同的TCP连接发送,而非持续连接就是每个应用层请求都由单独的TCP连接发送

3.3.1、HTTP的非持续连接

采用非持续连接的HTTP发送报文的过程如下:

1、向HTTP服务端发起TCP连接,开始三次握手。2、客户端发送请求报文。3、HTTP服务端经过套接字收到该报文请求,找到对应请求资源,将该资源封装在HTTP的响应报文中并向客户端发送。4、客户端收到响应报文后,服务端进程向客户端请求TCP断开,开始四次挥手

每次HTTP请求的过程示意图如下

访问一个web页面的过程如下

可见,每次请求都必须造成无谓的TCP连接和断开,增加通信量

报文示例

因为现在的浏览器的HTTP协议默认都是持续连接,所以,这里使用postman实现非持续连接,将HTTP的connection字段改为close即可

HTTP报文中的connection的标志为close

对应产生的报文如下

可见,当客服端收到响应报文后,服务端立刻给客户端发送了断开TCP连接的请求,进入四次挥手的流程,上述报文也符合非持续连接的HTTP报文的发送过程

3.3.2、持续连接

非持续连接的缺点有二:1、对于每个HTTP的请求,非持续连接都会创建一个TCP连接,这样会大量消耗客户端和服务端中能提供的TCP连接数。2、正因为每个请求因为要建立TCP连接,所以每发出一个请求,客户端都会多花费一个RTT(往返时间)来传输报文,如下图

这样,对于客户端来说,每个请求的总时间就是2RTT+文件传输的时间

因为非持续连接的两个缺点,HTTP1.1之后的版本默认使用持续连接,现在的浏览器的HTTP协议默认也都是持续连接。使用持续连接的HTTP报文中的Connection字段是keep-alive

持续连接的过程示意图

示例报文

但是,HTTP的持续连接并不会一直使用该TCP连接,在响应报文中,服务端会规定keep-alive的时间,比如下面的响应报文规定keep-alive的时间为5秒

5秒后,服务端会主动断开该TCP连接并进入四次挥手流程

参考

《图解HTTP》

《计算机网络自顶向下方法》

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

二、应用层协议概述与HTTP相关推荐

  1. Day4:应用层——网络应用层内容概述、网络应用基本原理(体系结构、进程通信、套接字socket、应用层协议)、Web应用与HTTP

    加油!寒假偷博人 一.网络应用层内容概述. 1本篇内容:(原理.实例.编程) 网络应用体系结构 客户机/服务器  P2P  混合结构 网络应用的服务需求 可靠性 带宽 时延 Inte ...

  2. 应用层协议 —— HTTP(二)

    目录 一.认识URL 1. URL基本了解 2. urlencode和urldecode 二.HTTP报文内的HTTP信息 1. HTTP报文 2. 请求报文和响应报文的结构 1. 构建http请求 ...

  3. 二次实验报告:使用Packet Tracer分析应用层协议

    第二次实验报告:使用Packet Tracer分析应用层协议 个人信息 郑兰艳 201821121064 计算1813 1 实验目的 熟练使用Packet Tracer工具.分析抓到的应用层协议数据包 ...

  4. 网络体系架构—运输层协议概述

    一.进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也处于用户功能中的最底层.下面通过一个示意图来说明运输层的作用,图中的 5,4,3,2 ...

  5. 计算机网络学习(九)—应用层的概述

    计算机网络学习(九)-应用层的概述 一.应用层概述 二.服务器方式和对等方式 三.动态主机配置协议DHCP 四.域名系统DNS 五.文件传输协议FTP 六.电子邮件 七.万维网 一.应用层概述 应用层 ...

  6. 计算机网络(1)——应用层(概述到DNS)

    --计算机网络自顶向下方法第7版 本文为原书内容概括,无拓展内容,*号标注为自己理解 目录 概述: 1.网络应用是计算机网络存在的理由 本章学习有关网络应用的原理和实现 内容有关应用程序所需的网络服务 ...

  7. 基于TCP或UDP的应用层协议有哪些?——Linux网络编程

    参考博文01:https://blog.csdn.net/Wu000999/article/details/89293717 博文02 https://blog.csdn.net/u014082714 ...

  8. UDP对应的应用层协议之DHCP协议

    文章目录 一.DHCP协议是什么? 二.工作流程 一.DHCP协议是什么? DHCP是动态主机配置协议,是基于UDP的应用层协议,使用客户/服务器方式,客户端和服务端通过广播方式进行交互. DHCP提 ...

  9. UDP对应的应用层协议之DNS、DHCP

    文章目录 一.UDP对应的应用层协议? 二.DNS 1.什么是DNS? 2.DNS的工作原理? 3.为什么域名解析用UDP协议? 4.为什么区域传送用TCP协议? 5.DNS解析过程 6. DNS负载 ...

最新文章

  1. 必须掌握的八个DOS命令 [转]
  2. 几篇较新的计算机视觉Self-Attention
  3. 今日 Paper | 手部和物体重建;三维人体姿态估计;图像到图像变换等
  4. 苹果截屏快捷键_新手小白用苹果电脑搞科研,学会这些才不至于尴尬!
  5. u3d 动态 随机 地图_我的世界1.12.2模组教程:VoxelMap小地图新老玩家辅助神器
  6. AQS(CountdownLatch、CyclicBarrier、Semaphore)、FutureTask、BlockingQueue、ForkJoin
  7. chattr和lsattr命令的使用(对于root用户也无法修改删除的操作问题)
  8. 文件服务器存储,文件服务器存储
  9. 人是需要一个圈子互相激励的
  10. 手机老是应用无响应是怎么回事?
  11. MATLAB中如何忽略函数中前几个不需要的返回值而只取需要的返回值,例如:只取函数第二个返回值,而忽略第一个返回值
  12. python3.6_发送邮件
  13. 【机器学习系列】变分推断第一讲:Variational Inference背景和用途
  14. Lwip的udp编程
  15. Esxi通过U盘启动
  16. html 6位数支付密码,支付宝支付密码怎么设置长密码 支付宝支付密码取消6位数字密码设置长密码的方法...
  17. Android事件总线设计(一)- EventBus初步学习
  18. mongoDB Ops Manager
  19. 门禁系统一定要服务器吗,门禁系统服务器功能配置
  20. http 301、302、304、400、405、415状态码解释

热门文章

  1. Markdown通用的常用语法说明
  2. 类变量利用Java反射获取类的私有变量值
  3. 【Vegas原创】SQL case when 用法
  4. CCS下DSP仿真实现双边带调制与频谱分析(查表法)
  5. Java如何转换protobuf-net中的bcl.DateTime对象
  6. bzoj3218: a + b Problem
  7. 洛谷——P3205 [HNOI2010]合唱队
  8. js类数组转数组的方法(ArrayLike)
  9. 松耦合和紧耦合的架构设计、性能对比
  10. WordPress 全方位优化指南(下)