当前位置: 首页 > news >正文

RTSP网络视频协议

一.RTSP网络视频协议介绍

RTSP是类似HTTP的应用层协议,一个典型的流媒体框架网络体系可参考下图,其中rtsp主要用于控制命令,rtcp主要用于视频质量的反馈,rtp用于视频、音频流从传输。

1、RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IETF RFC标准。该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。
2、Real-time Transport Protocol或简写RTP,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的。RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。它是创建在UDP协议上的。
3、Real-time Transport Control Protocol或RTP Control Protocol或简写RTCP)是实时传输协议(RTP)的一个姐妹协议。RTCP由RFC 3550定义(取代作废的RFC 1889)。RTP 使用一个 偶数 UDP port ;而RTCP 则使用 RTP 的下一个 port,也就是一个奇数 port。RTCP与RTP联合工作,RTP实施实际数据的传输,RTCP则负责将控制包送至会话中的每个接收者。其主要功能是就RTP正在提供的服务质量做出反馈。


==========================================================

二.RTSP客户端的请求格式

rtsp报文由三部分组成,即开始行、首部行和实体主体。在请求报文中,开始行就是请求行。rtsp请求报文的结构如下图所示。

rtsp响应报文的结构如下图所示

格式表示如下:

method url vesion\r\n
CSeq: x\r\n
xxx\r\n
...
\r\n

格式解析如下:

method:方法,表明这次请求的方法,rtsp定义了很多方法,后面介绍
url:格式一般为 :rtsp://ip:port/session,

ip: 代表主机ip,

port : 代表端口号,如果不写那么就是默认端口,rtsp的默认端口为554,

session:代表明请求哪一个会话,
version: 表示rtsp的版本,现在为RTSP/1.0,
CSeq:序列号,每个RTSP请求和响应都对应一个序列号,序列号是递增的。
 

三.RTSP的消息格式


RTSP的消息有两大类,一是请求消息(request),一是回应消息(response),两种消息的格式不同。

第一步:查询服务器端可用方法

C->S OPTION request //询问S有哪些方法可用
S->C OPTION response //S回应信息的public头字段中包括提供的所有可用方法

第二步:得到媒体描述信息

C->S DESCRIBE request //要求得到S提供的媒体描述信息
S->C DESCRIBE response //S回应媒体描述信息,一般是sdp信息

第三步:建立RTSP会话

C->S SETUP request //通过Transport头字段列出可接受的传输选项,请求S建立会话
S->C SETUP response //S建立会话,通过Transport头字段返回选择的具体转输选项,并返回建立的Session ID;

第四步:请求开始传送数据

C->S PLAY request //C请求S开始发送数据
S->C PLAY response //S回应该请求的信息

四.RTSP抓包报文请求

如下图抓包报文所示,一般RTSP协议包含这四个通讯过程。


==========================================================

1.OPTION

//获取服务器提供的可用方法
客户端->>服务器:OPTION
服务器->>客户端: 200 OK (Method)

==========================================================

2.DESCRIBE

//得到会话描述信息
客户端->>服务器:DESCRIBE
服务器->>客户端: 200 OK (SDP)

用于请求URL指定对象的描述信息,通常描述信息使用SDP(Session Description Protocol)格式。

C->S  DESCRIBE rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0CSeq: 2S->C  RTSP/1.0 200 OKCSeq: 2Content-Type: application/sdpContent-Length: 210 m=video 0 RTP/AVP 96a=control:streamid=0a=range:npt=0-7.741000a=length:npt=7.741000a=rtpmap:96 MP4V-ES/5544a=mimetype:string;"video/MP4V-ES"a=AvgBitRate:integer;304018a=StreamName:string;"hinted video track"m=audio 0 RTP/AVP 97a=control:streamid=1a=range:npt=0-7.712000a=length:npt=7.712000a=rtpmap:97 mpeg4-generic/32000/2a=mimetype:string;"audio/mpeg4-generic"a=AvgBitRate:integer;65790a=StreamName:string;"hinted audio track"

