day32
更新源
cd /etc/apt/
 sudo cp sources.list sources.list.save      将原镜像备份
 sudo vim sources.list                       将原镜像修改成阿里源/清华源,如所述
 阿里源
  
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
 deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
 deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
 deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
 deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
 deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
 deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
 deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
 deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
 deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
 清华源
  
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
 deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
 deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
 deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
 deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
 deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
  
 上述操作完毕后,保存退出,执行下列:
  
sudo apt-get update
1. wireshark使用
 1. 安装
     1)   wireshark的官方下载网站:www.wireshark.org/
     2)   Linux sudo apt install wireshark
     3)   启动sudo wireshark
       设置中文 Edit->Preferences->Appaerance->Language->Chinese
  
2. wireshark 抓包
 1.
 开始抓包
 开始界面

1.
  wireshark是捕获机器上的某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡。
 2.
 双击需要的网卡,开始抓包
  
 1.
 Wireshark 窗口介绍
 
 3. wireshark与对应的OSI七层模型
 
 服务器和客户端的代码不能都运行在ubuntu,因为wireshark抓的是流经真实网卡的数据包。
 若将服务器客户端都运行在ubuntu,数据直接经过虚拟网卡通信,而不会经过真实网卡。

2. 包头分析
 2.1 以太网头
 
 以太网中封装了源mac地址以及目的mac地址,还有ip类型,以太网又称之为mac头
0X0800 只接收发往本机的mac的ip类型的数据帧 
 0X0806 只接收发往本机的ARP类型的数据帧
 0x8035 只接受发往本机的RARP类型的数据帧
 0X0003  接收发往本机的MAC所有类型:ip,arp,rarp数据帧,接收从本机发出去的数据帧,
  混杂模式打开的情况下,会接收到非发往本地的MAC数据帧
  
 2.2 IP头
 
 
IP头中需要掌握用于拆包的部分:id flags fregment_offset
 两个IP地址:源IP与目的IP地址。
 TTL:time to live, 指定数据帧可以最多经过几个路由器。当数据帧被目标方接收后,TTL清除为0.
 Linux TTL:64   Winodws:TTL 128

  
 2.3 UDP头
 
 
 2.4 TCP头
 
 
Seq:序列号,占4个字节,用于给数据段进行编号的。所有非应答包的数据段,都有seq。
 Ack:应答号,用于应答非应答包(握手包,挥手包,数据包)。告诉对方下一次从这个seq编号发送数据包。
  
 SYN:握手包,连接的时候产生的包
 FIN:挥手包,断开连接产生的包
 PSH:数据包,传输数据时候产生的包
 ACK:应答包
  
 PSH         Ack = Seq+len;
 SYN FIN    Ack = Seq+1;
  
 2.5 三次握手
 
 
  
 三次握手的发起方,肯定是客户端

1.
 第一次握手:客户端发送SYN包(SYN=1, seq=0)给服务器,并进入SYN_SENT状态,等待服务器返回确认包。
 2.
 第二次握手:服务器接收到SYN包,确认客户端的SYN,发送ACK包(ACK=1 , ack=1),同时发送一个SYN包(SYN=1, seq=0),并进入SYN_RCVD状态。
 3.
 第三次握手:客户端接收到服务器的SYN包,以及ACK包,进入establish状态,同时向服务器发送ACK包(ACK=1, ack=1)。此时三次握手包发送完毕,服务器也进入establish状态
  
 2.6 四次挥手
 四次挥手的发起方可能是服务器,也可能是客户端

  
 1.
 第一次挥手,主动关闭方发送一个FIN包(FIN=1, seq = u)给被动方,进入FIN_WAIT_1状态;
 2.
 第二次挥手:被动方接收到FIN包,给主动方发送一个ACK包(ACK=1, ack=u+1);并进入CLOKSE_WAIT状态。主动方接受到ACK包后,进入FIN_WAIT_2状态。如果有数据没有发送完毕,则继续发送,直到发送完毕为止;
 3.
 第三次挥手:被动方发送一个FIN包(FIN=1, seq=w),进入LAST_ACK状态.
 4.
 第四次挥手:主动关闭方收到FIN包,回复一个ACK包(ACK=1, ack=w+1)。被动关闭方收到主动关闭方的ACK后关闭连接。
