LINUX 入门 6

news2024/11/25 9:48:24

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); //变成A
	question->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){
        // 第一组www
        size_t len = strlen(token);//取这段长度,size_t: 是一种用于表示内存大小的数据类型,
        *qname = len;
        qname++; //第一个放长度

        strncpy(qname, token, len + 1);//最后的\0结束符也copy
        qname += len;//指针移到结尾

        // 更新token,后面2组0voice com
        token = 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 fd

    if(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);

    // request
    int 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-->request
    memcpy(request, header, sizeof(struct dns_header)); //header复制到request
    int 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.coloradmin.cn/o/1651377.html

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

相关文章

python网络爬虫学习——编写一个网络爬虫

参考资料&#xff1a;用Python写网络爬虫&#xff08;第2版&#xff09; 1、编写一个函数 &#xff08;1&#xff09;用于下载网页&#xff0c;且当下载网页发生错误时能及时报错。 # 导入库 import urllib.request from urllib.error import URLError,HTTPError,ContentTooS…

Shell编程规范和变量

一.Shell脚本概述 Shell脚本的概念 将要执行的命令按顺序保存到一个文本文件给该文件可执行权限可结合各种Shell控制语句以完成更复杂的操作 Shell脚本应用场景 重复性操作交互性任务批量事务处理服务运行状态监控定时任务执行 Shell的作用 1&#xff09;介于系统内核与用…

《Fundamentals of Power Electronics》——隔离型CUK转换器、

以下是隔离型CUK转换器的相关知识点&#xff1a; Cuk电路的隔离型版本获得方式不同。基础非隔离型Cuk电路如下图所示。 将上图中电容C1分成两个串联的电容C1a和C1b&#xff0c;得到结果如下图所示。 在两个电容之间插入一个变压器&#xff0c;得到如下图所示电路。 变压器极性…

网络基础-默认网关

默认网关&#xff0c;又称缺省网关&#xff0c;缺省路由器&#xff1b;它是指在一个连接两个不同网络的设备&#xff0c;为网关设备&#xff1b;当主机需要发送数据包到另一个子网或者另一个网络时&#xff0c;它会首先检查目标地址是否在本地子网内&#xff1b;如果不在本地子…

Flask gevent启动报错UnicodeDecodeError

文章目录 环境代码报错Track解决思路 环境 acondana 24.1.2python 3.7.13 32bitflask 2.2.3gevent 21.8.0 代码 port 7236 logging.basicConfig(levellogging.INFO, # 控制台打印的日志级别filename./logs/app.log, # 将日志写入log_new.log文件中filemodea, # 模式&…

nodejs里面的 http 模块介绍和使用

Node.js的HTTP模块是一个核心模块&#xff0c;它提供了很多功能来创建HTTP服务器和发送HTTP请求。 http.Server是一个基于事件的http服务器&#xff0c;内部是由c实现的&#xff0c;接口是由JavaScript封装。 http.request是一个http客户端工具。 用户向服务器发送数据。 创…

Cordova 12 Android 不支持 http 原因探索

最近在升级 Cordova 到最新版本&#xff0c;升级完成后发现无法请求网络&#xff0c;研究了两次最终发现解决方案。 发现控制台中有日志输出&#xff0c;提示当前是 https &#xff0c;无法直接访问 http。 [INFO:CONSOLE(225)] "Mixed Content: The page at https://lo…

怎么设置电脑开机后自动启动某个程序 ?(电脑如何设置自动运行?)

​在现今的信息化社会&#xff0c;电脑已经成为我们生活和工作中不可或缺的一部分。而一些特定的程序&#xff0c;如杀毒软件、系统优化工具等&#xff0c;我们可能希望它们在每次开机后都能自动启动&#xff0c;以便更好地保护和管理我们的电脑。那么&#xff0c;如何设置电脑…

白色或类白色的粉末/固体,DOTA-Ala-Ala-Tyr-COOH,是一种具有特定氨基酸序列的多肽,具有良好的稳定性和溶解性

一、试剂信息 英文名&#xff1a;DOTA-Ala-Ala-Tyr-COOH&#xff0c;DOTA-AAY-OHCAS号&#xff1a;N/A分子式&#xff1a;C31H47N7O12分子量&#xff1a;709.74结构式&#xff1a; 纯度标准&#xff1a;≥95%包装规格&#xff1a;1g&#xff0c;5g&#xff0c;10g&#xff08…

什么是HTTP/2?

HTTP/2&#xff08;原名HTTP 2.0&#xff09;即超文本传输协议第二版&#xff0c;使用于万维网。HTTP/2主要基于SPDY协议&#xff0c;通过对HTTP头字段进行数据压缩、对数据传输采用多路复用和增加服务端推送等举措&#xff0c;来减少网络延迟&#xff0c;提高客户端的页面加载…

探索希尔排序算法:优雅而高效的增量排序

在计算机科学领域&#xff0c;排序算法是一项至关重要的技术&#xff0c;在各种应用场景中都扮演着重要角色。而希尔排序算法作为一种增量排序方法&#xff0c;在实际应用中展现了其优雅而高效的特性。本文将深入探讨希尔排序算法的原理、实现细节以及优化方法&#xff0c;带您…

free5gc+ueransim操作

启动free5gc容器 cd ~/free5gc-compose docker-compose up -d 记录虚拟网卡地址&#xff0c;eth0 ifconfig 查看并记录amf网元的ip地址 sudo docker inspect amf "IPAddress"那一行&#xff0c;后面记录的即是amf的ip地址 记录上述两个ip地址&#xff0c;完成UER…

C#高级编程笔记-泛型

本章的主要内容如下&#xff1a; ● 泛型概述 ● 创建泛型类 ● 泛型类的特性 ● 泛型接口 ● 泛型结构 ● 泛型方法 目录 1.1 泛型概述 1.1.1 性能 1.1.2 类型安全 1.1.3 二进制代码的重用 1.1.4 代码的扩展 1.1.5 命名…

2024高校网络安全管理运维赛wp

文章目录 misc签到钓鱼邮件识别easyshellSecretDBGatewayzipApachef for r webphpsqlMessy Mongo misc 签到 钓鱼邮件识别 两部分解base64&#xff0c;各一个flag 后面没有什么地方有有用信息了&#xff0c;根据题目钓鱼邮件&#xff0c;可能第三段flag就跟DMARC、DKIM 和 SP…

LED显示屏的维护与使用指南

LED显示屏作为一种先进的显示技术&#xff0c;广泛应用于广告、信息显示、舞台背景等领域。然而&#xff0c;为了确保显示屏的长期稳定运行和良好的显示效果&#xff0c;对其进行正确的维护和使用是非常必要的。以下是一些专业的维护与使用建议&#xff1a; 维护建议&#xff1…

个人IP打造孵化运营产业链商业计划书

【干货资料持续更新&#xff0c;以防走丢】 个人IP打造孵化运营产业链商业计划书 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT共90页&#xff08;完整资料包含以下内容&#xff09; 目录 个人IP运营方案&#xff1a; 1. 个人IP定位与构建 1.1 人格画像构…

Chromium编译指南2024 Windows11篇-Git工具准备(四)

前言 在《Chromium编译指南2024&#xff08;三&#xff09;》中&#xff0c;我们已经完成了对 Chromium 编译环境的其他相关环境变量的设置&#xff0c; 接下来&#xff0c;我们将进一步探讨如何初始化配置 Git&#xff0c;为获取 Chromium 源代码做好准备。 1. 配置Git 用户…

计算有效声压

计算有效声压 clear all; %%----------------------------------------------读取文件------------------------------------------ % 从wav文件读入语音数据&#xff0c;该语音采样率16k&#xff0c;故信号最高频率8k。 [x,fs]audioread(C2_3_y.wav); % 取x的一个通道 xx(:,1)…

校园论坛系统基于PHP的校园管理系统毕设校园好感度系统 校园文化建设系统APP小程序H5前后端源码交付支持二开,一次付款,终生使用

APP小程序H5前后端源码交付&#xff0c;支持二开&#xff0c;一次付款&#xff0c;终身使用&#xff0c;免费更新系统本身源码。 校园社交网络系统开发是一个复杂且综合性的项目&#xff0c;旨在为学生、教师和管理人员提供一个互动、分享和交流的平台。以下是一个关于校园社交…

Windows Server 2012R2定时计划任务设置

1.打开Windows定时计划任务 2.点击右侧“创建任务” 3.在弹出的“创建任务”对话框中,输入任务名称,设定运行任务时,使用的用户账户等信息;点击“触发器”选项 4.在“触发器”选项中,点击“新建”按钮,设置触发条件;根据实际情况,设置“开始任务”、设置“起止”时间…