SDP协议格式
SDP(Session Description Protocol)是一个用来描述多媒体会话的应用层控制协议,是一个基于文本的协议,用于会话建立过程中的媒体类型和编码方案的协商等。SDP描述由许多文本行组成,文本行的格式为<类型>=<值><类型>是一个字母,<值>是结构化的文本串,其格式依<类型>而定。

<type>=<value>[CRLF]

sdp的格式:

v=<version> (协议版本)
o=<username> <session id> <version> <network type> <address type> <address> (所有者/创建者和会话标识符)
s=<session name>    (会话名称)
i=<session description> (会话信息)
u=<URI> (URI 描述)
e=<email address> (Email 地址)
p=<phone number> (电话号码)
c=<network type> <address type> <connection address> (连接信息)
b=<modifier>:<bandwidth-value> (带宽信息)
t=<start time> <stop time> (会话活动时间)
r=<repeat interval> <active duration> <list of offsets from start-time>(0或多次重复次数)
z=<adjustment time> <offset> <adjustment time> <offset> ....
k=<method>
k=<method>:<encryption key> (加密密钥)
a=<attribute> (0 个或多个会话属性行)
a=<attribute>:<value>
m=<media> <port> <transport> <fmt list> (媒体名称和传输地址)

=========================================================

3.SETUP

//客户端请求建立会话,并确立传输模式
客户端->>服务器:SETUP
服务器->>客户端: 200 OK

4.PLAY

//客户端发起播放请求
客户端->>服务器:PLAY
服务器->>客户端: (RTP包 RTCP包)

windows端代码实现:

