主要为上一次没有写道的应用层应用,包括Email、DNS、P2P,以及Socket编程。

Email应用

Email应用的构成

邮件客户端:读、写Email消息

邮件服务器:提供邮箱,存储发给该用户的Email;消息队列,存储等待发送的Email

SMTP协议

邮件服务器之间传递消息所使用的协议。

使用TCP协议,端口25。

三个阶段:握手、消息的传输、关闭

命令/响应交互模式:

​ 命令(command):ASCII文本

​ 响应(response):状态代码和语句

SMTP交互模式

特点:使用持久性连接、要求消息必须由7位ASCII码构成、利用CRLF.CRLF确定消息的结束。

HTTP为拉式,SMTP为推式。都使用命令/响应交互模式,命令和状态码都为ASCII码,HTTP将每个对象封装在独立的响应消息中,SMTP将多个对象在由多个部分构成的消息中发送。

Email消息格式

头部行(header):To,From,Subject (与SMTP命令不同)

消息体:消息本身,只能是ASCII字符

MIME(多媒体邮件扩展):通过在邮件头部增加额外的行以声明MIME的内容类型

MIME

将多媒体数据按照规定的编码方式编码为ASCII码放到消息体中。

邮件访问协议

POP(Post Office Protocol)协议:

​ 认证和下载,无状态协议

IMAP(Internet Mail Access Protocol):

​ 更多的功能,能够操纵服务器上存储的信息,允许用户利用文件夹组织消息,支持跨会话的用户状态

HTTP:

​ 163,QQ等

DNS(Domain Name System)

目的:解决互联网上的主机/路由器识别问题,域名和IP地址之间的映射。

DNS:由多层命名服务器构成的分布式数据库,完成名字的解析。

功能:域名向IP地址的翻译、主机别名、邮件服务器别名、负载均衡(提供多个映射,轮流访问)。

集中式DNS的缺点:单点失败问题、流量问题、距离问题、维护性问题。

DNS服务器结构

DNS层次

DNS查询过程

  • 根域名服务器:本地域名服务器无法解析时,访问根域名服务器

  • 顶级域名服务器(TLD):负责com,org,net等顶级域名和国家顶级域名

  • 权威域名服务区:组织的域名解析服务器,提供组织内部服务器的解析服务

  • 本地域名解析服务器:不严格属于层次体系,每一个ISP有一个本地域名服务器,当主机进行DNS查询时,将查询发送出去,功能类似于proxy

查询时采用迭代查询或递归查询

迭代查询:

迭代查询

递归查询:

递归查询

DNS记录缓存与更新

只要域名解析服务器获得域名——IP映射,就缓存信息。

DNS记录和消息格式

DNS记录

资源记录(RR,resource records):name,value,type,ttl

  • Type=A:(主机到IP的映射) name:主机域名 value:IP地址

  • Type=NS:(域到解析服务器的映射)name:域 Value:该域权威域名解析服务器的主机域名

  • Type=CNAME (别名)name:别名 value:真实域名

  • Type=MX (用于邮件服务)value是与name相对应的邮件服务器

DNS协议

查询(query)/回复(reply)协议,消息格式相同

DNS报文

P2P应用

特点:没有服务器和客户的概念,任意端系统之间直接通信,结点间断性接入,IP地址可能改变。

BitTorrnt

torrent:交换同一个文件快的结点组

tracker:跟踪参与torrent的结点

​ 文件被划分为256KB的chunk,结点加入torrent后,向tracker注册以获得节点清单,与某些邻居建立连接,下载的同时,结点需要向其他结点上传chunk,一旦结点获取完整文件,可以离开或留下。

​ 任意时刻,不同的结点持有不同chunk集合,结点定期查询每个邻居持有的chunk列表,结点优先请求稀缺的chunk。同时,有“一报还一报”的机制激励结点向其他结点上传。

索引技术

P2P系统的索引:信息到结点位置(IP+端口号)的映射。

文件共享中,利用索引动态跟踪结点共享的文件的位置;在即时消息软件中,索引负责将用户名映射到位置。

集中式索引

​ 拥有一个中央服务器,任意一个结点加入时,需要通知中央服务器,查找时需要请求中央服务器获取信息。

​ 缺点:单点失效问题(类比集中式DNS的缺点)、性能瓶颈、版权问题。

洪泛式查询

​ 完全分布式架构,每个结点对它共享的文件进行索引,且只对它共享的文件进行索引。

​ 结点X与Y之间如果有TCP连接,就构成图中的一个边,所有的结点和边形成覆盖网络。查询消息通过已有的TCP连接发送。收到查询的结点会继续转发查询消息,如果查询命中,则利用反向路径发回查询结点。这样的查询方式称为洪泛式查询。

洪泛式查询

​ 洪泛式查询会导致消息泛滥,引起网络拥堵。

层次式覆盖网络

​ 介于集中式索引和洪泛查询之间。每个结点或者是一个超级结点,或者被分配一个超级结点。结点与超级结点之间维持TCP连接,某些超级结点对之间维持TCP连接。超级结点负责跟踪子节点的内容。

层次式覆盖网络

Socket编程

网络程序可能的设计方式:

  • 直接网卡编程:硬件相关

  • 基于Packet Driver编程:屏蔽网卡细节

  • 基于NDIS网络编程:Windows

  • 基于一些函数库

  • NetBIOS编程:Windows

  • socket编程:在应用层和传输层之间

  • Web/RPC/中间件编程:应用层之上

    ​ Socket对外通过IP地址和端口号来标识通信端点,在操作系统内通过套接字描述符管理。类似于文件的抽象,当应用进程创建套接字时,操作系统分配一个数据结构存储套接字的相关信息,同时返回套接字描述符,指向对于的Socket数据结构。