Linux网络:应用层协议http/https
认识URL
URL是我们平时说的网址
eg:http常见的URL
http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch1
注意:
-
服务器地址就是域名,相当于服务器ip地址
-
像http服务绑定80端口号,https服务绑定443端口。ssh服务端口绑定22号端口。所以只要知道使用的是http协议就知道使用的是80端口。所以这个也可以省略。
-
服务文件地址:就是想要获得的资源(视频,图片,网页等)在服务器的路径
-
?后查询字符串,是这次http请求的参数。是客户端与服务器之间传递数据的一种方式,多个参数之间用&连接
-
片段标识符:当浏览网页时,点击下一张图片,网页不刷新。此时片段标识符一直在更新。
urlencode与urldecode
像 / 与 ?这些特殊字符在URL中的特殊符号时,URL会将这些关键字特殊处理
URL会将这些关键字进行转义,将需要转码的字符转化为16进制,然后从右到左取4位,不足4位直接处理,再每2位做一位前加上%,编码成%XY的形式
1.http协议
http协议是基于请求与响应的应用层协议(cs / bs 模式)
一次http请求包括客户端向服务器request请求,服务器向客户端response响应
http协议 请求格式
常规情况下,http(s)下层传输层协议使用的是tcp协议。
下面用C++ 实现服务器,启动浏览器访问这个服务。将浏览器发送给服务器的request请求打印出来分析http客户端请求的格式
#include<stdlib.h>
#include<iostream>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<cstring>
#include<sys/wait.h>int main(){int listen_sock=socket(AF_INET,SOCK_STREAM,0);if(listen_sock<0){std::cerr<<"socket error"<<std::endl;return 1;}struct sockaddr_in local;memset(&local,0,sizeof(local));local.sin_family=AF_INET;local.sin_port=htons(8081);local.sin_addr.s_addr=INADDR_ANY;if(bind(listen_sock,(struct sockaddr*)&local,sizeof(local))<0){std::cerr<<"bind error"<<std::endl;return 2;}if(listen(listen_sock,5)<0){std::cerr<<"listen error"<<std::endl;return 3;}sockaddr_in client;while(true){socklen_t len=sizeof(client);int sock=accept(listen_sock,(struct sockaddr*)&client,&len);if(sock<0){std::cout<<"accept error"<<std::endl;continue;}if(fork()==0){if(fork()>0){exit(0);}close(listen_sock);//读取客户端请求char buff[1024];size_t size=recv(sock,buff,sizeof(buff)-1,0);buff[size]='\0';std::cout<<"################http begin#####################"<<std::endl;std::cout<<buff<<std::endl;exit(0);}close(sock);waitpid(-1,nullptr,0);}return 0;
}
客户端向服务器发送请求
服务器打印http请求
分析上面的打印结果
这一行叫做:请求行
此外,像这些key:value代表了这次请求的若干属性
eg:
User-Agent:发起这次请求的浏览器的信息
这部分叫做:请求报头
综上http协议格式为:
http协议 响应格式 
当客户端读取到空行时,代表客户端已经读取完http响应报头了。
注意:
-
客户端向服务器发送请求http时首行带的http版本是客户端的http版本。服务器接受到请求报头时,识别http版本,用对应的http版本进行处理业务。提高了兼容性
-
响应报头中的状态码:表示服务器处理请求的情况,常见的状态码有200(OK)、404(Not Found)等
http协议方法(GET 、POST)
http GET方法:
http POST方法:
对比两种请求的请求报头可以发现POST方法比GET方法多了
Content-Length项
GET方法:
- 直接获取资源信息
- GET方法可以带参数,参数在URL?后面都是GET的参数,通过URL传递给服务器
POST方法:
通过正文提交数据给服务器,不通过URL
http在读取正文时如果此时是POST方法
空行的下一行就是正文,根据Content-Length项可以知道应该在正文上读取几个字节。通过这种方法(POST+Content-Length)就可以有效的读取http正文(请求或响应)
C++实现服务器响应 观察http响应,以及POST 、GET传参
简单的html网页index.html
<html><header><h5>log in<h5><header><body><form method="GET" action="/s">user:<br><input type="text" name="user"><br>password:<br><input type="text" name="passowrd"><br><input type="submit" value="register"><body>
</html>
#include<string>
#include<stdlib.h>
#include<iostream>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<cstring>
#include<sys/wait.h>#include<fstream>int main(){int listen_sock=socket(AF_INET,SOCK_STREAM,0);if(listen_sock<0){std::cerr<<"socket error"<<std::endl;return 1;}struct sockaddr_in local;memset(&local,0,sizeof(local));local.sin_family=AF_INET;local.sin_port=htons(8081);local.sin_addr.s_addr=INADDR_ANY;if(bind(listen_sock,(struct sockaddr*)&local,sizeof(local))<0){std::cerr<<"bind error"<<std::endl;return 2;}if(listen(listen_sock,5)<0){std::cerr<<"listen error"<<std::endl;return 3;}sockaddr_in client;while(true){socklen_t len=sizeof(client);int sock=accept(listen_sock,(struct sockaddr*)&client,&len);if(sock<0){std::cout<<"accept error"<<std::endl;continue;}if(fork()==0){if(fork()>0){exit(0);}close(listen_sock);//读取客户端请求char buff[1024];size_t size=recv(sock,buff,sizeof(buff)-1,0);buff[size]='\0';std::cout<<"################http begin#####################"<<std::endl;std::cout<<buff<<std::endl;
#define PAGE "index.html"std::ifstream in(PAGE);if(in.is_open()){in.seekg(0,std::ios::end);//获取文件末尾指针size_t size=in.tellg();in.seekg(0,std::ios::beg);//定位到文件开头char*file=new char[size];in.read(file,size);in.close();// std::cout<<file<<std::endl;std::string statusLine="http/1.1 200 OK\n";//响应报头std::string respon="Content-Length: "+std::to_string(size);respon+="\n";std::string blank="\n";//空行send(sock,statusLine.c_str(),statusLine.size(),0);send(sock,respon.c_str(),respon.size(),0);send(sock,blank.c_str(),blank.size(),0);//发送正文send(sock,file,size,0);delete[]file;}exit(0);}close(sock);waitpid(-1,nullptr,0);}return 0;
}
首先是GET方法 由上图可知GET方法通过URL项服务器传参。密码和账号都暴露出来了不太好
其次是POST方法
由上图可知POST通过正文传参,没有直接暴露到URL上,相对比较隐秘一些(并不安全)。
当在http请求时,每次请求之间没有任何关系(无状态)
http响应状态码
常见的状态码为:
200(OK) ,404(Not Found) ,403(Forbidden) ,302(重定向) ,504(Bad Gateway)等等
其中重定向分为临时重定向(307/http1.1 - 302/http1.0)和永久重定向(301)
本质区别:
影响客户端标签,决定客户端是否需要更新目标地址。
http 常用 Header
location:搭配3XX状态码实现重定向
重定向的实现还需要搭配响应报头location:字段
std::string statusLine="http/1.1 307 Temporary Redirect\n";
//响应报头
std::string respon="Content-Length: "+std::to_string(size);
respon+="\n";
respon+="location: https://www.baidu.com/\n";
std::string blank="\n";//空行
send(sock,statusLine.c_str(),statusLine.size(),0);
send(sock,respon.c_str(),respon.size(),0);
send(sock,blank.c_str(),blank.size(),0);
- Content-Type: 资源类型(html、text等)
- Content-Length:正文长度
- Host:所请求的资源在那个主机那个端口上(代理服务器常用)
- User-Agent:用户的操作系统以及浏览器版本信息
- referer:当前页面是从那个页面跳转的,方便回退
- Cookie:用于在客户端储存少量信息,实现会话(session)的功能
在登录网站时,如果曾经使用过账号密码,第二次登录网站时不需要再次输入账号密码进行身份认证了。
注意:Cookie文件分为内存级和文件级
如果重启客户端还需要输入用户信息的属于内存级,反之就为文件级
- Connection:长链接keep-alive
2.https协议 
同理对端再收到报文时要先经过SSL或TLS进行解密,再传到应用层
其中加密分为对称加密(异或加密)(密钥负责加密解密)与非对称加密(RSA)(公钥加密,私钥解密)
其中非对称加密 私钥是不对外公开的,公钥可以公开。
相关文章:

