当前位置: 代码迷 >> 综合 >> UDP 编程-TFTP、广播、多播
  详细解决方案

UDP 编程-TFTP、广播、多播

热度:38   发布时间:2024-01-26 15:34:52.0

TFTP 简介、通信过程

    TFTP 概述

          TFTP :  简单文件传送协议

               最初用于引导无盘系统,用来传输小文件

       特点:

            基于UDP协议实现

            不进行用户有效性认证

      数据传输模式:

         octet:二进制模式

         netascii:文本模式

         mail:已经不再支持


TFTP 通信过程

     TFTP 通信过程总结

  •          服务器在69端口等待客户端的请求
  •         服务器同意,就使用临时端口与客户端通信
  •        每个数据包的编号都会变化(从1开始)
  •        每个数据包都要ACK的确认,如果超时,就会重新发送最后的包
  •       数据的长度以512byte传输
  •        小于512byte的数据意味着传输结束


TFTP 协议分析

注意:

    以上的 0 代表的是'\0'
不同的差错码对应不同的错误信息

 

错误码:

  •         0         Undefined                                      未定义                      
  •         1         File  not  found                               找不到文件
  •         2         access  violation                             访问冲突
  •         3         disk  full or  allocation exceeded     磁盘已满或超过分配
  •        4          illegal  TFTP operation                     非法的TFTP操作
  •         5         unknown  transfer  ID                        未知的传输ID
  •         6        file  already  exists                           文件已经存在
  •         7        no  such   user                                   没有这样的用户
  •         8        unsupported  option  requested      不支持的选项请求

  

TFTP 带选项

     读写请求中修改了选项

      如果发送带选项的读写请求

     tsize 选项

         当读操作,tsize 选项参数必须为 0 ,服务器会返回待读取的文件大小

         当写操作,tsize 选项参数为待写入的文件大小,服务器会显示该参数

     blksize 选项

          修改传输文件时使用的数据块大小(范围:8 ~ 65464)

     timeout   选项

          修改默认的数据传输超时时间(单位:秒)

 

     TFTP通信过程总结(带选项)

  •           可以通过发送 带选项的读/写请求 发送给server
  •          如果server同意修改选项,就发送选项修改确认包
  •         server发送的数据,选项修改确认包都是临时port
  •         server 通过timeout来对丢失数据包的重新发送


练习—TFTP 客户端

    要求:

       使用TFTP协议,下载server上的文件到本地

   实现思路:

  •       构造请求报文,送到服务器(69端口)
  •      等待服务器回应
  •      分析服务器回应
  •     接受数据,直到接收到的数据包小于规定数据包大小


UDP 广播

    广播:由一台主机向该主机所在子网内所有主机发送数据方式

      广播只能用于UDP或原始IP实现,不能用TCP

  广播的用途

        

   UDP广播的特点

 

   UDP广播地址

 

广播与单播的对比
单播

    广播

    套接口选项

/*
成功:  执行返回 0
失败: 返回-1
*/
int setsockopt(int sockfd, int level, int optname, const viod *optval, socklen_t optlen);

 

 

广播示例

int main(int argc, char *argc[])
{int sock_fd = 0;char buff[1024] = "";unsigned short port = 8000;struct sockaddr_in send_addr;bzero(&send_addr, sizeof(send_addr));send_addr.sin_family = AF_INET;send_addr.sin_port = htons(port);sock_fd = socket(AF_INET, SOCK_DGRAM, 0);if(sock_fd < 0){perror("socket failed");close(sock_fd);exit(1);}if(argc > 1){send_addr.sin_addr.s_addr = inet_addr(argv[1]);}else{printf("not have a server IP");exit(1);}int yes = 1;setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));strcpy(buf, "boardcast sucess");int len = sendto(sock_fd, buff, strlen(buff),0, (struct sockaddr *)&send_addr,sizeof(send_addr));if(len < 0){printf("send error \n");close(sock_fd);exit(1);}return 0;
}


UDP 多播

  多播概述

   多播:

        数据的收发仅仅在同一个分组中进行

    多播的特点:

  •        多播地址标识一组接口
  •       多播可以用于广域网使用
  •      在ipv4中,多播是可选的

 

多播地址
IPv4 的 D 类地址是多播地址

    十进制:224.0.0.1 239.255.255.254

    十六进制:E0.00.00.01 EF.FF.FF.FE

   多播地址向以太网 MAC 地址的映射

UDP 多播工作过程

  多播地址结构体
在 IPv4 因特网域(AF_INET)中,多播地址结构体用如下结构体 ip_mreq 表示

struct in_addr
{in_addr_t s_addr;
};
struct ip_mreq
{struct in_addr imr_multiaddr;       //多播组IPstruct in_addr imr_interface;       //将要添加到多播组的IP
};

多播套接口选项

/*
成功: 执行返回 0
失败: 返回-1
*/
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

 

加入多播组示例

char group[INET_ADDRSTRLEN] = "244.0.1.1";struct ip_mreq mreq;                            //定义一个多播组地址mreq.imr_multiaddr.s_addr = inet_addr(group);    //添加一个多播组IP
mreq.imr_interface.s_addr = htonl(INADDR_ANY);    //添加一个将要添加到多播组的IPsetsockopt(sockfd, IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));