LINUX 入门 6

LINUX 入门 6

day10 20240505 耗时:41min

day10 20240506 耗时:155min

课程链接地址

第6章 DNS协议与请求

1 DNS协议分析与项目介绍

  1. 自己去看教程 快速扫了一下,还是结合实践去看概念有感觉

    回答以下几个问题:

    1. dns作用
    2. dns分层
    3. 服务类型:授权型、递归型recursion
    4. dns协议——结构,服务器去解析,解析过程,报文格式

    DNS互联网开发重要组件,domain name system:翻译域名domain name为IP地址

    windows下win+R
    cmd
    nslookup www.baidu.com 查看网址的ip 14.215.177.38和39
    

​ 我貌似不行,一直timeout,第二天试了以下又行了

  1. wireshark 对dns解析

    自己官网装一下就行,下载巨慢,用迅雷下就行

    选Ethernet以太网 这个网卡网络适配器,but好像没有,wlan有,敲网址以后

    前两条query,后一条response

    在这里插入图片描述

    在这里插入图片描述

    看协议报文格式——recursion递归型查询,头部正文等等,去看教程,有点印象,看过的八股里有

2 DNS请求头定义与域名查询原则

域名查询 类似 Huffman树结构+多栈

0voice.com的name:60voice3com

// 查协议报文格式
struct dns_header{// 长度固定unsigned short id;unsigned short flags;unsigned short questions;unsigned short answer;unsigned short authority;unsigned short additional;
};struct dns_question {// 长度不固定int length;unsigned short qtype;unsigned short qclass;unsigned char *name; // 
};

3 DNS header填充与函数实现

  1. wireshark看到的一坨——物理层、数据链路层、网络层、传输层、DNS层
  2. query和response的transaction ID不变
  3. htons:将主机字节顺序转换为网络字节顺序的函数,其中 “htons” 代表 “host to network short”。在网络编程中,字节顺序是一个重要的概念,因为不同的计算机体系结构可能采用不同的字节顺序(即大端序12 | 34和小端序13 | 24),而网络协议通常要求使用特定的字节顺序进行通信,以确保数据在不同计算机之间正确解释。
// 2 client send to dns server 填充header
int dns_create_header(struct dns_header *header){// 先判断传进来的参数,习惯!!!if(header ==NULL) return -1;memset(header, 0, sizeof(struct dns_header)); //接着,使用 memset 函数将传入的 header 指针所指向的内存区域全部设置为 0。这个操作通常用于初始化内存,确保结构体中的所有字段都被正确初始化为 0。// random, 下面两行一起产生的,多线程,不安全,先srandom产生种子,在其他地方random()调用会出问题srandom(time(NULL)); //提供一个随机种子,限定随机值的范围; 现在距离1970年的秒数,所以随机值很大!// srandom(100); //产生0-99的值!header->id = random();header->flags = htons(0x100);header->questions = 1; //每次查一个DNS
}

4 DNS question填充与函数实现

不要开2倍速,听也听不清,很暴躁,越听越暴躁 1.25可以

  1. size_t: size_t 是一种用于表示内存大小的数据类型,通常用于与内存相关的操作,比如数组索引、内存分配等。它的大小在不同的系统中可能有所不同,但通常被定义为无符号整数类型。

    在 C 语言中,size_t 类型通常是 typedefunsigned int 或者 unsigned long 的别名,取决于具体的编译器和系统架构。在 32 位系统中,通常为 unsigned int,而在 64 位系统中通常为 unsigned long

  2. strncpy(a,b,长度) strcpy()遇到\0才结束 b给a