//
// Created by bxc on 2022/11/30.
//#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <windows.h>
#include <string>
#pragma comment(lib, "ws2_32.lib")
#include <stdint.h>#pragma warning( disable : 4996 )#define SERVER_PORT      8554#define SERVER_RTP_PORT  55532
#define SERVER_RTCP_PORT 55533static int createTcpSocket()
{int sockfd;int on = 1;sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0)return -1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on));return sockfd;
}static int bindSocketAddr(int sockfd, const char* ip, int port)
{struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr(ip);if (bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr)) < 0)return -1;return 0;
}static int acceptClient(int sockfd, char* ip, int* port)
{int clientfd;socklen_t len = 0;struct sockaddr_in addr;memset(&addr, 0, sizeof(addr));len = sizeof(addr);clientfd = accept(sockfd, (struct sockaddr*)&addr, &len);if (clientfd < 0)return -1;strcpy(ip, inet_ntoa(addr.sin_addr));*port = ntohs(addr.sin_port);return clientfd;
}static int handleCmd_OPTIONS(char* result, int cseq)
{sprintf(result, "RTSP/1.0 200 OK\r\n""CSeq: %d\r\n""Public: OPTIONS, DESCRIBE, SETUP, PLAY\r\n""\r\n",cseq);return 0;
}static int handleCmd_DESCRIBE(char* result, int cseq, char* url)
{char sdp[500];char localIp[100];sscanf(url, "rtsp://%[^:]:", localIp);sprintf(sdp, "v=0\r\n""o=- 9%ld 1 IN IP4 %s\r\n""t=0 0\r\n""a=control:*\r\n""m=video 0 RTP/AVP 96\r\n""a=rtpmap:96 H264/90000\r\n""a=control:track0\r\n",time(NULL), localIp);sprintf(result, "RTSP/1.0 200 OK\r\nCSeq: %d\r\n""Content-Base: %s\r\n""Content-type: application/sdp\r\n""Content-length: %zu\r\n\r\n""%s",cseq,url,strlen(sdp),sdp);return 0;
}static int handleCmd_SETUP(char* result, int cseq, int clientRtpPort)
{sprintf(result, "RTSP/1.0 200 OK\r\n""CSeq: %d\r\n""Transport: RTP/AVP;unicast;client_port=%d-%d;server_port=%d-%d\r\n""Session: 66334873\r\n""\r\n",cseq,clientRtpPort,clientRtpPort + 1,SERVER_RTP_PORT,SERVER_RTCP_PORT);return 0;
}static int handleCmd_PLAY(char* result, int cseq)
{sprintf(result, "RTSP/1.0 200 OK\r\n""CSeq: %d\r\n""Range: npt=0.000-\r\n""Session: 66334873; timeout=10\r\n\r\n",cseq);return 0;
}static void doClient(int clientSockfd, const char* clientIP, int clientPort) {char method[40];char url[100];char version[40];int CSeq;int clientRtpPort, clientRtcpPort;char* rBuf = (char*)malloc(10000);char* sBuf = (char*)malloc(10000);while (true) {int recvLen;recvLen = recv(clientSockfd, rBuf, 2000, 0);if (recvLen <= 0) {break;}rBuf[recvLen] = '\0';std::string recvStr = rBuf;printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");printf("%s rBuf = %s \n",__FUNCTION__,rBuf);const char* sep = "\n";char* line = strtok(rBuf, sep);while (line) {if (strstr(line, "OPTIONS") ||strstr(line, "DESCRIBE") ||strstr(line, "SETUP") ||strstr(line, "PLAY")) {if (sscanf(line, "%s %s %s\r\n", method, url, version) != 3) {// error}}else if (strstr(line, "CSeq")) {if (sscanf(line, "CSeq: %d\r\n", &CSeq) != 1) {// error}}else if (!strncmp(line, "Transport:", strlen("Transport:"))) {// Transport: RTP/AVP/UDP;unicast;client_port=13358-13359// Transport: RTP/AVP;unicast;client_port=13358-13359if (sscanf(line, "Transport: RTP/AVP/UDP;unicast;client_port=%d-%d\r\n",&clientRtpPort, &clientRtcpPort) != 2) {// errorprintf("parse Transport error \n");}}line = strtok(NULL, sep);}if (!strcmp(method, "OPTIONS")) {if (handleCmd_OPTIONS(sBuf, CSeq)){printf("failed to handle options\n");break;}}else if (!strcmp(method, "DESCRIBE")) {if (handleCmd_DESCRIBE(sBuf, CSeq, url)){printf("failed to handle describe\n");break;}}else if (!strcmp(method, "SETUP")) {if (handleCmd_SETUP(sBuf, CSeq, clientRtpPort)){printf("failed to handle setup\n");break;}}else if (!strcmp(method, "PLAY")) {if (handleCmd_PLAY(sBuf, CSeq)){printf("failed to handle play\n");break;}}else {printf("未定义的method = %s \n", method);break;}printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");printf("%s sBuf = %s \n", __FUNCTION__, sBuf);send(clientSockfd, sBuf, strlen(sBuf), 0);//开始播放,发送RTP包if (!strcmp(method, "PLAY")) {printf("start play\n");printf("client ip:%s\n", clientIP);printf("client port:%d\n", clientRtpPort);while (true) {Sleep(40);//usleep(40000);//1000/25 * 1000}break;}memset(method,0,sizeof(method)/sizeof(char));memset(url,0,sizeof(url)/sizeof(char));CSeq = 0;}closesocket(clientSockfd);free(rBuf);free(sBuf);}int main(int argc, char* argv[])
{// 启动windows socket startWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){printf("PC Server Socket Start Up Error \n");return -1;}// 启动windows socket endint serverSockfd;serverSockfd = createTcpSocket();if (serverSockfd < 0){WSACleanup();printf("failed to create tcp socket\n");return -1;}if (bindSocketAddr(serverSockfd, "0.0.0.0", SERVER_PORT) < 0){printf("failed to bind addr\n");return -1;}if (listen(serverSockfd, 10) < 0){printf("failed to listen\n");return -1;}printf("%s rtsp://127.0.0.1:%d\n", __FILE__, SERVER_PORT);while (true) {int clientSockfd;char clientIp[40];int clientPort;clientSockfd = acceptClient(serverSockfd, clientIp, &clientPort);if (clientSockfd < 0){printf("failed to accept client\n");return -1;}printf("accept client;client ip:%s,client port:%d\n", clientIp, clientPort);doClient(clientSockfd, clientIp, clientPort);}closesocket(serverSockfd);return 0;
}

相关文章:

RTSP网络视频协议

一.RTSP网络视频协议介绍 RTSP是类似HTTP的应用层协议&#xff0c;一个典型的流媒体框架网络体系可参考下图&#xff0c;其中rtsp主要用于控制命令&#xff0c;rtcp主要用于视频质量的反馈&#xff0c;rtp用于视频、音频流从传输。 1、RTSP&#xff08;Real Time Streaming P…...

Python 网络数据采集(四):Selenium 自动化

Python 网络数据采集&#xff08;四&#xff09;&#xff1a;Selenium 自动化 前言一、背景知识Selenium 4Selenium WebDriver 二、Selenium WebDriver 的安装与配置2.1 下载 Chrome 浏览器的驱动程序2.2 配置环境变量三、Python 安装 Selenium四、页面元素定位4.1 选择浏览器开…...

实现秒杀功能设计

页面 登录页面 登录成功后&#xff0c;跳转商品列表 商品列表页 加载商品信息 商品详情页 根据商品id查出商品信息返回VO&#xff08;包括rmiaoshaStatus、emainSeconds&#xff09;前端根据数据展示秒杀按钮&#xff0c;点击开始秒杀 订单详情页 秒杀页面设置 后端返回秒杀…...

每天刷两道题——第十四天

1.1矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用原地算法。 输入&#xff1a;matrix [[0,1,2,0],[3,4,5,2],[1,3,1,5]] 输出&#xff1a;[[0,0,0,0],[0,4,5,0],[0,3,1,0]] 原地算法&#xff08;…...

快速掌握Postman实现接口测试

快速掌握Postman实现接口测试 Postman简介 Postman是谷歌开发的一款网页调试和接口测试工具&#xff0c;能够发送任何类型的http请求&#xff0c;支持GET/PUT/POST/DELETE等方法。Postman非常简单易用&#xff0c;可以直接填写URL&#xff0c;header&#xff0c;body等就可以发…...

jmeter--3.使用提取器进行接口关联

目录 1. 正则表达式提取器 1.1 提取单个数据 1.2 名词解释 1.3 提取多个数据 2. 边界值提取器 2.2 名词解释 3. JSON提取器 3.1 Json语法 3.2 名词解释 3.3 如果有多组数据&#xff0c;同正则方式引用数据 1. 正则表达式提取器 示例数据&#xff1a;{"access_to…...

移动通信系统关键技术多址接入MIMO学习(8)

1.Multiple-antenna Techniques多天线技术MIMO&#xff0c;从SISO到SIMO到MISO到如今的MIMO&#xff1b; 2.SIMO单发多收&#xff0c;分为选择合并、增益合并&#xff1b;SIMO&#xff0c;基站通过两路路径将信号发送到终端&#xff0c;因为终端接收到的两路信号都是来自同一天…...

WorkPlus AI助理为企业提供智能客服的机器人解决方案

在数字化时代&#xff0c;企业面临着客户服务的重要挑战。AI客服机器人成为了提升客户体验和提高工作效率的关键工具。作为一款优秀的AI助理&#xff0c;WorkPlus AI助理以其智能化的特点和卓越的功能&#xff0c;为企业提供了全新的客服机器人解决方案。 为什么选择WorkPlus A…...

python类装饰器编写单体类

1 python类装饰器编写单体类 类装饰器用于装饰类&#xff0c;用于管理类自身&#xff0c;或用于管理实例创建调用。 单体类&#xff0c;不管创建多少次实例&#xff0c;都只有一个实例的类。可以通过类装饰器管理装饰类的全部实例&#xff0c;实现单体类。 1.1 字典存放单体…...

Java并发Condition 详解

1.引言 在Java并发编程中&#xff0c;线程间的协作是一个核心话题。为了实现线程间的协作&#xff0c;Java提供了多种机制&#xff0c;其中等待/通知机制是最常见的一种。在早期版本中&#xff0c;我们通过Object类提供的wait、notify和notifyAll方法来实现这种机制。然而&…...

如何使用CentOS系统中的Apache服务器提供静态HTTP服务

在CentOS系统中&#xff0c;Apache服务器是一个常用的Web服务器软件&#xff0c;它可以高效地提供静态HTTP服务。以下是在CentOS中使用Apache提供静态HTTP服务的步骤&#xff1a; 1. 安装Apache服务器 首先&#xff0c;您需要确保已安装Apache服务器。可以使用以下命令安装Ap…...

Python入门0基础学习笔记

1.编程之前 在编写代码之前&#xff0c;还有两件事需要做&#xff1a; 安装 Python 解释器&#xff1a;计算机是没法直接读懂 Python 代码的&#xff0c;需要一个解释器作为中间的翻译&#xff0c;把代码转换成字节码之后再执行。 Python 是翻译一行执行一行。一般说的安装 …...

python绘制热力图-数据处理-VOC数据类别标签分布及数量统计(附代码)

前言 当你需要统计训练数据中每个类别标签有多少&#xff0c;并且想知道坐标中心分布在图像的位置信息时&#xff0c;你可以利用一下脚本进行计算&#xff01; 步骤 要绘制热力图来分析VOC数据的分布统计&#xff0c;可以按照以下步骤进行&#xff1a; 数据处理&#xff1…...

【回顾2023,展望2024】砥砺前行

2023年总结 转眼间&#xff0c;迎来了新的一年2024年&#xff0c;回顾2023&#xff0c;对于我来说是一个充满平凡但又充实又幸运的一年。这一年经历了很多的事情&#xff0c;包括博客创作、技术学习、出书、买房等&#xff0c;基本上每件事情都是一个前所未有的挑战和机遇、使…...

Stable Diffusion初体验

体验了下 Stable Diffusion 2.0 的图片生成&#xff0c;效果还是挺惊艳的&#xff0c;没有细调prompt输入&#xff0c;直接输入了下面的内容&#xff1a; generate a Elimination Game image of burnning tree, Cyberpunk style 然后点击生成&#xff0c;经过了10多秒的等待就输…...

缓存解析:从架构设计到Redis应用及最佳实践

典型架构设计中缓存的存储位置 在现代软件架构中&#xff0c;缓存是优化数据检索、提高应用性能的关键组件。缓存的存储位置多种多样&#xff0c;每个位置针对特定的优化目标和需求。理解这些层级对于设计高效的系统至关重要。 浏览器缓存&#xff1a;这是最接近用户端的缓存层…...

【C#】使用 LINQ 中的 Skip() 和 Take()进行分页,为什么要分页,分页作用是什么

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是是《C#》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…...

2024云服务器哪家好?阿里云、腾讯云、华为云

作为多年站长使市面上大多数的云厂商的云服务器都使用过&#xff0c;很多特价云服务器都是新用户专享的&#xff0c;本文有老用户特价云服务器&#xff0c;阿腾云atengyun.com有多个网站、小程序等&#xff0c;国内头部云厂商阿里云、腾讯云、华为云、UCloud、京东云都有用过&a…...

docker compose安装gitlab

环境 查看GitLab镜像 docker search gitlab 拉取GitLab镜像 docker pull gitlab/gitlab-ce 准备gitlab-docker.yml文件 version: 3.1 services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwaysenvironment:GITLAB_OMNIBUS_CONFIG: |external_url…...

Nginx——基础配置

和大多数软件一样&#xff0c;Nginx也有自己的配置文件&#xff0c;但它又有很多与众不同的地方&#xff0c;本帖就来揭开Nginx基础配置的面纱。 1、Nginx指令和指令块 了解指令和指令块有助于大家了解配置的上下文&#xff0c;下面是一个配置模板示例&#xff1a; 在这个配…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...