应用层常见的网络应用体系结构

  • C/S模式 (Client/Sever)
  • P2P模式 (Peer to Peer)
  • 混合模式

C/S模式和P2P模式的运作过程

在C/S模式中,

  • Sever需要一直运行
  • Client则是按需连接
  • Sever需要有一个固定的IP和固定的Port(端口号)才能方便Client的连接

常见的在Web服务中,需要一台服务器守候在80端口,在客户端(浏览器)使用域名解析到服务器IP,然后访问其80端口进行数据交换

在P2P模式中,

  • 任何一个Peer除了作为客户端外还都可以作为服务器
  • 在某个Peer请求某个资源时可以向多个用户同时请求资源,可以有不错的速度
  • 对于一个会话来说是有客户端和服务器之分的

常见的如迅雷(好像是只要不给),在准备下载某个资源时,会先与其他用户进行通信,查看其他用户是否有自己需要的内容,如果有会从其他用户那进行下载,从而提高下载的速度

C/S模式和P2P模式的特点

C/S模式在用户量增加到一定数量的时候会性能会出现断崖式的下降

而P2P模式在用户量增加时性能会均匀增加(因为增加用户的同时也就在增加服务器)

应用层和传输层进行传输前需要确定的三个问题

对于主机中的进程通信可以通过操作系统中的管道,消息队列等来进行通讯

而对于不同主机之间的进程通信(分布式进程通信)需要考虑下面的三个问题

  • 怎么做不同进程之间的标识,以及怎么找到目标进程(一般来说会有多个进程运行在同一个IP的主机上,我们需要在数据到达传输层后可以确定是哪个进程的数据)
  • 应用层和传输层是通过什么进行服务的
  • 怎么用传输层提供的服务实现应用进程之间的Message Exchange(报文交换)

对于问题1

应用层和传输层通过SAP(Service Access Point)服务连接点使用应用程序接口API(application program interface)进行层间的数据交换

  • 主机在互联网中有唯一的IP(32位)进行标识
  • 采用TCP/UDP协议
  • 端口号(Port Number)

主机间的进程通讯就是两个End Point(端节点)构成

对于问题2 应用层和传输层进行交换的数据

应用层需要向传输层提供

  • 目标主机IP(发给谁)
  • 目标主机Port(端口)可能是TCP也有可能是UDP端口(发给谁)
  • 源主机IP(谁发的)
  • 源主机Port(端口)可能是TCP也有可能是UDP端口(谁发的)
  • 需要传输的Message(报文)也就是SDU(service data unit)

传输层会对这些数据进行TCP报文段(也有可能是UDP数据报)的封装

但这种方式存在着一个问题,就是当应用层和传输层需要进行频繁的处理时(会持续一段时间),通信关系稳定,会频繁地在层间交换信息

为了降低层间交换信息的大小,引入了Socket

TCP-Socket的作用

  • Socket通过将目标主机IP,目标主机Port,源主机IP,源主机Port与一个整数设置映射使得应用层不再需要向传输层每次传递数据时都要提交目标主机IP,目标主机Port,源主机IP,源主机Port这么多的信息,只要提供一个整数就可以代表以上四个信息
  • 在传输层接受到应用层的Socket整数后,传输层会根据表将Socket整数与目标主机IP,目标主机Port,源主机IP,源主机Port进行对应,然后将进行TCP报文段封装(UDP数据包封装),再传递给下一层
  • Socket在本地做的,是一个本地标示
  • Socket使得层间交换信息最小
  • 使用Socket便于操作系统管理
  • Socket是应用层和传输层的一个约定

在TCP-Socket中(目标主机IP,目标主机Port,源主机IP,源主机Port)被成为4元组

TCP-Socket指定了应用所在的两个端节点(end point)

UDP-Socket的作用

  • UDP的Socket包含IP和端口号
  • 在传输数据报时不需要提供目标主机的IP和目标主机的端口号
  • 但是在传输报文的时候是需要目标主机的IP和端口号的
  • 在接受报文的时候目标主机的传输层也要向应用层提供源主机的IP和端口号

对于问题3 应用层协议规定的通信规则

  • 交换的报文类型
  • 各种报文类型的语法
  • 字段的语义
  • 何时、如何发送报文以及对报文应该进行响应的规则

SSL让TCP更加安全

SSL在应用层和传输层之间,为TCP提供安全性验证

保证

  • 私密性
  • 数据完整性
  • 端到端的鉴别

HTTP

HTTP是不维护状态的

持久的HTTP和非持久的HTTP

在HTTP1.0的时候默认采用的是非持久的HTTP

非持久HTTP连接指的是在连接结束后就立刻断开与服务器的连接

因此非持久的HTTP连接在下次需要请求HTTP资源的时候还需要再次与服务器建立连接

在HTTP1.1的时候默认采用的是持久的HTTP

持久的HTTP连接在服务器返回HTTP响应后不会立刻断开连接

在下次需要请求HTTP资源的时候可以直接发出HTTP请求直接获得服务器的HTTP响应

而不需要重新发出TCP连接和等待TCP连接状态的确认

流水线和非流水线的请求发送

流水线和非流水线的请求发送主要的区别在于

非流水线需要等待上一个发出的请求收到响应后才发出下一个请求

而流水线则是在发出下一个请求的下一个瞬间紧接着发送下一个请求

从RTT(round trip time)的角度出发,我们可以知道

假设某一时刻需要发送10个HTTP请求

使用流水线的方式只需要经历一个RTT,而是用非流水线的方式则需要经历10个RTT