1) 网络应用层概述

网络结构是符合TCP/IP的技术栈的,它是由应用层->传输层->网络层->链路层->物理层组成
在这一章将会学习,特定网络应用以及协议:
 HTTP -> web
 SMTP, POP, IMAP -> Email
 DNS -> 一种典型的在应用层实现网络核心的协议
 P2P应用
还有socket编程,它可以帮助我们实现开发网络应用。

2) 网络应用层基本原理

2.1 网络应用的体系结构

直观的感觉:网络应用与单机应用的区别-网络应用运行在有网络的环境下,一部分的应用在本机,比如用户的浏览器,一部分运行在服务器上,比如百度的搜索应用,两者之间相互交互,完成互联网的应用。
网络应用采用如下的三种体系结构:

1.客户机/服务器结构(Client-Server, C/S)

  • 服务器
     7*24小时提供服务
     利用大量服务器实现可扩展性--->[并发用户多]
     永久性访问地址/域名--->[用户能可靠的找到你]

  • 客户机(用户)
     与服务器通信,使用服务器提供的服务
     间歇性接入网络--->[有需求才使用]
     可能使用动态IP地址
     不会与其他客户机直接通信--->[并不需要为别人提供服务]

  • web就是一种最典型的c/s结构的应用,个人pc端运行的IE浏览器,向服务器发送http请求,服务器收到请求后,把网页封装好,作为http相应发送会客户机上。

2.点对点结构(Peer-to-peer, P2P)

  • 特点
     没有永远在线的服务器
     任意端系统/节点之间可以直接通讯
     节点间歇性接入网络
     节点可能改变IP地址
  • 优点:高度可伸缩 / 缺点: 难于管理
  • BT文件共享服务就是典型的P2P结构

3.混合结构(Hybrid)

能够利用两者的优点,同时规避缺点。
曾经的音乐分享软件:Napster 采用了混合结构

  • 文件传输使用P2P结构
  • 文件的搜索采用C/S结构——集中式
     每个节点向中央服务器登记自己的内容
     每个节点向中央服务器提交查询请求, 查找感兴趣的内容

4.扩展思考

微信采用的是混合框架,在语音通话服务时采用p2p(用户和用户直连,减小服务器负担),发送文字消息采用c/s框架(可以接收离线消息)

2.2 网络应用进程通信

1. 进程间的通信

-网络应用中,运行在本机上的进程和运行在服务器上的进程如何通行?也就是说,如何解决不同主机上的不同进程间的网络通信?
我们通过操作系统的知识直到,主机上运行的程序就是一个进程。同一主机上的运行的进程之间如何通信?这是属于操作系统中,进程通信机制的内容。
我们在本小节要解决的是,不同主机上运行的程序如何通信? 采用消息/报文交换!

2. Socket套接字

利用Socket发送/接受消息,来实现不同进程间的通信。
Socket是一种抽象的概念,它是(网络)操作系统给我们提供的一种网络API,是一种网络传输的基础设施(图中浅绿色部分)向进程提供的API,通过它我们可以对底层的传输协议进行选择,并进行参数设置。
观察下图可以类比与寄信,socket就像门一样,门外就是传输基础设施,发消息就是把消息放到门外的信箱,接收消息就是从门外信箱取到门内。
socket就像门一样

3. 如何寻址进程?

接下来思考,如何保证能能准确的找到不同主机不同进程,底层的传输设施是怎么正确无误的发送消息到它想去的地方?---> 寻址!
第一步,就是寻址主机;通过IP地址
Q: 主机有了IP地址后,是否足以定位进程?
A: 否。同一主机上可能同时有多个进程需要通信,比如同时有QQ,网络音乐等多个网络应用。
为了确保不同主机的进程间的通信,每个进程必须拥有标识符!
端口号/Port number就是他们本机的标识符
 为主机上每个需要通信的进程分配一个端口号
 HTTP Server: 80
 Mail Server:25
所以说进程的标识符:IP地址 + 端口号。
进程的标识符

4. 应用层协议

网络应用要遵循应用层协议,协议保证了标准化,促进了互联网的发展。
协议的内容可以概括为:

  • 消息的类型(type) [一共有几种消息的类型]
     请求消息
     响应消息
  • 消息的语法(syntax)/格式
     消息中有哪些字段(field)?
     每个字段如何描述
  • 字段的语义(semantics)
     字段中信息的含义
  • 规则(rules)
     进程何时发送/响应消息
     进程如何发送/响应消息

5. 小结

  1. 网络应用不同进程间依靠消息交换进行通信,同时要进行寻址,就要用到IP+端口号
  2. 消息的具体交换要遵循应用层协议(http1.1/2.0),协议主要是:消息的类型,消息的结构,消息的含义,如何响应消息?