三、何为HTTP
 1>    Hyper Text Transfer Protocol(超文本传输协议),用于万维网(WWW:world wide web)进行超文本(html文档)信息的传送协议
 2>    该协议属于应用层协议,传输层是使用TCP实现的
 3>    http是基于BS模型,即浏览器服务器模型,主要完成的是客户端请求端和服务器相应端
 4>    实现模型
四、超文本文档HTML
 1>    Hypertext Markup Language     超文本标记语言,属于标签式语言,能够被浏览器所识别
 2>    案例文档
  
<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>欢迎来到我的主页</title>
 </head>
     
 <body align="center">
     <h1 >欢迎欢迎来的我的主页</h1>
     姓名:<input type="text"> 
     年龄:<input type="password"><br><br>
     留言 <textarea name="" id=""></textarea><br>
     <input type="button" value="提交">
     <input type="button" value="取消">
 </body>
  
  
 </html>
   #include <string.h>
  
        char *strtok(char *str, const char *delim);
     功能:通过指定的字符串,将前面的字符串进行分割
     参数1:要被分割的字符串
     参数2:分隔符
     返回值:成功返回分割出来的第一个字符串的起始地址,后续如果想要后面的字符串,参数1填NULL即可
     
     
            #include <unistd.h>
  
        int access(const char *pathname, int mode);
         功能:判断给定的文件是否具有某个功能
         参数1:要判断的文件
         参数2:要判断的权限
                 R_OK:读权限
                 W_OK:写权限
                 X_OK:可执行权限
                 F_OK:是否存在
         返回值:如果要判断的权限全都存在,则返回0,否则返回-1并置位错误码 
五、客户端请求
 5.1    请求首部
 
 1>    任何一个http请求都由三部分组成:请求首部、请求主体、请求数据
 2>    对于客户端请求协议包而言,一般没有请求数据,具体格式如下
3>    方法:
  
GET:表示发送请求数据(常用)
 POST:应答数据(常用)
 DELETE:删除文档
 PUT:上传文件
 4>    需要对发来的请求进行解析,需要获取请求头部部分的方法以及url以便于相应
  
#include<myhead.h>
 #define SER_PORT 80          //服务器端口号
 #define SER_IP "192.168.0.133"    //服务器ip地址
  
 int get_one_line(int newfd, char msg[])
 {
     char buf = '\0';         //读取消息
     int i = 0;             //填充数组
  
     while(1)
     {
         int res = recv(newfd, &buf, 1, 0);
         if(res == 0)
         {
             break;
         }else if (res== 1)
         {
             if(buf=='\n')
             {
                 break;
             }else
             {
                 msg[i] = buf;
                 i++;                //填充下一个
             }
         }else
         {
             perror("recv error");
             return -1;
         }
     }
  
     msg[i] = '\0';
  
 }
  
  
  
 int main(int argc, const char *argv[])
 {
     //1、创建套接字
     int sfd = socket(AF_INET, SOCK_STREAM, 0);
     //参数1:表示ipv4的网络通信
     //参数2:表示使用的是TCP通信方式
     //参数3:表示默认使用一个协议
     if(sfd == -1)
     {
         perror("socket error");
         return -1;
     }
     printf("socket success, sfd = %d\n", sfd);        //3
  
     //将端口号快速重用
     int reuse = 1;
     if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1)
     {
         perror("setsockopt error");
         return -1;
     }
     printf("端口号快速重用成功\n");
  
     //2、为套接字绑定ip地址和端口号
     //2.1 填充地址信息结构体
     struct sockaddr_in sin;       
     sin.sin_family = AF_INET;       //通信域
     sin.sin_port = htons(SER_PORT);    //端口号
     sin.sin_addr.s_addr = inet_addr(SER_IP);    //ip地址
  
     //2.2 绑定工作
     if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
     {
         perror("bind error");
         return -1;
     }
     printf("bind success\n");
  
     //3、将套接字设置成被动监听状态
     if(listen(sfd, 128)==-1)
     {
         perror("listen error");
         return -1;
     }
     printf("listen success\n");
  
     //4、阻塞等待客户端的连接请求
     //4.1 定义变量用于接收客户端的信息
     struct sockaddr_in cin;          //用于接收地址信息
     socklen_t addrlen = sizeof(cin);  //用于接收长度
  
     
     while(1)
     {
  
         //4.2 接收连接
         int newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen) ;
         if(newfd == -1)
         {
             perror("accept error");
             return -1;
         }
         printf("[%s:%d]: 已成功连接一个客户端\n", \
                 inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
  
         //5、数据收发
         char buf[128] = "";
  
         //接收请求头部
         get_one_line(newfd, buf);           //获取到请求行
         //printf("buf = %s\n", buf);
         
         //获取请求请求方法
         char mathod[5] = "";
         strcpy(mathod, strtok(buf, " "));     //将分割下的第一个串放入到mathod中
         char url[50] = "";
         strcpy(url, strtok(NULL, " "));
         //printf("mathod = %s, url = %s\n", mathod, url);
         //判断是否为GET方法
         if(strcmp(mathod, "GET") == 0)
         {
             //说明要进行get请求,完成响应工作
             //重组url
             snprintf(url, "./htmls%s", url);
  
             //判断要访问的文件是否存在
             if(access(url, F_OK) ==-1)
             {
                 //返回一个响应为NOT FOND的网页
                 //do_notfond(newfd);
                 return -1;
             }else
             {
                 //给出响应
                 //do_response(newfd);
  
             }
  
         }else
         {
             //非法请求
             //do_illigal(newfd);   
         }
  
     }
  
     //6、关闭监听
     close(sfd);
  
     return 0;
 }
