精华内容
下载资源
问答
  • 定制协议:程序员自己设计的数据传输格式,为应用层协议。是两个应用之间通过特殊的格式来传输和接收数据。我们使用一个结构体来存储数据经行数据的传输。 定义一个结构体 struct data   {  int a;用来存放第...

    自定制协议:程序员自己设计的数据传输格式,为应用层协议。是两个应用之间通过特殊的格式来传输和接收数据。我们使用一个结构体来存储数据经行数据的传输。

    定义一个结构体 struct data 

                              {

                                        int a;用来存放第一个数据

                                        int b;用来存放第二个数据

                                        char c;用来存放第三个数据

                              }

    其余的都是基于tcp协议的网络通讯。只是在send和recv的时候我们传输的是这个结构体。通过结构体来成数据转化为我们所能理解的格式.

    直接上代码

    ​
    //客户端
    1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<unistd.h>
      4 #include<string.h>
      5 #include<sys/socket.h>
      6 #include<sys/types.h>
      7 #include<arpa/inet.h>
      8 #include<netinet/in.h>
      9 #include<errno.h>
     10 struct data
     11 {
     12     int a;
     13     int b;
     14     char c;
     15 };
     16 int main(int argc,char *argv[])
     17 {
     18     if(argc!=3)
     19     {
     20         perror("port ip");
     21         return -1;
     22     }
     23     int sockfd=socket(AF_INET,SOCK_STREAM,0);
     24     if(sockfd<0)
     25     {
     26         perror("socket error");
     27         return -1;
     28     }
     29     struct sockaddr_in cil_addr;
     30     cil_addr.sin_family=AF_INET;
     31     cil_addr.sin_port=htons(atoi(argv[2]));
     32     cil_addr.sin_addr.s_addr=inet_addr(argv[1]);
     33     socklen_t len=sizeof(struct sockaddr_in);
     34     int ret=connect(sockfd,(struct sockaddr*)&cil_addr,len);
     35     if(ret<0)
     36     {
     37         perror("connect error");
     38         return -1;
     39     }
     40     while(1)
     41     {
     42         struct data dates;
     43         int size=sizeof(struct data);
     44         printf("第一个数字\n");
     45         scanf("%d",&dates.a);
     46         printf("第二个数字\n");
     47         scanf("%d",&dates.b);
     48         printf("运算符\n");
     49         scanf("%s",&dates.c);
     50         send(sockfd,(void*)&dates,size,0);
     51         int num;
     52         recv(sockfd,(void*)&num,4,0);
     53         printf("结果为:%d",num);
     54     }
     55     close(sockfd);
     56 }
     57 
    
    ​
    //服务端
     1 #include<stdio.h>
      2 #include<error.h>
      3 #include<sys/types.h>
      4 #include<sys/socket.h>
      5 #include<unistd.h>
      6 #include<arpa/inet.h>
      7 #include<string.h>
      8 #include<netinet/in.h>
      9 #include<stdlib.h>
     10 
     11 struct date
     12 {
     13     int a;
     14     int b;
     15     char c;
     16 };
     17 
     18 int main(int argc,char* argv[])
     19 {
     20     if(argc!=3)
     21     {
     22         printf("ip,port");
     23         return -1;
     24     }
     25 
     26     int socked=socket(AF_INET,SOCK_STREAM,0);
     27     if(socked==0)
     28     {
     29         perror("socket error");
     30         return -1;
     31     }
     32     struct sockaddr_in lst_addr;
     33     lst_addr.sin_family=AF_INET;
     34     lst_addr.sin_port=htons(atoi(argv[2]));
     35     lst_addr.sin_addr.s_addr=inet_addr(argv[1]);
     36     socklen_t len=sizeof(struct sockaddr_in);
     37     int ret =bind(socked,(struct sockaddr*)&lst_addr,len);
     38     if(ret<0)
     39     {
     40         perror("bind error");
     41         return -1;
     42     }
     43     if(listen(socked,5)<0)
     44     {
     45         perror("listen error");
     46         return -1;
     47     }
     48 
     49     while(1)
     50     {
     51         int newsock;
     52         struct sockaddr_in cil_addr;
     53         len=sizeof(struct sockaddr_in);
     54         newsock=accept(socked,(struct sockaddr*)&cil_addr,&len);
     55         if(newsock<0)
     56         {
     57             perror("new sockerror");
     58             continue;
     59         }
     60             while(1)
     61             {   struct date dates;
     62                 int size=sizeof(struct date);
     63                 ssize_t lec=recv(newsock,(void*)&dates,size,0);
     64                 if(lec<0)
     65                 {
     66                 perror("recv error");
     67                 close(newsock);
     68                 continue;
     69                 }
     70                 else if(lec==0)
     71                 {
     72                     printf("shutdown");
     73                     close(newsock);
     74                     continue;
     75                 }
     76                 int num;
     77                 char t=dates.c;
     78                 switch(t)
     79                 {
     80                     case '+':
     81                         num=dates.a+dates.b;
     82                         break;
     83                     case '-':
     84                         num=dates.a-dates.b;
     85                         break;
     86                     case '*':
     87                         num=dates.a*dates.b;
     88                         break;
     89                     case'/':
     90                         num=dates.a/dates.b;
     91                         break;
     92                 }
     93                send(newsock,(void *)&num,4,0);
     94             }
     95     }
     96     close(socked);
     97 }
    

     

    展开全文
  • 网络协议设计(七)本篇,我们就进入数据链路层的上层,网络层,看看我们在网络层需要做哪些事情。 在网路层,我们实现的协议有ARP协议,IPv4协议,ICMP协议。 学习网络协议栈的伙伴相信对于协议的内容及功能都...

    网络协议栈设计(七)

    本篇,我们就进入数据链路层的上层,网络层,看看我们在网络层需要做哪些事情。
    在网路层,我们实现的协议有ARP协议,IPv4协议,ICMP协议。
    学习网络协议栈的伙伴相信对于协议的内容及功能都已经有了一定的掌握,我在此不再赘述。
    ARP协议处在网络层协议的最底层,为网络层其他协议服务的。按照我们自底向上的设计顺序,我们本篇,就给大家先带来ARP协议的设计。

    地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

    ARP协议设计与实现

    发送方目的:
    (1)发送ARP请求报文。
    (2)接收ARP应答报文。
    (3)根据接收到的ARP应答报文维护发送方ARP表。

    我们将以上目的分为三部分设计,本篇介绍ARP请求报文的发送。

    相关知识:

    协议数据单元结构:
    这里写图片描述
    以太网首部不再介绍,其余各个字段含义如下:
    1.硬件类型:占2个字节,表明ARP实现在何种类型的网络上。
    Ø 值为1:表示以太网。
    2.协议类型:占2个字节表示要映射的协议地址类型。
    Ø IP:0X0800
    3.硬件地址长度:占1个字节,表示 MAC地址长度,其值为6个字节。
    4.协议地址长度:占1个字节,表示IP地址长度,此处值4个字节
    5.操作类型 :占2个字节,表示ARP数据包类型。
    Ø 值为1表示ARP请求。
    Ø 值为2表示ARP应答。
    Ø 值为3表示RARP请求。
    Ø 值为4表示RARP应答。
    6.源MAC地址:占6个字节,表示发送端MAC地址
    7.源IP地址:占4个字节,表示发送端IP地址
    8.目的MAC地址:占6个字节,表示目标设备的MAC物理地址。若为请求报文则为空。
    9.目的IP地址:占4个字节,表示目标设备的IP地址.
    注意:在ARP操作中,有效数据的长度为28个字节,不足以太网的最小长度46字节长度,需要填充字节,填充字节最小长度为18个字节

    有了以上的介绍,我们将ARP数据包设计为一个结构体:

    struct arp_pkt
    {
        u_int16_t hardware_type;
        u_int16_t protocol_type;
        u_int8_t hardware_addr_length;
        u_int8_t protocol_addr_length;
        u_int16_t op_code;
        u_int8_t source_mac[6];
        u_int8_t source_ip[4];
        u_int8_t destination_mac[6];    
        u_int8_t destination_ip[4];
    };

    根据以太网数据包发送设计的经验,我们将加载数据单独设计为一个函数。
    ARP请求根据上层所给的IP地址解析MAC地址,所以我们只需要一个目的IP地址,其他字段基本固定。

    void load_arp_packet(u_int8_t *destination_ip);

    至此,我们提供一个发送ARP请求数据包的函数接口:

    //这里的参数u_int8_t *ethernet_dest_mac是因为我们设计时与接收方共用一个函数模板。
    //接收方向我们发送ARP应答报文时是单播发送,所以需要提供一个目的MAC地址,我们在调用时提供一个广播MAC地址即可
    void network_arp_send(u_int8_t *destination_ip, u_int8_t *ethernet_dest_mac);
    {
        加载ARP请求数据包;
        计算数据包长度;
        调用以太网发送函数发送;
    }

    下一篇为大家带来ARP请求报文发送的代码实现。

    展开全文
  • 为了改善紫外光(UV)点对点通信中传输距离有限、覆盖范围小的问题, 组建了UV组织(Ad Hoc)网络。结合UV通信的信道特性, 提出了一种UV组网通信收发装置设计方案。基于该方案, 给出了UV Ad Hoc网络节点定位算法, 该...
  • 组网的路由技术主要是设计能自适应网络拓扑动态变化的分布式路由协议,并避免产生路由环路,尽可能减小路由开销,具有一定的可扩展性,使网络节点能根据网络情况的变化,具各分布式管理的路由功能。组织网络是一...
  • 组网的路由技术主要是设计能自适应网络拓扑动态变化的分布式路由协议,并避免产生路由环路,尽可能减小路由开销,具有一定的可扩展性,使网络节点能根据网络情况的变化,具各分布式管理的路由功能。组织网络是一...
  • 协议设计的目标 解析效率:互联网业务具有高并发的特点,解析效率决定了使用协议的 CPU成本;编码长度:信息编码出来的长度,编码长度决定了使用协议 的网络带宽及存储成本 易于实现:互联网业务需要一个轻量级的...

    一、协议概述

    • 什么协议:协议是一种约定,通过约定,不同的进程可以对一段数据产生相同的理解,从而可以相互协作,存在进程间通信的程序就一定需要协议
    • 为什么说进程间通信就需要协议?而不是说客户端和服务器端之前?

    协议设计的目标

    • 解析效率:互联网业务具有高并发的特点,解析效率决定了使用协议的 CPU成本;编码长度:信息编码出来的长度,编码长度决定了使用协议 的网络带宽及存储成本
    • 易于实现:互联网业务需要一个轻量级的协议,而不是大而全的
    • 可读性:编码后的数据的可读性决定了使用协议的调试及维护成本(不 同的序列化协议是有不同的应用的场景)
    • 兼容性:互联网的需求具有灵活多变的特点,协议会经常升级,使用协 议的双方是否可以独立升级协议、增减协议中的字段是非常重要的
    • 跨平台跨语言:互联网的的业务涉及到不同的平台和语言,比如 Windows用C++,Android用Java,Web用Js,IOS用object-c
    • 安全可靠:防止数据被破解

    协议设计最核心的问题(文章下面会详细介绍)

    • 1. 序列化/反序列化
    • 2. 判断包的完整性
    • 3. 协议升级
    • 4. 协议安全
    • 5. 数据压缩

    二、序列化与反序列

    • 序列化和反序列化概念:
      • 序列化:把对象转换为字节序列的过程称为对象的序列化
      • 反序列化:把字节序列恢复为对象的过程称为对象的反序列化

    • 数据格式存储一般有两种:
      • 一种为文本存储(例如JSON、XML等),另一种为二进制存储(例如Protobuf)
      • 二进制可读性差,文本存储可读性高
      • 用二进制存储比用本文存储占用的空间更少(如下图所示,12345678用文本存储需要8字节,用十六进制存储只需要6字节)。

    序列化方法

    • ①TLV编码及其变体(TLV是tag, length和value的缩写):比如Protobuf(Protobuf详情参阅:https://blog.csdn.net/qq_41453285/article/details/106731318
    • ②文本流编码:比如XML/JSON
    • ③固定结构编码: 基本原理是,协议约定了传输字段类型和字段含义,和TLV的方式类似, 但是没有了tag和len,只有value。比如TCP头部,其头部已经是固定的了
    • ④内存dump:
      • 基本原理是,把内存中的数据直接输出,不做任何序列化操作。反序列化的时候,直接还原内存
      • 如果消息结构是嵌套类型的,例如JSON那样的,那么内存dump就不容易处理了。一般在单片机、嵌入式中使用,普遍不使用
      • 例如两端在通信的时候,数据用结构体表示,直接将结构体发送出去,不做任何序列化
    struct Data
    {
        //...
    };
    
    struct Data d;
    send(fd, &d, sizeof(d), 0);

    主流序列化协议

    • 主流序列化协议:
      • XML 指可扩展标记语言(eXtensible Markup Language)。是一 种通用和重量级的数据交换格式。以文本方式存储
      • JSON(JavaScript Object Notation,JS对象简谱)是一种通用和轻量 级的数据交换格式。以文本结构进行存储
      • protocol buffer是Google的一种独立和轻量级的数据交换格式。以二进制结构进行存储

    序列化、反序列化速度对比

    • 测试10万次序列化

    • 测试10万次反序列化

    三、判断包的完整性

    • 为了能让对端知道如何给包分界,目前一般有以下做法:
      • 1. 以固定大小字节数目来分界,如每个包100个字节,对端每收齐100个字节,就当成 一个包来解析
      • 2. 以特定符号来分界,如每个包都以特定的字符来结尾(如\r\n),当在字节流中读取到该字符时,则表明上一个包到此为止
      • 3. 固定包头+包体结构,这种结构中一般包头部分是一个固定字节长度的结构,并且 包头中会有一个特定的字段指定包体的大小。收包时,先接收固定字节数的头部, 解出这个包完整长度,按此长度接收包体。这是目前各种网络应用用的最多的一种 包格式
      • 4. 在序列化后的buffer前面增加一个字符流的头部,其中有个字段存储包总长度,根据特殊字符(比如根据\n 或者\0)判断头部的完整性。这样通常比3要麻烦一些, HTTP和REDIS采用的是这种方式。收包的时候,先判断已收到的数据中是否包含结 束符,收到结束符后解析包头,解出这个包完整长度,按此长度接收包体

    协议设计范例参考1(云平台节点服务器)

    协议设计范例参考2(即使通信项目)

    协议设计范例参考4(Nginx) 

    • 下面是Nginx数据包头部的定义

    协议设计范例参考4(HTTP协议)

    • HTTP协议是我们最常见的协议,我们是否可以采用HTTP协议作为互联网后台的协议呢?这个一般是不适当的,主要是考虑到以下2个原因:
      • 1)HTTP协议只是一个框架,没有指定包体的序列化方式,所以还需要配合其他序列化的方式使用才能传递业务逻辑数据
      • 2)HTTP协议解析效率低,而且比较复杂(不知道有没有人觉得HTTP协议简单,其实不是http协议简单,而 是HTTP大家比较熟悉而已)
    • 有些情况下是可以使用HTTP协议的:
      • 1)对公网用户api, HTTP协议的穿透性最好,所以最适合
      • 2)效率要求没那么高的场景
      • 3)希望提供更多人熟悉的接口,比如新浪微、腾讯博提供的开放接口

    协议设计范例参考5(Redis的Resp协议)

    四、协议升级

    • 1. 通过版本号指明协议版本,即是通过版本号辨别不同类型的协议
    • 2. 支持协议头部可扩展,即是在设计协议头部的时候有一个字段用来指明头部的长度

    五、协议安全

    • 1. xxtea 固定key
    • 2. AES 固定key
    • 3. openssl
    • 4. Signal protocol 端到端的通讯加密协议

    六、数据压缩

    • 1. deflate
    • 2. gzip
    • 3. lzw

    七、总结语

    展开全文
  • O 引言  无线电台以其良好的通信性能被广泛应用在军事通信如巡逻执勤,民用通信如指挥调度,...遵循蓝牙协议的各类数据及语音设备将能够用微波取代传统网络中错综复杂的电缆,非常方便地实现快速、灵活、安全、低代价
  • asio-kcp: 使用 KCP的完整 UDP网络库,完整实现了基于 UDP的链接状态管理,会话控制,KCP协议调度等 协议比较 如果永远不丢包那么 KCP和 TCP性能差不多,但网络会卡,造成卡的原因就是丢包和抖动...
  • 本实验系统侧重于网络协议设计而不是配置观察,同时对协议实现进行了一定简化和实现细节的封装,这样学生 根据提供的函数接口和动态链接库就可以实现数据链路层协议,不仅减少学生不必要的工作量,而且有助于学生对链路...
  • 它采用内存静态分配与动态...半实物仿真的测试结果表明,该缓冲区管理机制能够保证移动组织网络数据链路层协议的有效、可靠运行,其设计思想同时也能适用于网络协议栈其他层的缓冲区管理需求,具有一定的应用前景。
  • 设计需求 差错恢复、流量控制等由高层协议控制 PPP数据帧 标志(Flag):界符 地址(Address):无效(只是一个选项) 控制(Control):无效(未来可能的多种控制域) 协议(Protocol):上层协议 信息(info)...

    PPP协议

    点对点数据链路控制

    一个发送端,一个接收端,一条链路,无需介质访问控制,无需明确的MAC寻址,例如拨号链路,ISDN链路

    设计需求

    差错恢复、流量控制等由高层协议控制

    PPP数据帧

    标志(Flag):定界符

    地址(Address):无效(只是一个选项)

    控制(Control):无效(未来可能的多种控制域)

    协议(Protocol):上层协议

    信息(info):上层协议分组数据

    校验(check):CRC校验,,用于差错检测

    字节填充

    学习自中国大学生MOOC网

    展开全文
  • O 引言  无线电台以其良好的通信性能被广泛应用在军事通信如巡逻执勤,民用通信如指挥调度,...遵循蓝牙协议的各类数据及语音设备将能够用微波取代传统网络中错综复杂的电缆,非常方便地实现快速、灵活、安全、低代价
  • 本系列主要是对此次项目从0~1的一个复盘 一来方便自己后期回顾,暴露问题 二来希望可以给新入坑的朋友们...② 服务端基于skynet框架开发,而sproto正是由skynet提供的一套协议,它类似 protobuf ,但设计更加简洁,也
  • ZigBee多节点无线物联组网设计

    万次阅读 2015-04-16 22:06:47
    目前,针对一定区域内信息...基于此,从节省成本和网络稳定性考虑,给出一种基于ZigBee技术的多节点设备无线组网设计方案。 基于IEEE 802.15.4协议的ZigBee技术是一种新兴的短距离无线通信技术,具有功耗低、成本低
  • 本方案针对传统监测系统用户感知度低、统计能力不足等缺点,对现行LTE网络S1接口用户面协议进行分析,并结合当前互联网主流的行为分析技术——深度分组检测(DPI)技术和聚类爬虫技术的优势,实现了以协议解码、业务...
  • IEEE 802.3协议是针对以太网CSMA/CD标准的传输介质物理层(PHY)和介质访问控制协议(MAC、Media Access Control)来定义的。芯片由PHY、发送模块、接收模块、FIFO、控制模块组成,其中控制模块包括寄存器堆、DMA...
  • 如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最...TCP协议TCP协议:是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络...
  • 采用新一代嵌入式处理器PowerPC440,搭建光纤通道接口卡的SOPC系统,实现了光纤通道协议的基本功能,为基于PowerPC的嵌入式系统设计应用提供了参考。  引言  现阶段,主流的高性能光纤通道通用产品基本上被...
  • 现代通信技术的迅速发展使得许多...该通信方式是在433MHz高频发射模块和接收模块的基础上自己定义无线传输协议,实现任意两机之间的多个字节数据通信。  1 硬件系统设计  本系统主要由PICl6F877A单片机构成控制系
  • 于是开始花时间在网络传输这个领域上,尝试基于 UDP 实现一些保守的可靠协议,仿照 BSD Lite 4.4 的代码实现一些类 TCP 协议,觉得比较有意思,又接着实现一些 P2P 和动态路由网相关的玩具。KCP 协议诞生于 2011 年...
  • 目前从事软件需求工程、网络协议验证形式化方法以及函数式语言等方面的研究。 译者序: 我们愿意向广大的读者推荐W. Richard Stevens关于TCP/IP的经典著作(共3卷)的中译本。本书是其中的第2卷:《TCP/IP详解 卷2:...
  • 网络编程

    2012-09-02 23:32:00
    从写QQ的过程中来看,网络编程最重要的还是得设计好自己的协议,不要出现冗余数据也不要少了必要的数据。在数据的读写过程中一定要把网络中的数据流读干净,无论这些数据是否有用,不然就影响到后续的数据片段读取的...
  • 作业 相比普通的ad hoc网络,无线传感器网络有哪些特殊性?? (1)节点资源有限:如节点的电源能量、通信能力、...WSN中传感器节点的能量是有限的,设计节能的网络协议有利于延长节点以及网络的生存周期,能更有力.
  • 微机课程设计自我总结 一、实习目的 计算机网络,是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和...
  • 介绍了一个使用Visual Basic的Socket控件与OMRON PLC之间的通信程序,并成功地应用在自动控制系统中,主要实现上位机与OMRON PLC之间的以太网通信,并对它们之间的通信协议作了描述,本文所介绍的通信程序的设计方法...
  • 计算机网络到底该怎么学?

    千次阅读 2019-01-11 16:01:11
    你好,我是《趣谈网络协议》的作者刘超,我为你整理了《趣谈网络协议》专栏的所有学习资料,并告诉你如何更高效地使用这些资料,从而帮助你消化吸收专栏内容,以期获得更好的学习效果。1. 能力测试查漏补缺,检测...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 297
精华内容 118
关键字:

自定网络协议设计