// hostname:www.0voice.com 
// name:3www6voice3com0
int dns_create_question(struct dns_question *question, const char *hostname){if(question == NULL || hostname == NULL) return -1;memset(question, 0, sizeof(struct dns_question));question->name = (char*)malloc(strlen(hostname));if(question->name == NULL) return -2;question->length = strlen(hostname) + 2;question->qtype = htons(1); //变成Aquestion->qclass = htons(1);// name转换,一段段截const char delim[2] = "."; //字符数组2个.char *qname = question->name;char *hostname_dup = strdup(hostname); //复制duplicate,自带malloc,返回一个动态的非常量!!char *token = strtok(hostname_dup,delim); //截取token, 按分隔符delim截while(token != NULL){// 第一组wwwsize_t len = strlen(token);//取这段长度,size_t: 是一种用于表示内存大小的数据类型,*qname = len;qname++; //第一个放长度strncpy(qname, token, len + 1);//最后的\0结束符也copyqname += len;//指针移到结尾// 更新token,后面2组0voice comtoken = strtok(NULL, delim); //0voice.com第一次截要hostname_dup,第二次就接着截,所以线程不安全,因为保存了上一次截取的会错乱}free(hostname_dup);}

5 DNS协议 UDP编程的实现

如何发射到DNS服务器(改不了),只能改client端。DNS类似广播,UDP:基于无连接,只管发不管收到吗

  1. AF_INET是一种常见的网络地址家族,它用于IPv4(Internet Protocol version 4)地址。在网络编程中,AF_INET常用于创建和处理IPv4套接字(socket)。它指示使用IPv4地址格式来进行通信。
  2. SOCK_DGRAM是一种套接字类型,用于在网络编程中进行数据报式(Datagram)通信。该类型的套接字提供了无连接、不可靠的数据传输服务。每个发送的数据包被视为一个独立的实体,可能会以任意顺序到达目标地址,并且也不能保证可靠交付或按顺序交付。UDP(User Datagram Protocol)就是使用SOCK_DGRAM套接字类型进行通信的协议之一。与TCP相比,UDP具有更低的开销和延迟,适用于对实时性要求较高但不需要可靠性和顺序性保证的应用场景。
  3. sendto(fd, request, length, 0, servaddr, addr_len);
  • fd:套接字文件描述符。
  • request:要发送的数据报内容。
  • length:要发送的数据报长度。
  • 0:标志位,用于指定额外的选项。在此处设置为0表示没有额外选项。
  • servaddr:目标地址信息,通常是一个结构体类型,包含目标IP地址和端口号等信息。
  • addr_len:目标地址信息结构体的大小。

UDP编程比较格式化,没啥为什么比较固定了

// 3 udp
int dns_client_commit(const char *domain){// AF_INET是一种常见的网络地址家族,它用于IPv4(Internet Protocol version 4)地址。在网络编程中,AF_INET常用于创建和处理IPv4套接字(socket)。它指示使用IPv4地址格式来进行通信。int sockfd = socket(AF_INET, SOCK_DGRAM, 0); //client发的forward fdif(sockfd < 0) return -1;// 结构体的定义这么多年基本这么写,比较固定struct sockaddr_in servaddr = {0};servaddr.sin_family = AF_INET;servaddr.sin_port = htons(DNS_SERVER_PORT);servaddr.sin_addr = inet_addr(DNS_SERVER_IP);int ret = connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));printf("connect : %d\n", ret);struct dns_header header = {0};dns_create_header(&header);struct dns_question = {0};dns_create_question(&question, domain);char request[1024] = {0};int length = dns_build_request(&header, &question, request);// requestint slen = sendto(fd, request, length, 0, servaddr, sizof(struct sockaddr));// recvfrom在这里阻塞,send和recieve在一起char response[1024] = {0};struct sockaddr_in addr;size_t addr_len = sizeof(struct sockaddr_in);int n = recvfrom(sockfd, response,sizeof(response), 0, (struct sockaddr*)&addr, (socklen_t*)&addr_len);printf("recvfrom: %d, %s\n", n , response);return n;
}

6 DNS build_requestion的实现

connect()类似连接前开路的,在tcp三次握手有用,udp没那么有用,可能在sendto前用

云里雾里的有点,太多库函数和数据类型 <sys/socket.h> <netinet/in.h> <unistd.h>不认识

#include <stdio.h>
#include <string.h>
#include <stdlib.h>#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <time.h>#define DNS_SERVER_PORT 53
#define DNS_SERVER_IP "114.114.114.114"//  协议包组织打包,已有header question合并到request
int dns_build_request(struct dns_header *header, struct dns_question *question, char *request, int rlen){if(header == NULL || question  == NULL || request == NULL) return -1;memset(request, 0, rlen);// header-->requestmemcpy(request, header, sizeof(struct dns_header)); //header复制到requestint offset = sizeof(struct dns_header);// question-> request    memcpy(request + offset,question->name, question->length); // request +offset这里offset += question->length;memcpy(request+offset, &question->qtype, sizeof(question->qtype));offset += sizeof(question->qtype);memcpy(request+offset, &question->qclass, sizeof(question->qclass));offset += sizeof(question->qclass);return offset;}int main(int argc, char* argv[]){if(argc <2) return -1;dns_client_commit(argv[1]);
}

7 调试

爆了一堆错,一个个改

gcc -o dns dns.c 
./dns www.0voice.com

我打印了connect : 0没有打印接收recvfrom的东西,说明连接服务器是成功了

记住一句话

按DNS协议发送数据,就会按DNS协议返回数据,所以根本没法数据

问题处在:dns_create_header

// header->questions = 1; //每次查一个DNS

header->questions = htons(1); // 要转成网络字节序

输出

recvfrom: 48, %ځ�
%ځ�www0voicecom�m+�y
5ffffffdaffffff81ffffff80010100003777777630766f6963653636f6d00101ffffffc0c01010016d042bffffff8b791b

8 DNS相应response解析

这里没敲,只看了操作和效果

is_pointer是否一帧,dns_parse_name和dns_parse_response就是翻译上面一坨乱码字符和16进制的形式

UDP好处,比TCP好处

  1. UDP传输快,对带宽无限制,比如迅雷下载 整个局域网就你下
  2. UDP响应速度快,游戏里服务器对客户端响应快!还有下载文件的时候

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/7946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息安全-古典密码学简介

目录 C. D. Shannon: 一、置换密码 二、单表代替密码 ① 加法密码 ② 乘法密码 ③密钥词组代替密码 三、多表代替密码 代数密码 四、古典密码的穷举分析 1、单表代替密码分析 五、古典密码的统计分析 1、密钥词组单表代替密码的统计分析 2、英语的统计规…

网络安全的未来:挑战、策略与创新

引言&#xff1a; 在数字化时代&#xff0c;网络安全已成为个人和企业不可忽视的议题。随着网络攻击的日益频繁和复杂化&#xff0c;如何有效保护数据和隐私成为了一个全球性的挑战。 一、网络安全的现状与挑战 网络安全面临的挑战多种多样&#xff0c;包括但不限于恶意软件、…

学习通下载PDF资源

今天突然发现&#xff0c;学习通的pdf资源居然是没有下载入口的&#xff0c;这整的我想cv一下我的作业都搞不了&#xff0c;于是我一怒之下&#xff0c;怒了一下。 可以看到学习通的pdf资源是内嵌在网页的&#xff0c;阅读起来很不方便&#xff0c;虽然他内置了阅读器&#xf…

SpringBoot中这样用ObjectMapper

每次new一个单例化个性化配置小结 你要说他有问题吧&#xff0c;确实能正常执行&#xff1b;可你要说没问题吧&#xff0c;在追求性能的同学眼里&#xff0c;这属实算是十恶不赦的代码了。 首先&#xff0c;让我们用JMH对这段代码做一个基准测试&#xff0c;让大家对其性能有个…

使用 Kubeadm 搭建个公网 k8s 集群(单控制平面集群)

前言 YY&#xff1a;国庆的时候趁着阿里云和腾讯云的轻量级服务器做促销一不小心剁了个手&#x1f60e;&#x1f622;&#xff0c;2 Cores&#xff0c;4G RAM 还是阔以的&#xff0c;既然买了&#xff0c;那不能不用呀&#x1f6a9;&#xff0c;之前一直想着搭建个 k8s 集群玩…

【Git】Git学习-14:VSCode中使用git

学习视频链接&#xff1a;【GeekHour】一小时Git教程_哔哩哔哩_bilibili​编辑https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 在vscode中打开文件 code . 自行修改内容&#xff0c;在源代码管理器中测试下

卷价格不如卷工艺降本增效狠抓模块规范化设计

俗话说&#xff0c;“卷价格不如卷工艺”&#xff0c;这意味着在追求成本控制和效率提升的过程中&#xff0c;蓝鹏的领导认为蓝鹏应该更注重工艺的优化和创新&#xff0c;而不仅仅是价格的竞争。而模块规范化设计正是实现这一目标的有效途径。 模块规范化设计可以提高生产效率…

小红书高级电商运营课,从0开始做小红书电商(18节课)

详情介绍 课程内容&#xff1a; 第1节课:学习流程以及后续实操流程注意事项,mp4 第2节课:小红书店铺类型解析以及开店细节.mp4 第3节课:小红书电商运营两种玩法之多品店铺解析,mp4 第4节课:小红书电商运营两种玩法之单品店铺解析,mp4 第5节课:选品课(多品类类目推荐).mp4 …

如何获得一个Oracle 23ai数据库(RPM安装)

准确的说&#xff0c;是Oracle 23ai Free Developer版&#xff0c;因为企业版目前只在云上&#xff08;OCI和Azure&#xff09;和ECC上提供。 方法包括3种&#xff0c;本文介绍第2种&#xff1a; Virtual ApplianceRPM安装Docker RPM安装支持Linux 8和Linux 9。由于官方的Vi…

Study--Oracle-02-单实例部署Oracle19C

一、CentOS 7 环境准备 1、软件准备 操作系统&#xff1a;CentOS 7 数据库版本: Oracle19C 2、操作系统环境配置 关闭selinux &#xff0c;编辑 /etc/selinux/config文件&#xff0c;设置SELINUX enforcing 为SELINUXdisabled [rootoracle ~]# grep SELINUX /etc/seli…

基于AbstractRoutingDataSource的mybatis动态多数据源切换

1.pom mybatis-starter版本只能选2开头的版本&#xff0c;选3开头的就报错 <!--druid连接池--> <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.3</version> …

0基础学汽车 丝滑炫酷摄影教学,手机剪映特效剪辑(66节也就是)

详情介绍 0基础学汽车丝滑炫酷摄影教学,手机剪映特效剪辑 课程内容:0基础学汽车 丝滑炫酷摄影教学,手机剪映特效剪辑(66节也就是) - 百创网-源码交易平台_网站源码_商城源码_小程序源码 01 AE课前基础知识(必看).mp4 02 怎样制作德关一样丝滑的作品第二种方法(苹果mac专…

【busybox记录】【shell指令】paste

目录 内容来源&#xff1a; 【GUN】【paste】指令介绍 【busybox】【paste】指令介绍 【linux】【paste】指令介绍 使用示例&#xff1a; 合并文件的行 - 默认输出&#xff08;默认是行合并&#xff09; 合并文件的行 - 一个文件占一行 合并文件的行 - 使用指定的间隔符…

5000A信号发生器使用方法

背景 gnss工作需要使用的5000A&#xff0c;所以做成文档&#xff0c;用于其他员工学习。 下载星历数据 https://cddis.nasa.gov/archive/gnss/data/daily/2024/brdc/ 修改daily中的年份&#xff0c;就可以获取相关截至时间的星历数据 brcd数据格式 第一行记录了卫星的PRN号&a…

yolo-world:”目标检测届大模型“

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

深度学习实战76-基于目标检测YOLOv5模型的迁移学习使用方法,YOLOv5的原理与结构

大家好,我是微学AI,今天给大家介绍一下深度学习实战76-基于目标检测YOLOv5模型的迁移学习使用方法,YOLOv5的原理与结构。YOLOv5(You Only Look Once version 5)是一种先进的目标检测算法,基于深度学习的单阶段目标检测模型。它的主要原理是通过一次前向传播就同时预测图像…

Redis是什么? 日常运维 Redis 需要注意什么 ? 怎么降低Redis 内存使用 节省内存?

你的项目或许已经使用 Redis 很长时间了&#xff0c;但在使用过程中&#xff0c;你可能还会或多或少地遇到以下问题&#xff1a; 我的 Redis 内存为什么增长这么快&#xff1f;为什么我的 Redis 操作延迟变大了&#xff1f;如何降低 Redis 故障发生的频率&#xff1f;日常运维…

大数据与会计专业主要学什么课程

大数据与会计专业是一个结合了传统会计知识与现代大数据技术的交叉学科&#xff0c;旨在培养既懂会计又熟悉大数据分析的复合型人才。该专业的学生将会学习以下主要课程内容&#xff1a; 会计基础课程&#xff1a;包括基础会计、财务会计、成本会计、管理会计等&#xff0c;这些…

有了这么多套件,为什么还需要APaaS

文/明道云创始人任向晖 在明道云的业务活动中&#xff0c;比较常见的一个问题是和套件应用的关系。一个有具体应用需求的客户为什么不从市场上购买现成的套件应用&#xff0c;而要选择APaaS来构建呢&#xff1f;反过来说似乎也成立&#xff0c;既然一个平台什么应用都能搭建&a…

使用双指针解决问题题集(二)

1. 有效三角形的个数 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 示例 2: 输入: nums [4,2,3,4] 输出: 4 题解&a…