Linux网络:应用层协议http/https
认识URL URL是我们平时说的网址 eg:http常见的URL http://user:passwww.example.jp:80/dir/index.htm?uid1#ch1 注意: 服务器地址就是域名,相当于服务器ip地址 像http服务绑定80端口号,https服务绑定443端口。ssh服务端口绑定…...

transforemr网络理解
1.transformer网络中数据的流动过程: 2.transformer中残差的理解: 残差连接(Residual Connection) 的核心思想就是通过将输入与经过变化的输出相加,来最大限度地保留原始信息。 transforemr中注意力层网络和前馈神经…...

C++插件管理系统
插件加载目录结构 execute plug.exe plugify.dll plugify.pconfig res cpp-lang-module.pmodule example_plugin.pplugin bin cpp-lang-module.dll example_plugin.dll plugify.pconfig { "baseDir&…...
MyBatis 方法重载的陷阱及解决方案
在使用 MyBatis 进行开发时,尤其是使用注解模式(如 Select、Insert 等)时,开发者常常会遇到这样一个问题:为什么我的方法重载不能正常工作? 即使在 Java 中允许方法名相同但参数不同的重载,MyBa…...
STM32 ADC+DMA导致写FLASH失败
最近用STM32G070系列的ADCDMA采样时,遇到了一些小坑记录一下; 一、ADCDMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&ha…...

Python AttributeError: ‘dict_values’ object has no attribute ‘index’
Python AttributeError: ‘dict_values’ object has no attribute ‘index’ 在Python编程中,AttributeError 是一个常见的异常类型,通常发生在尝试访问对象没有的属性或方法时。今天,我们将深入探讨一个具体的 AttributeError:“…...

三丰云免费虚拟主机和免费云服务器评测
三丰云是一家提供免费虚拟主机和免费云服务器的知名服务提供商,深受用户好评。在这篇评测文章中,我们将对三丰云的免费虚拟主机和免费云服务器进行细致评测。 首先,我们来看看三丰云的免费虚拟主机服务。三丰云的免费虚拟主机提供稳定的服务器…...

iOS18更新暂停卡住?iOS18升级失败解决办法分享
最近,苹果发布了iOS 18,许多用户都迫不及待更新更新系统体验新功能。然而,一些用户在网上反馈在iOS 18 更新在安装过程中会卡住或暂停,无法正常升级成功。 如果遇到“iOS 18更新暂停或卡住”问题,不用担心。在本文中&a…...
单片机软件工程师确认硬件
文章目录 简介流程确认能连接usb和调试器确认芯片信息确认芯片存储是否正常确认屏幕是否能点亮确认其他硬件 方式方法 简介 硬件工程师给出板子后,后面就是软件工程师的事儿了。 通常来说并不会很顺利。 流程 确认能连接usb和调试器 也是在“计算机管理”中 或者…...

乐鑫无线WiFi芯片模组,家电设备智能联网新体验,启明云端乐鑫代理商
在当今这个数字化飞速发展的时代,智能家居和物联网(IoT)设备已经成为我们生活中不可或缺的一部分。随着技术的进步,我们对于设备联网的需求也在不断提升。 智能家居、智能门锁、智能医疗设备等,这些设备通过联网实现了数据的实时传输和远程控…...

小米嵌入式面试题目RTOS面试题目 嵌入式面试题目
第一章-非RTOS bootloader工作流程 MCU启动流程 通信协议,SPI IIC MCU怎么选型,STM32F1和F4有什么区别 外部RAM和内部RAM区别,怎么分配 外部总线和内部总线区别 MCU上的固件,数据是怎么分配的 MCU启动流程 IAP是怎么升级的…...

Iceberg与SparkSQL写操作整合
前言 spark操作iceberg之前先要配置spark catalogs,详情参考Iceberg与Spark整合环境配置。 有些操作需要在spark3中开启iceberg sql扩展。 Iceberg使用Apache Spark的DataSourceV2 API来实现数据源和catalog。Spark DSv2是一个不断发展的API,在Spark版…...

MYSQL1
一、为什么学习数据库 1、岗位技能需求 2、现在的世界,得数据者得天下 3、存储数据的方法 4、程序,网站中,大量数据如何长久保存? 5、数据库是几乎软件体系中最核心的一个存在。 二、数据库相关概念 (一)数据库DB 数据库是将大量数据保存起来,通过计算机加…...

一文解答Swin Transformer + 代码【详解】
文章目录 1、Swin Transformer的介绍1.1 Swin Transformer解决图像问题的挑战1.2 Swin Transformer解决图像问题的方法 2、Swin Transformer的具体过程2.1 Patch Partition 和 Linear Embedding2.2 W-MSA、SW-MSA2.3 Swin Transformer代码解析2.3.1 代码解释 2.4 W-MSA和SW-MSA…...

Vue3:<Teleport>传送门组件的使用和注意事项
你好,我是沐爸,欢迎点赞、收藏、评论和关注。 Vue3 引入了一个新的内置组件 <Teleport>,它允许你将子组件树渲染到 DOM 中的另一个位置,而不是在父组件的模板中直接渲染。这对于需要跳出当前组件的 DOM 层级结构进行渲染的…...

项目之家:又一家项目信息发布合作对接及一手接单平台
这几天“小三劝退师时薪700”的消息甚嚣尘上,只能说从某一侧面来看心理咨询师这个职业的前景还是可以的,有兴趣的朋友可以关注下。话说上一篇文章给大家介绍了U客直谈,今天趁热打铁再给大家分享一个地推拉新项目合作平台~项目之家:…...

02-java实习工作一个多月-经历分享
一、描述一下最近不写博客的原因 离我发java实习的工作的第一天的博客已经过去了一个多月了,本来还没入职的情况是打算每天工作都要写一份博客来记录一下的(最坏的情况也是每周至少总结一下的),其实这个第一天的博客都是在公司快…...

JVM 调优篇2 jvm的内存结构以及堆栈参数设置与查看
一 jvm的内存模型 2.1 jvm内存模型概览 二 实操案例 2.1 设置和查看栈大小 1.代码 /*** 演示栈中的异常:StackOverflowError** author shkstart* create 2020 下午 9:08** 设置栈的大小: -Xss (-XX:ThreadStackSize)** -XX:PrintFlagsFinal*/ public class S…...

微信可以设置自动回复吗?
在日常的微信聊天中,我们或许会频繁地遭遇客户提出的相同问题,尤其是对于从事销售工作的朋友们来说,客户在添加好友后的第一句话往往是“在吗”或者“你好”。当我们的好友数量众多时,手动逐个回复可能会耗费大量的时间。因此&…...

同样数据源走RTMP播放延迟低还是RTSP低?
背景 在比较同一个数据源,是RTMP播放延迟低还是RTSP延迟低之前,我们先看看RTMP和RTSP的区别,我们知道,RTMP(Real-Time Messaging Protocol)和RTSP(Real Time Streaming Protocol)是…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

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