精华内容
参与话题
问答
  • 现在我们来创建应用层,这样客户端只与应用层打交道就可以了。 与前面创建领域层模块和数据访问EF模块一样,我们在解决方案中增加.Net Core类库项目,作为服务层模块,将项目命名为ZL.AbpNext.Poem.Application,...

    现在我们来创建应用层,这样客户端只与应用层打交道就可以了。
    与前面创建领域层模块和数据访问EF模块一样,我们在解决方案中增加.Net Core类库项目,作为服务层模块,将项目命名为ZL.AbpNext.Poem.Application,我们需要使用Nuget管理器,为项目增加必要的依赖项,如下:
    在这里插入图片描述
    然后,增加一个Abp模块,名称为PoemApplicationModule,这个模块依赖于PoemCoreModule。
    接下来,创建一个目录Poems,在这个目录中增加一个Dto类PoetDto:

    namespace ZL.AbpNext.Poem.Application.Poems
    {
        public class PoetDto:EntityDto<int>
        {
            public string Name { get; set; }
    
            public string Description { get; set; }
        }
    }
    

    DTO的目的是隔离客户端与领域模型,但很多情况下,DTO与领域模型基本上是相同的,ABP使用AutoMapper实现DTO到领域实体的映射。这需要创建一个映射Profile:

    using ZL.AbpNext.Poem.Core.Poems;
    
    namespace ZL.AbpNext.Poem.Application.Poems
    {
        public class PoemAppAutoMapperProfile : Profile
        {
            public PoemAppAutoMapperProfile()
            {
                CreateMap<Poet, PoetDto>();
            }
        }
    }
    

    还需要在模块中进行声明:

    using System;
    using Volo.Abp.AutoMapper;
    using Volo.Abp.Modularity;
    using ZL.AbpNext.Poem.Application.Poems;
    using ZL.AbpNext.Poem.Core;
    
    namespace ZL.AbpNext.Poem.Application
    {
        [DependsOn(
            typeof(PoemCoreModule), 
            typeof(AbpAutoMapperModule))]
        public class PoemApplicationModule : AbpModule
        {
            public override void ConfigureServices(ServiceConfigurationContext context)
            {
                Configure<AbpAutoMapperOptions>(options =>
                {
                    options.AddProfile<PoemAppAutoMapperProfile>(validate: true);
                });
            }
        }
    }
    

    现在创建IPoemAppService接口:

    using System;
    using Volo.Abp.Application.Dtos;
    using Volo.Abp.Application.Services;
    
    namespace ZL.AbpNext.Poem.Application.Poems
    {
        public interface IPoemAppService:IApplicationService
        {
            /// <summary>
            /// 获取诗人分页
            /// </summary>
            /// <param name="dto"></param>
            /// <returns></returns>
            PagedResultDto<PoetDto> GetPagedPoets(PagedResultRequestDto dto);
        }
    }
    
    

    我们先只增加一个函数,获取分页的诗人。然后我们创建PoemAppService:

    using System.Collections.Generic;
    using System.Linq;
    using Volo.Abp.Application.Dtos;
    using Volo.Abp.Application.Services;
    using Volo.Abp.Domain.Repositories;
    using Volo.Abp.Uow;
    using ZL.AbpNext.Poem.Core.Poems;
    
    namespace ZL.AbpNext.Poem.Application.Poems
    {
        public class PoemAppService : ApplicationService, IPoemAppService
        {
            private readonly IRepository<Poet> _poetRepository;
            public PoemAppService(IRepository<Poet> poetRepository)
            {
                _poetRepository = poetRepository;
            }
            public PagedResultDto<PoetDto> GetPagedPoets(PagedResultRequestDto dto)
            {
               using (var uow = UnitOfWorkManager.Begin(new AbpUnitOfWorkOptions()))
                {
                    var count = _poetRepository.Count();
                    var lst = _poetRepository.OrderBy(o => o.Id).PageBy(dto).ToList();
                    var items = new List<PoetDto>();
                    
                    return new PagedResultDto<PoetDto>
                    {
                        TotalCount = count,
                        Items = ObjectMapper.Map<List<Poet>, List<PoetDto>>(lst)
                    };
                }
                
            }
        }
    }
    
    

    另外中直接创建crud服务,不推荐使用:

    public interface IShoppingCartAppService:ICrudAppService<ShoppingCartDto, int, PagedAndSortedResultRequestDto, ShoppingCartInputDto, ShoppingCartUpdateDto>//IApplicationService
        {
             ShoppingCartDto Create(ShoppingCartInputDto input);
            //Task CreateAsync(ShoppingCartInputDto sci);
        }
    --------------------------------------
    public class ShoppingCartAppService : CrudAppService<ShoppingCarts,ShoppingCartDto,int,PagedAndSortedResultRequestDto, ShoppingCartInputDto, ShoppingCartUpdateDto>, IShoppingCartAppService//ApplicationService, IShoppingCartAppService
        {
    
    
            public ShoppingCartAppService(IRepository<ShoppingCarts,int> repositoryShoppingCarts):base(repositoryShoppingCarts)
            {
                _repositoryShoppingCarts = repositoryShoppingCarts;
            }
    
    
    
            private readonly IRepository<ShoppingCarts,int> _repositoryShoppingCarts;
    
            //public ShoppingCartAppService(IRepository<ShoppingCarts> repositoryShoppingCarts)
            //{
            //    this._repositoryShoppingCarts = repositoryShoppingCarts;
            //}
            public override ShoppingCartDto Create(ShoppingCartInputDto input)
            {
                var shoppingCart = ObjectMapper.Map<ShoppingCarts>(input);
                _repositoryShoppingCarts.Insert(shoppingCart);
                return ObjectMapper.Map<ShoppingCartDto>(shoppingCart);
            }
            //public override async Task CreateAsync(ShoppingCartInputDto sci)
            //{
            //    var shoppingCart = ObjectMapper.Map<ShoppingCarts>(sci);
            //    await _repositoryShoppingCarts.InsertAsync(shoppingCart);
            //}
        }
    

    到这里,应用层编写完成,下面使用Client调用应用层。
    首先,在PoemConsoleClientModule中增加PoemApplicationModule依赖:

    using Volo.Abp.Autofac;
    using Volo.Abp.Modularity;
    using ZL.AbpNext.Poem.Application;
    using ZL.AbpNext.Poem.Core;
    using ZL.AbpNext.Poem.EF;
    
    namespace ZL.AbpNext.Poem.ConsoleClient
    {
        [DependsOn(
        typeof(AbpAutofacModule),
        typeof(PoemCoreModule),
        typeof(PoemApplicationModule),
        typeof(PoemDataModule))]
        public class PoemConsoleClientModule:AbpModule
        {
    
        }
    }
    
    

    然后,改造Service,使用服务层访问数据:

    using Microsoft.EntityFrameworkCore;
    using System;
    using System.Linq;
    using Volo.Abp.DependencyInjection;
    using Volo.Abp.Domain.Repositories;
    using Volo.Abp.Uow;
    using ZL.AbpNext.Poem.Application.Poems;
    using ZL.AbpNext.Poem.Core.Poems;
    
    namespace ZL.AbpNext.Poem.ConsoleClient
    {
        public class Service : ITransientDependency
        {
            //IRepository<Poet> repository;
            //IUnitOfWorkManager uowManager;
            IPoemAppService appService;
            //public Service(IRepository<Poet> repository, IUnitOfWorkManager uowManager)
            //{
            //    this.repository = repository;
            //    this.uowManager = uowManager;
            //}
            public Service(IPoemAppService appService)
            {
                this.appService = appService;
            }
            public void Run()
            {
                //Console.WriteLine("你好");
                //using (var uow = uowManager.Begin(new AbpUnitOfWorkOptions()))
                //{
                //    //获取第一个诗人
                //    //var poet = repository.FirstOrDefault();
                //    var poet = repository.AsQueryable().Include(p => p.Poems).FirstOrDefault();
                //    Console.WriteLine(poet.Name);
                //    Console.WriteLine(poet.Poems.Count());
                //    Console.WriteLine(poet.Poems.ToList()[0].Author.Name);
                //}
                var res=appService.GetPagedPoets(new Volo.Abp.Application.Dtos.PagedResultRequestDto { MaxResultCount = 10, SkipCount = 0 });
                Console.WriteLine(res.TotalCount);
                foreach(var dto in res.Items)
                {
                    Console.WriteLine(dto.Name);
                }
            }
        }
    }
    
    

    运行如下:

    在这里插入图片描述

    展开全文
  • 我们继续应用层的开发,首先创建负责在应用层和展示层之间传递数据的对象,也就是DTO。 使用DTO的原因 为什么需要DTO呢?有如下几个原因。 隔离领域层与表示层,使领域层和表示层可以独立演化,互相不受影响。 数据...

    我们继续应用层的开发,首先创建负责在应用层和展示层之间传递数据的对象,也就是DTO。

    使用DTO的原因

    为什么需要DTO呢?有如下几个原因。

    1. 隔离领域层与表示层,使领域层和表示层可以独立演化,互相不受影响。
    2. 数据隐藏,领域层的某些数据需要对表示层隐藏(比如用户密码),在定义DTO时,可以不设置隐藏字段的映射,实现数据隐藏。DTO只返回表示层需要的数据,不多也不少。
    3. 避免序列化问题。领域对象中会带有循环引用,比如诗人Poet会引用诗Poems,而诗Poem中又引用了诗人Poet,这种循环引用在序列化时会出现问题。

    ABP vNext中DTO和实体的对应关系

    ABP vNext使用映射Profile定义DTO和实体之间的映射关系,这与以前版本使用AutoMap标签是不同的,映射文件如下:
    以前使用如下:

    [AutoMapFrom(typeof(Products))]
        public class ProductDto:EntityDto
        {
            public string ProductName { get; set; }
            public string ProductImage { get; set; }
            public double Price { get; set; }
            public double OrgPrice { get; set; }
            public string Decoration { get; set; }
            public string Sizes { get; set; }
            public int ClickTimes { get; set; }
            public int SaleTimes { get; set; }
            public string DetailText { get; set; }
        }
    

    现在使用如下:

    using AutoMapper;
    using ZL.AbpNext.Poem.Core.Poems;
    
    namespace ZL.AbpNext.Poem.Application.Poems
    {
        public class PoemAppAutoMapperProfile : Profile
        {
            public PoemAppAutoMapperProfile()
            {
                CreateMap<Poet, PoetDto>();
                CreateMap<Core.Poems.Poem, PoemDto>();
                CreateMap<Category, CategoryDto>();
                CreateMap<CategoryPoem, CategoryPoemDto>();
            }
        }
    }
    

    我们已经创建了领域层,并且使用EF实现了对数据库的访问,我们还创建了用于数据交换的DTO,现在继续应用层的开发。我们需要实现如下基本需求:

    • 诗人查询:按姓名进行模糊查询
    • 根据id获取诗人数据。
    • 诗查询:
      按诗人进行查询;按关键字在标题进行模糊查询;按分类进行查询,如果分类是多个,就查询属于所有分类的诗。比如,如果查询条件是“唐诗三百首”和“五言诗”,那么结果应该是唐诗三百首中的五言诗。
    • 根据id获取诗数据。
    • 分类列表:列出所有分类。
    • 分类的增、删:可以增加和删除分类。
    • 查询某一首诗的所有分类。

    上面的功能能够基本完成诗和诗人查询分类的功能。

    上述功能的定义在接口IPoemAppService中定义,在PoemAppService中实现。IPoemAppService代码如下:

    
    using System.Collections.Generic;
    using Volo.Abp.Application.Dtos;
    using Volo.Abp.Application.Services;
    
    namespace ZL.AbpNext.Poem.Application.Poems
    {
        public interface IPoemAppService:IApplicationService
        {
            /// <summary>
            /// 获取诗人分页
            /// </summary>
            /// <param name="dto"></param>
            /// <returns></returns>
            PagedResultDto<PoetDto> GetPagedPoets(PagedResultRequestDto dto);
    
            /// <summary>
            /// 查询诗人,按名字模糊查询
            /// </summary>
            /// <param name="dto"></param>
            /// <returns></returns>
            PagedResultDto<PoetDto> SearchPoets(SearchPoetDto dto);
    
            /// <summary>
            /// 获取诗的分页查询
            /// </summary>
            /// <param name="dto"></param>
            /// <returns></returns>
            PagedResultDto<PoemDto> GetPagedPoems(PagedResultRequestDto dto);
    
    
            /// <summary>
            /// 按条件查询诗,条件是关键字(模糊查询),作者(精确查询),分类(属于所有分类)
            /// </summary>
            /// <param name="dto"></param>
            /// <returns></returns>
            PagedResultDto<PoemDto> SearchPoems(SearchPoemDto dto);
    
            /// <summary>
            /// 增加分类,如果已经存在,不增加,返回-1,如果增加成功,返回新增记录的id
            /// </summary>
            /// <param name="category"></param>
            /// <returns></returns>
            CategoryDto AddCategory(CategoryDto category);
    
            /// <summary>
            /// 删除分类
            /// </summary>
            /// <param name="category"></param>
            void DeleteCategory(CategoryDto category);
    
            /// <summary>
            /// 分类列表
            /// </summary>
            /// <returns></returns>
            List<CategoryDto> GetAllCategories();
    
            /// <summary>
            /// 将诗关联到分类
            /// </summary>
            /// <param name="categoryPoem"></param>
            void AddPoemToCategory(CategoryPoemDto categoryPoem);
    
            /// <summary>
            /// 解除诗和分类的关联
            /// </summary>
            /// <param name="categoryPoem"></param>
            void RemovePoemFromCategory(CategoryPoemDto categoryPoem);
    
    
            List<CategoryPoemDto> GetCategoryPoems();
    
            /// <summary>
            /// 列出诗的分类
            /// </summary>
            /// <param name="poemid"></param>
            /// <returns></returns>
            List<CategoryDto> GetPoemCategories(int poemid);
    
            /// <summary>
            /// 列出分类的诗
            /// </summary>
            /// <param name="categoryid"></param>
            /// <returns></returns>
            List<PoemDto> GetPoemsOfCategory(int categoryid);
    
    
            PoetDto AddPoet(PoetDto poet);
        }
    }
    
    

    现在我们可以编写PoemAppService,这个类的定义如下:

    public class PoemAppService : ApplicationService, IPoemAppService
        {
            private readonly IRepository<Core.Poems.Poem> _poemRepository;
            private readonly IRepository<Category> _categoryRepository;
            private readonly IRepository<Poet> _poetRepository;
            private readonly IRepository<CategoryPoem> _categoryPoemRepository;
            public PoemAppService(IRepository<Core.Poems.Poem> poemRepository
                , IRepository<Category> categoryRepository
                , IRepository<Poet> poetRepository
                , IRepository<CategoryPoem> categoryPoemRepository)
            {
                _poemRepository = poemRepository;
                _categoryRepository = categoryRepository;
                _poetRepository = poetRepository;
                _categoryPoemRepository = categoryPoemRepository;
            }
    

    这里我们使用Abp提供的通用的IRepository,编写一般的方法可以满足需求,比如增加,删除等等:

            public CategoryDto AddCategory(CategoryDto category)
            {
                var cate = _categoryRepository.FirstOrDefault(o => o.CategoryName == category.CategoryName);
    
                if (cate == null)
                {
                    cate= _categoryRepository.InsertAsync(new Category { CategoryName = category.CategoryName },true).Result;
                }
                return ObjectMapper.Map<Category,CategoryDto>(cate); 
                
            }
    
            public List<CategoryDto> GetAllCategories()
            {
                return ObjectMapper.Map<List<Category>, List<CategoryDto>>(_categoryRepository.ToList());
            }
    
            public void DeleteCategory(CategoryDto category)
            {
                    var cat = _categoryRepository.FirstOrDefault(o => o.Id == category.Id);
                    if (cat != null)
                    {
                        _categoryRepository.DeleteAsync(cat, true);
                    }
             }
    
    

    这里需要说明的是,Abp 将ApplicationService中的方法作为工作单元处理,所以不需要像在一开始控制台应用中那样显示使用UnitWork。

    当我们进行稍微复杂一些的开发时,发现通用的IRepository不够用了,比如,如果获取是的分类,需要写成这样:

    public List<CategoryDto> GetPoemCategories(int poemid)
    {
        var lst = _categoryPoemRepository.Where(p => p.PoemId == poemid);
        var categories = new List<Category>();
        foreach (var cp in lst)
        {
            var cate = _categoryRepository.GetAsync(o => o.Id == cp.CategoryId).Result;
            categories.Add(cate);
        }
    
        return ObjectMapper.Map<List<Category>, List<CategoryDto>>(categories);
    }
    

    对于更复杂的一些功能,比如模糊查询,使用缺省的IRepository甚至无法实现。下节我们开发定制的Repository。

    展开全文
  • 应用层

    千次阅读 2018-07-21 10:15:33
    应用层 应用层协议管理 网络应用程序体系结构 客户-服务器体系结构(client-server architecture) 有一个总是打开的主机成为服务器,他服务于来自许多其它成为客户的主机的请求。客户之间不直接通信。另外...

    应用层

    应用层协议管理

    网络应用程序体系结构

    • 客户-服务器体系结构(client-server architecture
      有一个总是打开的主机成为服务器,他服务于来自许多其它成为客户的主机的请求。客户之间不直接通信。另外,服务器具有一个固定的,周知的地址,IP地址。应用:Web,FTP,Telnet和电子邮件。

    • P2P体系结构(P2P architecture
      对位于数据中心的专用服务器有最小的(或者没有)依赖,应用程序在间断连接的主机对之间使用直接通信,这些主机对称为对等方。应用:文件共享(BitTorrent),对等方协助下载加速器(迅雷),网络电话(Skype)和IPTV(迅雷看看和 PPStream

    • 混合的体系结构(C/S + P2P
      即时讯息应用,服务器跟踪用户IP地址,用户之间P2P直接发送报文

    进程通信

    进行通讯实际是进程,不是程序。不同端系统的进程间交换报文相互通信。发送进程生成并向网络发送报文;接收进程接收这些报文并可能通过将保温发送回去进行响应。

    • 客户与服务器进程

      • 网络应用程序由成对的进程组成,这些进程通过网络相互发送报文
      • 一个客户浏览器进程与一台 Web 服务器进程交换报文
    • P2P进程

      • 文件从一个对等方中的进程传输到另一个对等方中的进程
      • 下载文件的对等方标识为客户,上载文件的对等方标识为服务器

    进程与计算机网络之间的接口:进程通过一个称为套接字(socket)的软件接口向网络发送报文和从网络接收报文。套接字是同一台主机内应用层与网络层之间的接口,应用程序和网络之间的API

    应用程序开发者对于运输层的控制仅限于:
    1. 选择运输层协议
    2. 设定几个运输层参数,如最大缓存和最大报文段等

    可供应用程序使用传输服务

    • 可靠数据传输

      • 由应用程序的一端发送的数据正确,完全地交付给该应用程序地另一端
      • 有些运输层协议不提供可靠数据传输,由发送进程发送地某些数据可能不能够到达接收进程
    • 吞吐量

      • 运输层协议可以以某种特定地速率提供确保地可用吞吐量
      • 带宽敏感地应用和弹性应用
    • 定时

    • 安全性

    因特网提供的传输服务

    一些应用程序的服务要求:

    • TCP服务

      • 面向连接的服务,全双工
      • 可靠的数据传送服务:无差错,按适当顺序交付所有发送的数据
      • 拥塞控制机制:当发送方和接收方之间的网络出现拥塞时,TCP会抑制发送进程
      • 安全套接字层 SSL 提供安全性服务
    • UDP服务

      • 提供最小服务
      • 无连接
      • 不可靠数据传送服务

    因特网运输协议不提供的服务:吞吐量和定时

    应用层协议

    应用层协议定义了运行在不同端系统上应用程序进程如何相互传递报文:

    • 交换的报文类型,例如请求报文和响应报文
    • 各种报文类型的语法,如报文中的各个字段及这些字段是如何描述的
    • 字段的语义,即这些字段中包含的信息的含义
    • 一个进程何时以及如何发送报文,对报文进行响应的规则

    WEB和HTTP

    HTTP概况

    • Web 的应用层协议是 超文本传输协议(HTTP),它是 Web 的核心。
    • HTTP 由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中,通过交换 HTTP 报文进行会话。
    • URL地址由两部分组成:存放对象的服务器主机名和对象的路径名
    • HTTP 使用 TCP 作为它的支撑运输协议。客户首先发起一个与服务器的 TCP 连接。一旦该连接建立,该浏览器和服务器进程就可以通过套接字接口访问 TCP
    • HTTP 是一个无状态协议(stateless protocol)。服务器向客户发送被请求的文件,而不存储 任何该客户的状态信息。
    • Web 使用了客户-服务器应用程序体系结构。

    持续连接和非持续连接

    • 采用非持续连接的 HTTP

      • 应用程序在采用非持续连接的情况下,客户的每个请求都要建立一个单独的 TCP 连接
      • 从客户请求 HTML 文件到客户收到文件为止所花费的时间为两个 RTT 加上服务器传输 HTML文件的时间
    • 采用持续连接的 HTTP

      • 服务器发送响应后保持该TCP 连接打开,经过一定时间间隔(超时)未被使用,HTTP服务器关闭该连接
      • 为每一个请求的对象建立和维护一个全新的连接,需要分配TCP 缓冲区和保持 TCP 变量
      • 每一个对象经受两倍 RTT 的交付时延,一个RTT用来创建TCP,另一个RTT用于请求和接受一个对象

    HTTP报文格式

    • 请求报文
    POST /index.html HTTP/1.1
    HOST: www.XXX.com
    Connection:close
    User-Agent: Mozilla/5.0(Windows NT 6.1;rv:15.0) Firefox/15.0
    Username=admin&password=admin

    • 响应报文
    
    HTTP/1.1 200 OK
    Connection: close
    Date: Tue, 09 Aug 2011 15:44:04 GMT
    Server: Apache/2.2.3 (CentOS)
    Last-Modified: Tue, 09 Aug 2011 15:11:03 GMT
    Content-Length: 6821
    Content-Type: text/html
    
    (data data data data data.....)

    状态码及其所表示的含义:

    用户与服务器的交互:cookie

    • HTTP 是无状态的,但是 Web 站点通常希望能够识别用户,为此,HTTP 使用了 cookie,它允许站点对用户进行跟踪。

    • cookie 有 4 个技术组件:

      • HTTP 响应报文中的一个 cookie 首部行;
      • HTTP 请求报文中的一个 cookie 首部行;
      • 在用户端系统中保留有一个 cookie 文件,并由用户的浏览器进行管理;
      • 位于 Web 站点的一个后端数据库。

    WEB缓存

    • Web 缓存器也叫 代理服务器,是能够代表 Web 服务器来满足 HTTP 请求的网络实体。
    • Web 服务器有自己的磁盘存储空间,并在存储空间中保存着最近存储过的对象的副本。
    • 可以配置用户的浏览器,使得用户所有的 HTTP 请求首先指向 Web 缓存器。
    • 客户与 Web 缓存器之间的速度通常比较快,所以可以提高访问的速度,降低时延。
    • 客户通过 Web 缓存器请求对象
    • Web 缓存器能够大大减少一个机构接入链接到因特网的通信量

    文件传输协议 FTP

    • 用户通过一个 FTP 客户进程建立一个到远程主机 FTP 服务器进程的 TCP 连接。
    • 用户接着提供用户标识和口令,作为 FTP 命令的一部分在该 TCP 连接上传送
    • FTP 使用了两个并行的 TCP 连接来传输文件,一个是控制连接,一个是数据连接
      • 控制连接用于在两主机之间传输控制信息
      • 数据连接用于实际发送一个文件
    • 控制连接贯穿了整个用户会话期间,但是对会话的每一次文件传输都需要建立一个新的数据连接。
    • FTP 服务器必须对整个会话期间保留用户的状态(state

    FTP命令和回答

    • FTP 命令

    • FTP 回答

    因特网中的电子邮件

    • 电子邮件系统3个主要组成部分:用户代理(user agent),邮件服务器(mail server)和简单邮件传输协议(Simple Mail Transfer Protocol,SMTF)

    SMTP

    • SMTP 由两部分:运行在发送方邮件服务器的客户端和运行在接收方邮件服务器的服务器端。每台邮件服务器上既运行 SMTP 的客户端也运行 SMTP 的服务器端程序

    • SMTP 一般不使用中间服务器发送邮件。如若接收方的邮件服务器没开,TCP 连接报文会保留在发送方的邮件服务器上,等待心得尝试,如若长时间都失败,那么发送方服务器就会删掉该报文并以邮件的形式通知发送方

    • SMTP 限制所有的邮件报文只能采用简单的 7 比特 ASCII 表示。

    与 HTTP的对比

    • 相同点:都从一台主机向另一台主机传送文件,持续的 HTTPSMTP 都是用持续连接
    • 不同点:
      • HTTP 是一个 拉协议,TCP 连接是由想要接收文件的机器发起的。SMTP 是一个 推协议,TCP 连接是由想要发送文件的机器发起的。
      • SMTP 要求报文必须按照 7 比特 ASCII 码进行编码。HTTP 则没有这种限制。
      • 在处理包含多种不同类型的文档时。HTTP 把每个对象封装到它自己的 HTTP 响应报文中,SMTP 则把所有报文对象放在一个报文中。

    邮件访问协议

    第三版的邮局协议(Post Office Protocol-Version3,POP3),因特网邮件访问协议(Internet Mail Access Protocol,IMAP)以及HTTP

    • POP3

      1. 特许阶段: 用户代理发送(以明文形式)用户名和口令以鉴别用户
      2. 事务处理阶段:用户代理取回报文,同时可以删除报文标记,取消报文删除标记获取邮件的统计信息
      3. 更新阶段,客户发出 quit 命令。结束该 POP3 会话,邮件服务器删除标记为删除的报文
    • IMAP

      1. 把每个报文与一个文件夹联系起来
      2. 允许用户代理获取报文组件的命令
      3. IMAP 维护了 IMAP 会话的用户状态信息

    - HTTP

    DNS:因特网的目录服务

    • 主机可以用主机名和 IP 地址进行标识
    • DNS 提供从主机名到IP地址的目录服务。
      • 一个由分层的 DNS 服务器 实现的分布式数据库。
      • 一个使得主机能够查询分布式数据库的应用层协议。
    • DNS 协议运行在 UDP 上,使用 53 端口。
    • DNS 通常是由其他应用层协议所使用的,包括 HTTP,SMTPFTP ,将用户的主机名解析为 IP 地址。
    • DNS 其他服务:主机别名,邮件服务器别名,负载分配

    DNS 工作机理概述

    • 单一的 DNS 服务器设计的问题有:单点故障,通信容量,远距离的集中式数据库,维护

    • 3种类型的 DNS 服务器:根 DNS 服务器,顶级域(TLDDNS 服务器和权威 DNS 服务器。 还有另一种 DNS 服务器,本地 DNS 服务器。

    • DNS 缓存

    DNS 安全性

    • DDoS(分布式拒绝服务)带宽泛洪攻击:向处理如.com域的域名服务器发送大量DNS请求,使得大部分合法请求无法获得响应

    • DNS毒害(污染):给你返回假的或不能用的IP地址。比如中国的『墙』。所以如果你能拿到google的当前IP地址(百度搜的到),手动在hosts里配置,是可以做到直接访问谷歌服务器的。说到翻墙,一般大家都是用某种方法配置一台海外服务器当做中转(国家一般不墙这种个人服务器),来访问墙外服务器的,比如shadowsocks,shadowrocket之类的软件可以用来配置中转服务器。

    • DNS反射攻击:请求中冒充目标主机源地址,大量请求DNS服务器,DNS就大量向源地址主机发送回答,淹没目标主机

    P2P应用

    比于客户-服务器体系结构,P2P具有自扩展性,表现在对等方N越大,最小分发时间也趋于平缓。这种自扩展性的直接成因是:对等方除了是比特的消费者外还是它们的重新分发者。

    • P2P 体系结构的扩展性

      • 最小分发时间,对等方N越大,P2P的最小分发时间越小
      • 对等方除了是比特的消费者外还是他们的重新分发者
    • BitTorrent

      • P2P文件共享协议,参与一个特定文件分发的所有对等方结合被称为一个洪流(torrent),在一个洪流的对等方彼此下载等长度的文件块,可以随时离开洪流,也可继续向其他对等方上载
      • Alice加入某洪流时,会在追踪器里进行注册,周期性通知追踪器它仍在洪流中。
      • 洪流随机从参与对等方的结合中选择一个子集,将他们的IP地址发给AliceAlice维护这张对等方列表,视图与所有对等方建立并行的TCP连接。
      • Alice周期询问每个邻近对等方(连上的)他们有的文件块列表,她随时知道邻居有哪些文件块
      • Alice使用最稀缺优先技术,首先请求那些邻居们副本数量最少的块,使该文件块迅速分发,以均衡每个块在洪流中的副本数量
      • BitTorrent使用一种算法,Alice优先从像她传时速度最快的邻居(4个,每10s修改一次)那里获取文件块。
      • 每过30s,Alice也要随机选择另外一个对等方Bob,向他发送块。若AliceBob最快的前四快,Bob也是Alice的前4快,则Bob和Alice互相发送数据。
      • 每过30s换一个新的对象,互相交换数据(一报还一报),为了使对等方能够找到彼此协调的速率上传
    • BitTorrent其他机制和变种

      • 片、流水线、随机优先选择、残局模型、反怠慢等机制
      • 变种:P2P直播流式应用,如PPLivePPstream****PPstream

    分布式散列表(DHT)

    • 分布式、P2P版本的key-value数据库,在大量对等方上存储key-value值(键值对)
    • 分布式数据库用来定位拥有某key-value的对等方,然后向查询方返回该键值对
    • 环形DHT、对等方扰动

    展开全文
  • 应用层协议

    千次阅读 2017-04-02 15:38:38
    1、应用层协议的类型 标准的网络应用的协议,例如:E-mail、FTP、TELNET、Web等,它们都是以RFC文档的方式公布出来,提供给网络应用系统开发者使用。 应用层协议专用的,目前很多P2P文件共享的应用层协议都属于专用...

    1、应用层协议的类型

    1. 标准的网络应用的协议,例如:E-mail、FTP、TELNET、Web等,它们都是以RFC文档的方式公布出来,提供给网络应用系统开发者使用。
    2. 应用层协议专用的,目前很多P2P文件共享的应用层协议都属于专用协议

    2、应用层协议的基本内容

    应用层协议定义了运行在不同端系统上应用程序进程交换的报文格式和交互过程。
    主要内容为:
    1. 交换报文的类型,如请求报文和应答报文
    2. 各种报文格式与包含的字段类型
    3. 对每个字段意义的描述
    4. 进程在什么时间、如何发送报文,以及如何响应。

    3、应用层协议对传输层协议的选择

    首先,我们要知道传输层协议有两种:

    1. TCP协议是一种功能完善的、面向连接的、可靠的传输层协议。
    2. UDP协议是一种不可靠、无连接的传输层协议。

    应用层协议与传输层协议的关系,如下图:
    这里写图片描述

    对于不同的应用程序开发者,都是要根据自己实际的需求来选择传输层的协议,例如:有很多远程医疗的应用程序,这个必须使用安全可靠的传输层协议:TCP协议,否则可能会因为部分数据的丢失而造成医疗诊断错误。而对于视屏、语音等方面的通信,即使丢弃了部分数据,对我们的收看或收听影响不大,就可以采用比较快速的但不安全的传输层协议:UDP协议

    展开全文
  •  应用层(Java Application),包括了Android各种应用程序  应用框架层(Java Frameworks),是Google发布的核心应用所使用的API框架  系统运行库层(User Libraries),包含了手机系统平台必须的C/C++核心库、...
  • AI:国内外人工智能产业应用图谱应用层/基础层详解 目录 国内外人工智能产业应用图谱 一、应用层 1、AI+医疗 2、AI+家居 3、AI+驾驶 4、AI+零售 5、AI+城市 6、AI+教育 二、基础层 1、算法:...
  • 1、OSI的相应层介绍:应用层:为用户应用程序提供服务并支持网络访问。 表示层:将数据转化为与平台无关的格式,并进行加密和压缩处理 会话层:负责管理联网计算机上的应用程序之间的通信,提供一些传输层不具备、...
  • 应用层到驱动层

    千次阅读 2016-12-04 21:51:29
    1、应用层—->VFS——>驱动层——–>硬件层; 2、应用层的程序要想跟底层的硬件打交道必须要有设备文件;在应用层通过open打开一个设备文件时,在VFS层会建立inode结构体和file结构体,前者是静态的描述设备的一些...
  • 会话层、表示层、应用层

    千次阅读 2017-06-21 15:15:03
    会话(Session)提供的服务可使应用建立和维持会话,并能使会话获得同步。会话使用校验点使通信会话在通信失效时从校验点继续恢复通信。这种能力对于传送大的文件极为重要。 PS:CCNA考试中不涉及这一 ...
  • 关于Linux的应用层定时器

    万次阅读 2016-11-08 11:22:55
    使用定时器的目的无非是为了周期性的执行某一任务,或者是到了一个指定时间去执行某一个任务。要达到这一目的,一般有两个常见的比较有效的方法。一个是用 Linux 内部的三个定时器;另一个是用 sleep 或 usleep 函数...
  • 会话层,表示层,应用层

    千次阅读 2012-11-26 09:40:47
    会话的功能 会话的主要功能是在两个节点间建立、维护和释放面向用户的连接,并对会话进行管理和控制,保证会话数据可靠传送。在会话和传输我们都提到了连接,那么会话连接和传输连接到底有什么区别呢? ...
  • Web 应用层分类和识别

    千次阅读 2014-09-15 08:08:14
    一个web应用一般可以分为51切面: 1)运行环境:操作系统,Web 容器,CGI等 2)应用框架:Thinkphp,rails,django等 3)应用本身:论坛,社交,博客等 4)前端框架:AngularJS,jQuery,Bootstrap等 5)第三方的...
  • 浅谈MVP实现Android应用层开发

    万次阅读 多人点赞 2015-05-12 10:36:05
    之所以要谈这个话题是因为你在开发App时可能会发现,Activity担负的责任非常之重,如果站在MVC框架角度看自己开发的App,一般xml布局文件科Activity的setContentView等...同时如果要测试逻辑数据会发现比较难编写测试
  • 首先为了理解安卓系统是怎么工作的,就先来看一下android的系统架构,其架构大至可以分为四层:linux内核层、系统运行库层、应用框架层和应用层,那就先说说这几层。 1.linux内核层: Android系统...
  • 最通俗易懂的网络应用层协议详解

    万次阅读 多人点赞 2017-02-23 17:21:00
    前言其实本文只是讲解从传输层到应用层实现网络消息传递的一个详细流程,至于更底层的网络层和网络接口层,那就不在我的考虑范围内了,事实上那部分机制是不需要你去操心的,除非你想开发操作系统!然后本文打着通俗...
  • 内核层与应用层通信详解

    千次阅读 2019-07-30 08:41:28
    做驱动开发的肯定会遇到应用层与内核层的通信的问题,首先说内核层与应用层的通信可以大概分为两个方面,第一是应用层向内核层主动传递消息,第二是内核层主动与应用层通信。下面我们将分开来谈两个方面。 我们先来...
  • 这篇文章主要介绍了网络协议概述:物理层、连接层、网络层、传输层、应用层详解,本文用生活中的邮差与邮局来帮助理解复杂的网络协议,通俗易懂,文风幽默,是少见的好文章,需要的朋友可以参考下 信号的传输总要符合...

空空如也

1 2 3 4 5 ... 20
收藏数 158,180
精华内容 63,272
关键字:

应用层