5.2 响应首部
 1>    响应首部也是由三部分组成,分别是响应头、响应主体、响应数据
 2>    对于响应首部而言,必须由响应数据
3>    常见的响应代号
 http的响应代号:1XX  (信息状态错误) 2XX(成功) 、3XX(重定向状态码)、4XX(客户端错误)、5XX(服务器出错)
  
100:表示服务器已经结束请求头,并且客户的响应发送数据请求主体出错
 200:OK
 201:表示请求已经成功,服务器返回了主体部分
 202:表示请求已经成功,并且服务器上创建了新的资源
 404:NOT FOUND
 500:服务器内核出错
 503:服务器网关出错

相关文章:
day32
更新源 cd /etc/apt/ sudo cp sources.list sources.list.save 将原镜像备份 sudo vim sources.list 将原镜像修改成阿里源/清华源,如所述 阿里源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiver…...
【clickhouse】 使用 SQLAlchemy 连接 ClickHouse 数据库的完整指南
我听见有人猜 你是敌人潜伏的内线 和你相知多年 我确信对你的了解 你舍命救我画面 一一在眼前浮现 司空见惯了鲜血 你忘记你本是娇娆的红颜 感觉你我彼此都那么依恋 🎵 许嵩《内线》 ClickHouse 是一款非常高效的开源列式数据库,因…...
按键收集单击,双击和长按
按键收集单击,双击和长按 引言 在我们生活中, 按键是必不可少的, 不同的电器, 有不同的按键, 但是按键总有不够用的时候, 那么给与一个按键赋予不同的功能,就必不可少了. 一个按键可以通过按下的时间长短和频次, 来定义其类型。 一次按键收集, 都是在一个按键收集周…...
进程的异常终止
进程的异常终止 进程收到了某些信号,他杀 进程自己调用abort函数,产生了SIGABRT(6)信号,自杀 进程的最后一个线程收到了"取消"操作,并且做出响应 如果进程是异常结束的,atexit\on_exit它们事先注册的遗言…...
并发编程 | Future是如何优化程序性能
在初识Future一文中介绍了Future的核心方法。本文中接着介绍如何用Future优化我们的程序性能。 在此之前,有必要介绍Future接口的一个实现类FutureTask。 FutureTask介绍 FutureTask继承结构 首先我们看一下FutureTask的继承结构: public class Futur…...
Oracle笔记
一、 如何解决 sqlplus 无法使用退格键和方向键 .bashrc 中添加如下内容,解决 退格键 stty erase ^h 安装 rlwap 后,执行如下命令可解决 方向键 rlwap sqlplus 二、 都有哪些备份数据到工具 三、 谈谈 你对 oracle 中实例和数据库的理解 数据库是一…...
LVS+Keepalived 双机热备
LVSKeepalived 双机热备 Keepalived案例分析Keepalived工具介绍Keepalived工具介绍一、功能特点 一、理解Keepalived实现原理实验报告资源列表一、安装keepalived以及ipvsadm Keepalived案例分析 企业应用中,单台服务器承担应用存在单点故障的危险单点故障一旦发生…...
Web Image scr图片从后端API获取基本实现
因系统开发中需求,会有页面显示图片直接从后端获取后显示,代码如下: 后端: /*** 获取图片流* param response* param fileName*/RequestMapping(value"getImgStream",method RequestMethod.GET)public void getImgStr…...
2024音频剪辑指南:探索四大高效工具!
音频剪辑不仅仅是技术活,更是一种艺术创作,它能够让声音更加生动、更具感染力。今天,我们就来探索几款优秀的音频剪辑工具。 福昕音频剪辑 链接:www.pdf365.cn/foxit-clip/ 福昕音频剪辑是一款界面简洁、操作直观的音频编辑软件…...
“CSS”第一步——WEB开发系列13
CSS (Cascading Style Sheets,层叠样式表),是一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语言,CSS 文件扩展名为 .css。 一、什么是 CSS&a…...
IEEE802网络协议和标准
IEEE802网络协议和标准 802委员会IEEE 802介绍现有标准 IEEE 802.3介绍物理媒介类型MAC子层与LLC子层主要内容通讯标准POE供电标准802.3af、802.3at、802.3btIEEE802.3af的工作过程:IEEE802.3af主要供电参数:IEEE802.3af的分级参数:为什么会有…...
vulnhub靶机 DC-9(渗透测试详解)
一、靶机信息收集 1、靶机下载 https://download.vulnhub.com/dc/DC-9.zip 2、靶机IP扫描 3、探测靶机主机、端口、服务版本信息 4、靶机目录扫描 二、web渗透测试 1、访问靶机IP 查看页面功能点,发现一个搜索框和登录框 2、测试一下是否存在sql注入 查看当前数…...
javaweb的新能源充电系统pf
TOC springboot339javaweb的新能源充电系统pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域…...
如何在桌面同时展示多个窗口
一、实现2分屏显示 win箭头 二、实现3分屏显示 1. 在实现2分屏显示的基础上,再次点击箭头图标,这次选择屏幕的上方或下方。 2. 点击后,第三个窗口将会出现在你选择的区域。现在,你可以在三个窗口之间自由切换,提高工…...
The Sandbox 游戏制作教程(第 5 部分):创建基于分类的系统
欢迎回到我们的系列,我们将记录 The Sandbox Game Maker 的 “On-Equip”(装备)功能的多种用途。 如果你刚加入 The Sandbox,装备功能是 “可收集组件”(Collectable Component)中的一个多功能工具&#x…...
HTML浏览器缓存(Browser Cache)
介绍: 浏览器缓存是Web缓存中最直接、最常见的一种形式。当浏览器首次请求某个资源时,如果服务器响应中包含了缓存控制指令(如Cache-Control、Expires等),浏览器就会将这些资源存储在本地缓存中。后续请求相同资源时&a…...
短剧APP系统,推动短剧市场发展
近年来,短剧作为一直火爆的新兴行业,凭借着剧情进奏、爽、时长短等优势,深受大众欢迎,成为了大众碎片化时间的解压神器。 目前,随着短剧市场的快速发展,各个类型的短剧层出不穷,也推动了短剧AP…...
嵌入式 | 嵌入式 Linux 系统使用摄像头
点击上方"蓝字"关注我们 01、引言 >>> 在嵌入式 Linux 系统使用摄像头 俗话说“眼见为实”,这或许是为什么近年来摄像头在嵌入式系统上快速增长的原因。它们被用于不同的场景,如: 远程监控:典型的例子是闭路电视,监控人员在监视环境(或许你所在的大楼…...
C 开源库之cJSON
cJSON简介 CJSON库是一个用于解析和生成JSON数据的C语言库。 它提供了一组函数,使得在C语言中操作JSON数据变得简单而高效。 您可以使用CJSON库来解析从服务器返回的JSON数据,或者将C语言数据结构转换为JSON格式以进行传输。 cJSON 使用 官网地址&…...
ROW_NUMBER(), RANK(), DENSE_RANK() SQL排序函数图文详解
ROW_NUMBER(), RANK(), DENSE_RANK() ROW_NUMBER(): 为结果集中的每一行分配唯一的连续编号。即使有重复的值,ROW_NUMBER() 也会为它们分配不同的序号。 SELECT column_name, ROW_NUMBER() OVER (ORDER BY column_name) AS row_num FROM table_name;2. RANK(): 对结…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
