精华内容
下载资源
问答
  • 网络-UDP协议详解(代码、实战)

    千次阅读 2020-12-03 17:07:35
    简介 UDP(User Datagram Protocol,用户数据报协议),一种无连接的传输层协议,... UDP使用最大努力交付,即不保证可靠交付 UDP是面向报文的,适合一次性传输少量数据的网络应用 UDP无拥塞控制,适合很多实时应

    目录

    简介

    特点

    报文格式

    UDP校验

    伪首部

    发送端校验

    接收端校验

    实战

    参考


    简介

    UDP(User Datagram Protocol,用户数据报协议),一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,UDP在IP报文的协议号是17。常用的UDP端口号有:53(DNS)、69(TFTP)、161(SNMP),使用UDP协议包括:TFTP、SNMP、NFS、DNS、BOOTP。

    特点

    • UDP是无连接的,减少开销和发送数据之前的时延
    • UDP使用最大努力交付,即不保证可靠交付
    • UDP是面向报文的,适合一次性传输少量数据的网络应用
    • UDP无拥塞控制,适合很多实时应用
    • 首部开销小,仅8个字节(TCP首部为20个字节)

    报文格式

    报文位置
    报文格式
    • 源端口号:在需要对方回信时选用,不需要时可用全0
    • 目的端口号:这在终点交付报文时必须使用
    • 长度:UDP用户数据报的总长度(首部+数据),其最小值是8(仅有首部)。
    • 检验和:检测UDP用户数据报在传输中是否有错,有错就丢弃

    如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议ICMP发送“端口不可达”差错报文给发送方。我们在ICMP的应用举例讨论 traceroute时,就是让发送的UDP用户数据报故意使用一个非法的UDP端口,结果ICMP就返回“端口不可达”差错报文因而达到了测试的目的。

    UDP校验

    伪首部

    UDP伪首部
    • 源IP地址:4个字节
    • 目的IP地址:4个字节
    • 0:1个字节,即0x00
    • 17:1个字节,即0x11,封装UDP报文的IP数据包首部协议字段是17
    • UDP长度:2个字节,UDP首部(8B)+数据部分长度,不包括伪首部

    伪首部仅在计算校验和的时候才出现,不向下传送也不向上递交。

    发送端校验

    1. 填上伪首部
    2. 全0填充检验和字段
    3. 全0填充数据部分(UDP数据报要看成许多4B的字串接起来)
    4. 伪首部+首部+数据部分采用二进制反码求和
    5. 把和求反码,填入校验和字段
    6. 去掉伪首部,发送
    发送端计算校验和
    进位及回加

    按列计算:9(1001),余1,进100;7+0=1(111),余1进11;7+1=8(1000),余0进100;...后续读者动手计算吧,记得多出去的进位回加到低位,如果不习惯一起算,可以两个加一次。16位的话按列计算16次左右,如果有二三十个相加的话,按列相加比较快速,使用16进制相加也会更快一点。

    接收端校验

    1.填上伪首部
    2.伪首部+首部+数据部分采用二进制反码求和(校验和部分不是全0了,而是0110100100010010)
    3.结果全为1,则无差错,否则丢弃数据报/交给应用层附上出差错的警告。

    计算过程和上面一样,只是校验和变了。

    这样的检验和, 既检查了UDP用户数据报的源端口号和目的端口号以及UDP用户数据报的数据部分,又检查了IP数据报的源IP地址和目的地址。

    实战

    UDP泛洪攻击(UDP Flood Attack),攻击者发送伪造源地址和端口不可达的UDP数据报,当受害系统接收到一个 UDP 数据报的时候,它会确定目的端口正在等待中的应用程序。当它发现该端口中并不存在正在等待的应用程序,它就会产生一个目的地址无法连接的ICMP数据包发送给该伪造的源地址。如果发送的足够多的,就会消耗受害系统的资源,造成攻击。和TCP是SYN攻击差不多,也是(D)DoS攻击的一种。

    自己实现UDP客户端和服务器端可以查看文章:python-网络编程之socket

    参考

    《TCP/IP详解I》

    《计算机网络(谢希仁)第七版》

    RFC 768

    展开全文
  •  软件公司或企业用户利用无代码开发平台的特性,能够大幅度降低软件项目交付的各种成本,加快交付时间,并且最高限度的保证了项目的成功率。国内许多集成商和软件公司都已转向采用无代码开发平台,进行项目开发和...

     

           随着全球经济一体化的发展,国内企业对信息化管理的要求也越来越高,各行各业的大中小企业都在对信息化建设加大投入,使得市场对企业管理软件的需求快速增长。这对于集成商来说,是一个非常好的机遇。

           但激烈的市场竞争,以及客户多变的高需求。集成商能否抓住这次市场机遇,是对集成商的开发效率、成功率、以及后期的维护服务等多方面的一次挑战。

           按以往采用传统软件开发方式,开发一个软件项目是比较复杂的事情。集成商既要满足客户需求,同时还需考虑项目成本和利润。项目开发过程中,或多或少都会遇到一些问题。后期维护等更是要投入很多的人力和物力。由于人工成本的逐年增加,集成商在权衡自身的成本和双方之间的交易成本问题上,如何优化和降低整个作业链上的总成本,从而达到“双赢”的局面,耗费了太多的精力。这种情况随着“无代码开发”新理念和技术的出现得到了彻底解决。

           我们先来了解下无代码开发的定义。无代码开发是一个既可探索客户核心需求,又能采用高质量的基础数据和技术手段来实现系统化管理的开发平台。其具有高效和低成本的特点。无代码开发作为一种新的开发理念,能够给开发和管理带来什么优势呢?

           无代码开发区别于其它开发平台,完全实现了无需专业程序开发人员编写任何程序代码,普通用户就可通过可视化模型,简单、快速且直观的构建应用程序。比如天纵智能开发平台,不需要编程,直接配置一下业务参数就可成为一个应用系统,且一次配置,BS(WEB)、CS(WIN)、APP、微信、钉钉同时生成,五种方式均可以操作。

           无代码开发为什么能做到降低项目的交付成本呢?我们来简单分析下。

           传统的软件开发和集成方式是通过程序员进行大量的编程工作在完成的。项目双方都投入了大量的人力、物力和财力成本。无代码开发平台不需要使用者具备编程的能力,只需要通过平台提供的功能,如回写公式等,即可搭建功能强大的信息化系统。还可以根据个性化的需求,做更多灵活的扩展。既要实现客户要求的低耦合,也高效的完成了复杂数据的传递,将学习成本和开发难度降低到最小,节省了大量的成本。

           无代码开发平台构建的新系统与原有系统之间的数据处理,如读取、查询和报表汇总等,只需要通过外部字段组就能实现。外部字段组还可以对数据进行运算操作,并回传到原系统,甚至可以拓展原有系统的功能。例如做新的交互界面,对原系统数据进行操作,或者添加周边数据结合原系统数据进行运算、流程操作等,然后再同步修改原系统数据,进而实现了原有系统和拓展出来的新系统的并存,并保持数据的一致。

           无代码开发平台能够集成第三方管理系统,将其业内,外的数据信息一体化,实现对大数据的深度加工。这样快捷高效的外部字段组工作流,在开发时间上有绝对的优势。

           无代码开发平台可集成外部移动应用程序,如微信、钉钉等。为企业系统化的管理人员,以及移动办公,提供了强有力的支持。

           无代码开发平台改变了企业的组织结构和管理模式,使工作集中高效,流程自动化,大大降低了人力和物力的成本。

           简单的理解就是无代码开发平台开发项目,可以节省专业程序员的成本,也节省了时间成本。与传统开发方式相比,相同的开发时间内,无代码开发可以完成更多的工作量。从而实现降低软件项目交付成本,快速交付。

           正是无代码开发有如此之多的开发优势,这种新技术一经问世,在短短几年内就被企业广泛使用。无代码开发平台主要特性有:

    1.在线化:将企业的各种数据进行汇总,储存在企业的信息化系统中。添加权限控制、流程流转和统计分析等,最终形成一个有关联的,整体的数据系统。为企业提供有价值的数字建议。

    2.敏捷化:能够根据企业的业务需求变化而快速调整信息化系统,以适应业务的变更。

    3.一体化:将企业中各系统的数据进行统一管理,避免出现信息孤岛。

    4.集成化:通过标准的协议接口,集成企业外部的系统,来实现和外部异构系统之间的互联互通,实现上下游资源一体化、行业一体化,乃至更大范围的一体化。

    5.同步化:通过同步服务解决企业不同地域的系统之间的互联互通,实现跨地域的全球信息同步。

    6.平民化:企业信息化系统的开发和维护不再依赖于特定专业开发人员,业务人员就可以独立搭建企业应用,降低了开发成本和开发风险。尤其在灵活可扩展性上,能适应现阶段需求和未来扩展。让企业在激烈的市场竞争中,做到快速响应业务的需求。

           软件公司或企业用户利用无代码开发平台的特性,能够大幅度降低软件项目交付的各种成本,加快交付时间,并且最高限度的保证了项目的成功率。国内许多集成商和软件公司都已转向采用无代码开发平台,进行项目开发和快速交付。无代码开发平台作为项目开发的保障,是集成商和中小软件公司的最佳选择。

    展开全文
  • UDP和TCP协议代码实例

    千次阅读 2018-07-08 18:16:19
    UDP:(User Datagram Protocol 用户数据报协议)是OSI(Open System Interconnection开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 UDP适用于一次只传送少量数据、...

    一、UDP

    1.UDP

      User Datagram Protocol 用户数据报协议,是OSI(Open System Interconnection开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
      UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。
      我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
      这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。

    2. UDP特点:

    无连接:知道对方IP和端口号就可以直接连接进行传输,无需connect函数进行连接
    不可靠:没有确认机制,没有重传机制;消息丢失对方也不会知道。
    面向数据报:不能够灵活的控制读写数据的次数和数量。对于上层交付下的数据既不切分,也不合并,一次发送一个完整的报文。

    3. 报文内容

    这里写图片描述

    4. UDP的缓冲区:

    没有发送缓冲区,上层交付数据会调用sendto函数直接交给内核,由内核将数据进行网络协议传输。
    有接收缓冲区,但不能保证报文的顺序性和一致性。如果缓冲区满了,再到达的数据就会被丢弃。

    5. 简单的UDP程序(基于Linux环境)

    说明:使用套接字基于UDP协议,服务端先bind一个ip和port,然后进行收消息并把消息返还给客户端。而客户端无需bind连接服务器,只需知道它的ip和port就可以给它发消息。
    使用:main函数使用可变参数列表,接收程序名,IP和端口号。
    执行步骤:
    1. 服务器,执行服务端程序,IP地址(自己拥有的IP,ifconfig查看),端口号。
    2. 客户端,执行客户端程序,IP地址,端口号(和服务端的IP和端口号一致)
    3. 客户端发送消息,服务端接收显示并返回给客户端,客户端显示自己发送的内容。

    client.c
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<arpa/inet.h>
    
    int main(int argc,char *argv[])
    {
        if(argc!=3)
        {
            perror("argc\n");
            return 1;
        }
        int sockfd=socket(AF_INET,SOCK_DGRAM,0);
        if(sockfd<0)
        {
            perror("socket\n");
            return 2;
        }
    
        char buf[128];
        struct sockaddr_in server;
        server.sin_family=AF_INET;
        server.sin_port=htons(atoi(argv[2]));
        server.sin_addr.s_addr=inet_addr(argv[1]);
        while(1)
        {
            ssize_t r=read(0,buf,sizeof(buf));  
            if(r<0)
            {
                printf("read error\n");
                continue;
            }
            buf[r-1]='\0';
    
            sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&server,sizeof(server));
            ssize_t recv=recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);
            buf[recv]=0;
            printf("server > %s\n",buf);
        }
        close(sockfd);//use signal to delet
        return 0;
    }      
    
    server.c
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<arpa/inet.h>
    #include<sys/types.h>
    
    int main(int argc,char *argv[])
    {
        if(argc!=3)
        {
            perror("argc\n");
            return 1;
        }
        int sockfd=socket(AF_INET,SOCK_DGRAM,0);
        if(sockfd<0)
        {
            perror("socket\n");
            return 2;
        }
    
        char buf[128];
        struct sockaddr_in local;
        local.sin_family=AF_INET;
        local.sin_port=htons(atoi(argv[2]));
        local.sin_addr.s_addr=inet_addr(argv[1]);
    
        if(bind(sockfd,(struct sockaddr*)&local,sizeof(local))<0)
        {
            perror("bind");
            return 2;
        }
    
        struct sockaddr_in client;
    
        while(1)
        {
            socklen_t len=sizeof(client);
            size_t recv=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&client,&len);
            if(recv<0)
            {
                printf("recv error\n");
                return 4;
            }
            buf[recv]='\0';
    
            printf("[%s,%d] > %s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buf);
            sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&client,sizeof(client));
        }
        close(sockfd);//use signal to delet
        return 0;
    }      
    

    6. 演示效果如图(第一张服务端,第二张客户端):

    这里写图片描述
    这里写图片描述

    二、TCP

    1. TCP

      Transmission Control Protocol 传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
      在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来。
      我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。

    2. TCP特点

    面向连接:双方必须先建立连接才能进行数据的读写,双方都必须为该链接分配必要的内核资源,以管理连接的状态和连接上的传输。
    可靠传输:采用多种应答机制保证数据的可靠性
    基于字节流:发送端执行多次写操作时,TCP模块必须先把这些数据放入TCP发送缓冲区中,当TCP模块真正发送数据时,才把TCP发送缓冲区等待发送的数据封装成一个或多个TCP报文段发出

    3. 报文格式

    这里写图片描述

    4. 图中说明:

    1.源端口号和目的端口号就不解释了。
    2.序号和确认序号:因为TCP将每个字节的数据都进行了编号。发送方把数据编号发送后,接收方确认都收到后会发送一个确认序号给发送方,保证了数据的可靠性。
    3.首部长度:就是指图中前20字节的长度。
    4.保留:现在还没确定把这6位做什么用。
    5.6位标志位:

    URG:紧急指针是否有效
    ACK:接收号是否有效
    PSH:提示接收端立刻从TCP缓冲区把数据读走
    RST:对方要求重新建立连接;携带RST标识称为复位报文段
    SYN:请求建立连接;携带SYN标识称为同步报文段
    FIN:通知对方,本端要关闭了;携带FIN标识的为结束报文段

    6.16为窗口大小:填充自己接受缓冲区剩余空间
    7.16位检验和:检验传输过程中可能产生的错误,接收端用同样算法检查,正确则接受;错误则丢弃
    8.16为紧急指针:标识那部分是紧急数据
    9.选项:包含了选项表结束、空操作、最大报文段长度、窗口扩大因子、选择确认、SACK实际工作、时间戳选项。

    5. TCP为了确保可靠性做了哪些工作?

    1. 校验和:是指传输位数的累加,当传输结束时,接收者可以根据这个数值判断是否接到了所有的数据。如果数值匹配,那么说明传送已经完成。
    2. 序列号:发送方将数据进行排序然后发送
    3. 确认应答:响应方完整接收到消息后返回给对方一个确认号(下一个数据的编号)
    4. 连接管理:三次握手和四次挥手
    5. 超时重传:当数据丢包,发送方在一定时间内没有收到确认号就将该内容重新发送
    6. 流量控制:根据接收方接受能力的大小决定发送多少数据。
    7. 拥塞控制:使用拥塞窗口,表示发送数据的大小。
           拥塞窗口初始为1,每收到一个ACK,拥塞窗口加1。
           这样,第一次发一个,收到一个确认后拥塞窗口变为2。
           然后拥塞窗口依次变为8,16……呈指数增长。
           当拥塞窗口大小超过阈值(阈值为窗口的最大值)时采用线性增长。且一旦产生超时重传,就将阈值减半。

    6. TCP为了保障性能做了哪些工作?

    1. 滑动窗口:接收方还有多大的缓冲区可以用于接收数据
    2. 快速重传:当数据丢包,发送方收到接收方三次相同确认序号,就将该内容重新发送
    3. 延迟应答:接收到N个包或一定时间才给对方确认
    4. 捎带应答:将确认报文粘在下一个要发送的报文上

    7. 简单的TCP程序(Linux环境下,多线程)

    说明:基于套接字的TCP协议协议编程。不同于UDP的是,客户端需和服务端建立连接,才能相互进行收发消息。使用线程处理多个用户的请求,使其收发数据。

    client.c

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<arpa/inet.h>
    
    int main(int argc,char *argv[])
    {
            if(argc!=3)
            {
                    perror("argc\n");
                    return 1;
            }
            int sockfd=socket(AF_INET,SOCK_STREAM,0);
            if(sockfd<0)
            {
                    perror("socket\n");
                    return 2;
            }
    
            char buf[128];
            struct sockaddr_in server;
            server.sin_family=AF_INET;
            server.sin_port=htons(atoi(argv[2]));
            server.sin_addr.s_addr=inet_addr(argv[1]);
            if(connect(sockfd,(struct sockaddr*)&server,sizeof(server))<0)
            {
                    perror("connect\n");
                    return 3;
            }
    
            printf("connetc success\n");
    
            while(1)
            {
                    memset(buf,0,sizeof(buf));
                    ssize_t r=read(0,buf,sizeof(buf));  
                    if(r<0)
                    {
                            printf("read error\n");
                            continue;
                    }
                    buf[r-1]=0;
                    if(send(sockfd,buf,strlen(buf),0)==0)
                            continue;
                    memset(buf,0,sizeof(buf));
                    ssize_t rec=recv(sockfd,buf,sizeof(buf),0);
                    printf("server > %s\n",buf);
            }
            close(sockfd);//use signal to delet
            return 0;
    }      
    
    

    server.c

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<arpa/inet.h>
    #include<sys/types.h>
    
    int main(int argc,char *argv[])
    {
            if(argc!=3)
            {
                    perror("argc\n");
                    return 1;
            }
            int sockfd=socket(AF_INET,SOCK_STREAM,0);
            if(sockfd<0)
            {
                    perror("socket\n");
                    return 2;
            }
    
            char buf[128];
            struct sockaddr_in local;
            local.sin_family=AF_INET;
            local.sin_port=htons(atoi(argv[2]));
            local.sin_addr.s_addr=inet_addr(argv[1]);
    
            if(bind(sockfd,(struct sockaddr*)&local,sizeof(local))<0)
            {
                    perror("bind");
                    return 2;
            }
    
            if(listen(sockfd,5)<0)
            {
                    perror("listen\n");
                    return 5;
            }
            while(1)
            {
                    int new_sockfd=accept(sockfd,NULL,NULL);
                    if(new_sockfd<0)
                    {
                            perror("accept\n");
                            return 6;
                    }
                    pid_t pid=fork();
                    if(pid==0)
                    {
                            if(fork()==0)
                            {
                                    struct sockaddr_in client;
    
                                    while(1)
                                    {
    
                                            socklen_t len=sizeof(client);
                                            size_t rec=recv(new_sockfd,buf,sizeof(buf),0);
                                            if(rec<0)
                                            {
                                                    printf("recv error\n");
                                                    return 4;
                                            }
                                            if(rec==0)
                                            {
                                                    break;;
                                            }
    
                                            buf[rec]='\0';
                                            printf("[%s,%d] > %s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buf);
                                            send(new_sockfd,buf,strlen(buf),0);
                                    }
                                    close(new_sockfd);//use signal to delet
                            }
    
                            else
                            {
                                    exit(1);
                            }
                    }
                    else
                    {
                            waitpid(pid);
                    }
            }
    
            close(sockfd);
            return 0;
    }     
    

    8. 演示效果:

    这里写图片描述

    三、最后,TCP和UDP的区别:

    1. TCP提供的是面向连接的、可靠的数据流传输;
      UDP提供的是非面向连接的、不可靠的数据流传输。

    2. TCP提供可靠的服务,通过TCP连接传送的数据,无差错、不丢失,不重复,按序到达;
      UDP尽最大努力交付,即不保证可靠交付。

    3. TCP面向字节流;
      UDP面向报文。

    4. TCP连接只能是点到点的;
      UDP支持一对一、一对多、多对一和多对多的交互通信。

    5. TCP首部开销20字节;
      UDP的首部开销小,只有8个字节。

    6. TCP的逻辑通信信道是可靠信道;
      UDP的逻辑通信信道是不可靠信道。

    欢迎各位提建议或指错给我,谢谢~

    展开全文
  • 无限路由相关协议简介及代码注释

    千次阅读 2013-02-27 14:13:27
    相关路由协议资源:...AODV(Adhoc on-demand distance vector routing)是一种源驱动路由协议。当一个节点需要给网络中的其他节点传送信息时,如果没有到达目标节点的路由,则必须

    相关路由协议资源:http://www.baisi.net/thread-3016715-1-1.html

     

     

     主要有:AODV,DSDV,DSR,TORA,WRP,ZRP

     AODV

    定义

    AODV(Adhoc on-demand distance vector routing)是一种源驱动路由协议。当一个节点需要给网络中的其他节点传送信息时,如果没有到达目标节点的路由,则必须先以多播的形式发出RREQ(路由请求)报文。RREQ报文中记录着发起节点和目标节点的网络层地址,邻近节点收到RREQ,首先判断目标节点是否为自己。如果是,则向发起节点发送RREP(路由回应);如果不是,则首先在路由表中查找是否有到达目标节点的路由,如果有,则向源节点单播RREP,否则继续转发RREQ进行查找。

    在网络资源充分的情况下,AODV协议可以通过定期广播hello报文来维护路由,一旦发现某一个链路断开,节点就发送ERROR报文通知那些因链路断开而不可达的节点删除相应的记录或者对已存在的路由进行修复。RREQ和RREP的查找方式分别如图2和3所示。

      图2[1]

      图3[1]

    AODV特点

    (1)AODV采用UDP封装,属于应用层协议。每次寻找路由时都要触发应用层协议,增加了实现的复杂度。

    (2)IEEE802.15.4规定的帧大小为127字节,MAC头部及尾部校验最多使用了25字节,IPv6头部与UDP头部占用

    48字节,只剩下54字节的空余。

    (3)LR—WPAN中,拓扑结构相对简单,网络的规模相对较小,节点的位置不固定,对它的设计首先要考虑的因素是简单、节能等问题。AODV的路由框架和报文设计并没有考虑这些问题[1]

    无线自组网按需平面距离矢量路由协议(Ad hoc On-Demand Distance Vector Routing,AODV),是应用于无线网状网络(也称作无线mesh网络)中进行路由选择的路由协议,它能够实现单播多播路由。该协议是Ad Hoc网络中按需生成路由方式的典型协议。

    实现技术

    它是反应式路由协议,也就是说当向目的节点发送包时,源节点才在网络中发起路由查找过程,找到相应的路由。相反的,很多普通的因特网路由协议都是先验式的,也就是说它们查找路由是不依赖于路径上的节点是否要发包,而是每个节点维护一张包含到达其它节点的路由信息的路由表节点间通过周期性的交换路由信息来不断更新自身的路由表,以便能够及时的反映网络拓扑结构和变化,以维护一致的、及时的、准确的路由信息。正如协议的名字所示,无线自组网按需平面距离矢量路由协议是一种平面距离矢量路由协议。

    在AODV中,整个网络都是静止的除非有连接建立的需求。这就是说一个网络节点要建立连接时才广播一个连接建立的请求。其他的AODV节点转发这个请求消息,并记录源节点,和回到源节点的临时路由。当接收连接请求的节点知道到达目的节点的路由时,就把这个路由信息按照先前记录的回到源节点的临时路由发回源节点。于是源节点就开始使用这个经由其他节点并且有最短跳数的路由。 当链路断掉,路由错误就被回送给源节点,于是源节点就重新发起路由查找的过程。

    大多数协议的复杂性在于为了保证网络性能而减少消息数量。例如,每个路由请求都会有一个序号,节点使用这个序号以避免它们重复转发这个路由请求。路由请求有一个“生存时间”数,这将减少他们被重传的次数。还有就是如果路由请求失败,其他的路由请求将会在先前的路由请求消息超时后的两倍的“生存时间”之后,才被发送。

    相关的路由协议

    AODV对在这方面有多种解决方法。还有一种路由协议是动态源路由协议(DSR),这个路由协议充分最优化网络的通信量。另外就是优化的链路状态路由协议(OLSR)也是解决这方面问题。OLSR不断地收集节点之间能相互通信的数据,并对每个节点保持一个最优化的路由表。所以连接可以很快的建立。但是OLSR是一个相对比较大而且复杂,它要求大型复杂的计算机、很大的内存和计算。同时频繁进行网络其他节点的发现过程是一个巨大的负担。对于其他可选择的方法可以参照无线自组网协议列表。

     

    DSR

    动态源路由协议(Dynamic Source Routing, DSR)是在移动自组网(MANET)中使用的一种路由协议。它工作在TCP/IP协议族的网际层。

    动态源路由协议(Dynamic Source Routing Protocol,DSR)是一个专门为多跳无线AdHoc网络设计的简单且高效的路由协议。所有的路由都是由DSR路由协议动态地、自动地确定和维护,它提供快速反应式服务,以便帮助确保数据分组的成功交付,即使在节点移动或者其他网络状况变化的条件下也是如此。

    DSR路由协议有两个主要机制组成——路由寻找(Route Discovery)机制和路由维护(RouteMaintenance)机制。路由寻找机制在源节点需要给目的节点发送一个分组并且还不知道到达目的节点的路由的时候使用。当源节点正在使用一条到达目的节点的源路由的时候,源节点使用路由维护机制可以检测出因为拓扑变化不能使用的路由,当路由维护指出一条源路由已经中断而不再起作用的时候,为了将随后的数据分组传输到目的节点,源节点能够尽力使用一条偶然获知的到达目的节点的路由,或者重新调用路由寻找机制找到一条新路由。在DSR路由协议中,路由寻找机制和路由维护机制均是完全按需操作,不需要某个网络层次的某种周期分组,如DSR不需要任何周期性的路由广播分组、链路状态探测分组。DSR路由协议的的所有状态都是“软状态”,因为任何状态的丢失都不会影响DSR路由协议的正确操作,因为所有状态都是按需建立,所有状态在丢失之后如果仍然需要的话则能够很容易得到迅速恢复。DSR路由协议的路由寻找机制和路由维护机制的操作使得单向链和不对称路由很容易得到支持。

    DSR路由协议的完整版本直接使用“源路由”,节点使用路由缓冲器存储节点所知的源路由,当发现新路由时,更新缓冲器内的条目。节点所发送的每个数据分组均在其分组头中携带其将要通过的一个完整的、按序排列的路由信息。

    DSR选项头格式如下:

    它的首部采用扩展性良好的TLV格式。除固定部分外,不同类型的选项(option)以TLV格式附加在固定部分之后。

    选项的种类包括:

    路由请求(Route Request)

    路由应答(RouteReply)

    确认请求(ACKRequest)

    确认(ACK)

    源路由(Source Route)

     

    Destination-SequencedDistance Vector routing---DSDV

     

    源文档 <http://en.wikipedia.org/wiki/DSDV>

     

     

    Destination-SequencedDistance-Vector Routing (DSDV) isa table-driven routing scheme for ad hoc mobile networks based on the Bellman-Ford algorithm. It was developed by C. Perkins andP.Bhagwat in 1994. The main contribution of the algorithm was to solvethe routing loop problem. Each entry in the routing table contains a sequencenumber, the sequence numbers are generally even if a link is present; else, anodd number is used. The number is generated by the destination, and the emitterneeds to send out the next update with this number. Routing information isdistributed between nodes by sending full dumps infrequently and smaller incremental updates morefrequently.

    For example therouting table of Node A in this network is

    Destination

    Next Hop

    Number of Hops

    Sequence Number

    Install Time

    A

    A

    0

    A 46

    001000

    B

    B

    1

    B 36

    001200

    C

    B

    2

    C 28

    001500

    Naturally thetable contains description of all possible paths reachable by node A, alongwith the next hop, number of hops and sequence number.

    Contents

      [hide

    [edit]Selection of Route

    If a routerreceives new information, then it uses the latest sequence number. If thesequence number is the same as the one already in the table, the route with thebetter metric is used. Stale entries are those entries that have not beenupdated for a while. Such entries as well as the routes using those nodes asnext hops are deleted.

    [edit]Disadvantages

    DSDV requires aregular update of its routing tables, which uses up battery power and a smallamount of bandwidth even when the network is idle.

    Whenever thetopology of the network changes, a new sequence number is necessary before thenetwork re-converges; thus, DSDV is not suitable for highly dynamic networks.(As in all distance-vector protocols, this does not perturb traffic in regionsof the network that are not concerned by the topology change.)

    [edit]Influence

    While DSDV itselfdoes not appear to be much used today[citation needed], other protocols have used similartechniques. The best-known sequenced distance vector protocol isAODV, which, by virtue of being a reactiveprotocol, can use simpler sequencing heuristics. Babel is anattempt at making DSDV more robust, more efficient and more widely applicablewhile staying within the framework of proactive protocols.

    [edit]References

     

    源文档 <http://en.wikipedia.org/wiki/DSDV>

     

    TORA

    TORA(Temporally Ordered Routing Algorithm)协议     

    Ad Hoc中的一种路由选择的技术。

    为每个节点定义一个区域,此区域包含一些节点,这些节点的距离(也就是跳数)

    在一个限定范围之内。这个距离被称为区域半径。每一个节点只需要知道它的

    路由区域内的拓扑结构,而且随着区域内的拓扑更新而更新。这样,尽管网络很

    大,但更新仅在局部进行。由于距离大于1,这样区域就有大量重叠(这是与分群路

    由的区别)。若S要与D通信,则S发送询问消息,它先通过已有区间内的路由信息

    直接将路由请求送到边界节点(与边界节点之间的跳数值正好等于设置半径的那

    个跳数值),由边界节点再进行处理。并一级一级广播下去,直到到达D,D响

    应这个请求。为了限定信息大小并同时能反应出路由发现过程,在Query消息中加

    入跳数限制,并且每经过一个节点,跳数减1,若跳数域为0,则一丢弃该消息。区

    域内部采用先验式路由协议,如DSDV。TORA仅需要一些相对小数量的询问信息,

    这些信息只是发给周边节点的信息。

    由于区域半径相对于整个网络来说总是比较小,因此区域内部拓扑的开销只是整

    个网络很少的一部分。而且,每一个节点存储的信息也大为减小。

    另外,ZRP协议比全网的反应式路由发现机制要快得多,而且还会发现去目的地

    的多条路由。但是,实施混合式路由也面临着很多困难,如簇的选择和维护、先

    验式和反应式路由协议的合理选择以及网络工作的大流量等问题。

     

    源文档 <http://baike.baidu.com/view/1480882.htm>

     

     

    展开全文
  • 1.Linux网络栈下两层实现 ...下两层涉及到具体的硬件设备,日趋完善的Linux内核已经做到了很好的代码隔离,对网络设备驱动也是如此,如下图所示: 这里要注意的是,Linux下的网络设备net_dev并不
  • 应用交付

    千次阅读 2015-05-21 14:47:58
    1.什么是应用交付? “应用交付”,实际上就是指应用交付网络(Application Delivery Networking,简称ADN),它利用相应的网络优化/加速设备,确保用户的业务应用能够快速、安全、可靠地交付给内部员工和外部服务...
  • 协议篇————3、DUP协议详解

    千次阅读 2018-04-14 10:56:20
    一、UDP协议简介UDP是OSI模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输...二、UDP协议的特点UDP是无连接的,即发送数据之前不需要建立连接,首部只有8个字节——通信开销小UDP使用最大努力交付...
  • 项目分几个阶段,第一阶段基本完成,客户想要代码看是否符合要求。 双方没有书面协议,也未给定/订金。 折中情况是否是应该先要一部分钱?百分之多少合适? 谢谢!
  • TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UDP协议与TCP/IP协议的联系,很多人犯糊涂了, 一直都是说TCP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! TCP/IP协议是一个协议簇。里面包括...
  • 软件保密协议

    千次阅读 2014-08-13 17:48:45
    看了一下软件保密协议,竟然没怎么看懂。为了保密性,我将甲方和乙方隐藏了。分享给大家看一下: 软件保密协议 甲方(披露方):xxxx有限公司 地址:北京市xxxx室 法定代表:xxx 乙方(接受方):xxx 地址: 法定...
  • LwIP中TCP协议的实现

    千次阅读 2019-09-16 23:58:25
    与其他协议一样,为了描述TCP协议,LwIP定义了一个名字叫tcp_pcb的结构体,可以称之为TCP控制块,其内定义了大量的成员变量,基本定义了整个TCP协议运作过程的所有需要的东西,如发送窗口、接收窗口、数据缓冲区。...
  • 常见协议以及对应端口 协议 端口 FTP协议:文件传输协议,用户使用FTP客户端通过FTP协议访问FTP服务器上的文件资源 20/21 SSH协议:安全外壳协议,专为远程登录会话和其他网络服务提供的安全性协议。能够...
  • IP协议协议--IP路由

    千次阅读 2017-11-20 18:37:26
    它是IP协议的一个核心任务,即发生在TCP/IP四层模型中的网络层。确切的说,是发生在网络层的IP模块。1. IP模块工作流程  操作系统内核中的IP模块的工作流程如下图概括:   绿色箭头表示IP数据报的数据走向: ...
  • TCP/IP协议四层模型

    万次阅读 多人点赞 2017-10-28 17:18:26
      TCP/IP协议族是一个四层协议系统:1. 数据链路层  1.1 作用   (1) 实现网卡接口的网络驱动,以处理数据在以太网线等物理媒介上的传输   (2) 网络驱动程序隐藏了不同物理网络的不同电气特性,为上层协议...
  • ICMP协议

    千次阅读 2017-10-06 20:39:13
    众所周知,IP协议是不可靠的数据传输服务,它是尽最大努力交付的,不保证数据报到达的顺序,是否重复,以及是否丢失等问题,(这些问题由运输层负则),有了ICMP协议,便是为了有效地转发IP数据报和提高交付成功的...
  • UDP传输协议

    千次阅读 2016-01-19 17:55:46
    UDP传输过程及代码实现1、UDP协议介绍UDP协议在IP协议上增加了复用、分用和差错检测功能。UDP的特点: A)是无连接的。相比于TCP协议,UDP协议在传送数据前不需要建立连接,当然也就没有释放连接。 B)是尽最大...
  • TCP/IP协议之ICMP协议

    千次阅读 2018-03-11 23:30:30
    一、定义ICMP协议(Internet Control Message ...二、特点1、ICMP出现的背景IP协议完成了数据在各主机间的递交,但是,IP协议是一种无连接的不可靠的数据交付,IP协议不提供任务错误校验和恢复机制。因此,设计...
  • 微服务与持续交付

    千次阅读 2017-02-10 14:44:34
    本文节选自王磊著《微服务架构与实践》中的章节“微服务与持续交付”,介绍了持续交付是什么,以及微服务如何做到持续交付。 十年以前,软件在一年之内的交付次数屈指可数。 过去的十年间,交付的过程一直被...
  • 邮件服务器的功能是发送和接收邮 件,同时还要向发件人报告邮件传送的结果(已交付、被拒绝、丢失等)。邮件服务器按照 客户服务器方式(C/S)工作。邮件服务器需要使用两种不同的协议。一种协议用于用户代理向邮件 ...
  • 在实施持续交付的过程中,我们很容易聚焦于自动化和工具,因为作为起点,它们通常是最容易做的。然而,持续交付的成功实现,还依赖于根据最终交付物而对组织结构所做的优化。对于持续交付来说,最大的障碍是依据角色...
  • 网络协议基础TCP/IP-http协议

    千次阅读 2017-07-26 20:16:40
    一、网络协议 二、TCP(Transmission Control Protocol,传输控制协议) TCP头格式TCP协议中的三次握手和四次挥手TCP报文抓取工具 三、HTTP(HyperText Transfer Protocol,超文本传输协议) 请求报文...
  • 交付团队管理 开始于:为什么需要构建软件? (Begin With: Why Do You Need To Build Software?) There are a many reasons why an organization needs to build and deliver software. Some examples might be: ...
  • 一 OSI与TCP/IP各层的结构与功能,都有哪些协议 二 TCP三次握手和四次挥手(面试常客) 三 TCP、UDP协议的区别 四 TCP协议如何保证可靠传输 五 在浏览器中输入url地址 ->> 显示主页的过程(面试常客) 六 ...
  • 常见网络协议

    万次阅读 多人点赞 2019-03-26 13:32:50
    一、网络协议 二、TCP(Transmission Control Protocol,传输控制协议)       TCP头格式      TCP协议中的三次握手和四次挥手      TCP报文抓取工具三、...
  • 2B 领域下低代码的探索之路

    万次阅读 2021-03-23 11:30:15
    简介: 低代码将成为B端服务领域的基础设施,必将颠覆传统开发方式,未来可期。 作者:天晟 前言 大家好,我是钉钉宜搭前端一个小团队的负责人天晟,在阿里做了五年的低代码。今天的分享我们不讲技术细节,主要...
  • 用户协议

    千次阅读 2019-03-04 20:59:00
    尊敬的用户您好:在您使用本服务之前,请您认真阅读本用户协议,更好的了解我们所提供的服务以及您享有的权利义务。您开始使用时,即表示您已经了解并确认接受了本文件中的全部条款,包括我们对本服务条款随时做的...
  • TCP协议和UDP协议的区别及其应用

    万次阅读 多人点赞 2018-07-02 19:34:45
    下面是TCP和UDP的简单程序: 简单的TCP网络程序 https://blog.csdn.net/qq_37941471/article/details/80738319 ...接着我们通过这两个协议来更直接的理解一下TCP协议和UDP协议: 这两个协议...
  • 网络协议(UDP协议

    千次阅读 2018-08-14 23:29:06
    在互通之前,面向连接的协议会先建立连接。例如,TCP 会三次握手,而 UDP 不会。 所谓的建立连接,是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓的面向...
  • 摘要:持续交付的最终目的是高效和可信两者的结合。 一、高效可信的持续交付 1.1 软件研发的目的 持续交付是一个大家平时提得比较多的话题,高效是持续交付的目的,具体到华为云的场景下,持续交付的最终目的是...
  • 首先最重要的代码:github地址 一、 实验目的 理解滑动窗口协议的基本原理;掌握 GBN 的工作原理;掌握基于 UDP 设计并实现一个 GBN 协议的过程与技术。 二、 实验内容 实现了GBN协议,模拟丢包,并支持双向传输,并...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,968
精华内容 13,587
关键字:

代码交付协议