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

Linux网络:应用层协议http/https

认识URL

URL是我们平时说的网址

eg:http常见的URL
http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch1

注意:

  1. 服务器地址就是域名,相当于服务器ip地址

  2. 像http服务绑定80端口号,https服务绑定443端口。ssh服务端口绑定22号端口。所以只要知道使用的是http协议就知道使用的是80端口。所以这个也可以省略。

  3. 服务文件地址:就是想要获得的资源(视频,图片,网页等)在服务器的路径

  4. ?后查询字符串,是这次http请求的参数。是客户端与服务器之间传递数据的一种方式,多个参数之间用&连接

  5. 片段标识符:当浏览网页时,点击下一张图片,网页不刷新。此时片段标识符一直在更新。

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方法:

  1. 直接获取资源信息
  2. 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&#xff1a;http常见的URL http://user:passwww.example.jp:80/dir/index.htm?uid1#ch1 注意&#xff1a; 服务器地址就是域名&#xff0c;相当于服务器ip地址 像http服务绑定80端口号&#xff0c;https服务绑定443端口。ssh服务端口绑定…...

transforemr网络理解

1.transformer网络中数据的流动过程&#xff1a; 2.transformer中残差的理解&#xff1a; 残差连接&#xff08;Residual Connection&#xff09; 的核心思想就是通过将输入与经过变化的输出相加&#xff0c;来最大限度地保留原始信息。 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 进行开发时&#xff0c;尤其是使用注解模式&#xff08;如 Select、Insert 等&#xff09;时&#xff0c;开发者常常会遇到这样一个问题&#xff1a;为什么我的方法重载不能正常工作&#xff1f; 即使在 Java 中允许方法名相同但参数不同的重载&#xff0c;MyBa…...

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADCDMA采样时&#xff0c;遇到了一些小坑记录一下&#xff1b; 一、ADCDMA采样时进入死循环&#xff1b; 解决方法&#xff1a;ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高&#xff0c;且增大ADCHAL_ADC_Start_DMA(&ha…...

Python AttributeError: ‘dict_values’ object has no attribute ‘index’

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

三丰云免费虚拟主机和免费云服务器评测

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

iOS18更新暂停卡住?iOS18升级失败解决办法分享

最近&#xff0c;苹果发布了iOS 18&#xff0c;许多用户都迫不及待更新更新系统体验新功能。然而&#xff0c;一些用户在网上反馈在iOS 18 更新在安装过程中会卡住或暂停&#xff0c;无法正常升级成功。 如果遇到“iOS 18更新暂停或卡住”问题&#xff0c;不用担心。在本文中&a…...

单片机软件工程师确认硬件

文章目录 简介流程确认能连接usb和调试器确认芯片信息确认芯片存储是否正常确认屏幕是否能点亮确认其他硬件 方式方法 简介 硬件工程师给出板子后&#xff0c;后面就是软件工程师的事儿了。 通常来说并不会很顺利。 流程 确认能连接usb和调试器 也是在“计算机管理”中 或者…...

乐鑫无线WiFi芯片模组,家电设备智能联网新体验,启明云端乐鑫代理商

在当今这个数字化飞速发展的时代&#xff0c;智能家居和物联网(IoT)设备已经成为我们生活中不可或缺的一部分。随着技术的进步&#xff0c;我们对于设备联网的需求也在不断提升。 智能家居、智能门锁、智能医疗设备等&#xff0c;这些设备通过联网实现了数据的实时传输和远程控…...

小米嵌入式面试题目RTOS面试题目 嵌入式面试题目

第一章-非RTOS bootloader工作流程 MCU启动流程 通信协议&#xff0c;SPI IIC MCU怎么选型&#xff0c;STM32F1和F4有什么区别 外部RAM和内部RAM区别&#xff0c;怎么分配 外部总线和内部总线区别 MCU上的固件&#xff0c;数据是怎么分配的 MCU启动流程 IAP是怎么升级的…...

Iceberg与SparkSQL写操作整合

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

MYSQL1

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

一文解答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>传送门组件的使用和注意事项

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

项目之家:又一家项目信息发布合作对接及一手接单平台

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

02-java实习工作一个多月-经历分享

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

JVM 调优篇2 jvm的内存结构以及堆栈参数设置与查看

一 jvm的内存模型 2.1 jvm内存模型概览 二 实操案例 2.1 设置和查看栈大小 1.代码 /*** 演示栈中的异常:StackOverflowError** author shkstart* create 2020 下午 9:08** 设置栈的大小&#xff1a; -Xss (-XX:ThreadStackSize)** -XX:PrintFlagsFinal*/ public class S…...

微信可以设置自动回复吗?

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

同样数据源走RTMP播放延迟低还是RTSP低?

背景 在比较同一个数据源&#xff0c;是RTMP播放延迟低还是RTSP延迟低之前&#xff0c;我们先看看RTMP和RTSP的区别&#xff0c;我们知道&#xff0c;RTMP&#xff08;Real-Time Messaging Protocol&#xff09;和RTSP&#xff08;Real Time Streaming Protocol&#xff09;是…...

@开发者极客们,网易2024低代码大赛来啦

极客们&#xff0c;网易云信拍了拍你 9月6日起&#xff0c;2024网易低代码大赛正式开启啦&#xff01; 低代码大赛是由网易主办的权威赛事&#xff0c;鼓励开发者们用低代码开发的方式快速搭建应用&#xff0c;并最终以作品决出优胜。 从2022年11月起&#xff0c;网易低代码大赛…...

数据分析-16-时间序列分析的常用模型

1 什么是时间序列 时间序列是一组按时间顺序排列的数据点的集合,通常以固定的时间间隔进行观测。这些数据点可以是按小时、天、月甚至年进行采样的。时间序列在许多领域中都有广泛应用,例如金融、经济学、气象学和工程等。 时间序列的分析可以帮助我们理解和预测未来的趋势和…...

SpringMVC使用:类型转换数据格式化数据验证

01-类型转换器 先在pom.xml里面导入依赖&#xff0c;一个是mvc框架的依赖&#xff0c;一个是junit依赖 然后在web.xml里面导入以下配置&#xff08;配置的详细说明和用法我在前面文章中有写到&#xff09; 创建此测试类的方法用于测试springmvc是具备自动类型转换功能的 user属…...

多语言ASO – 本地化的10个技巧

ASO优化是一个复杂的领域&#xff0c;即使你只关注讲英语的用户。如果您想面向国际受众并在全球范围内发展您的应用程序业务&#xff0c;您必须在App Store和Google Play Store上本地化应用程序的产品页面。不过&#xff0c;应用程序商店本地化的过程也有很多陷阱。 应用商店本…...

C程序设计——函数0

函数定义 前面说过C语言是结构化的程序设计语言&#xff0c;他把所有问题抽象为数据和对数据的操作&#xff0c;前面讲的变量、常量&#xff0c;都是数据。现在开始讲对数据操作——函数。 C语言的函数&#xff0c;定义方式如下&#xff1a; 返回值类型 函数名(参数列表) {…...

第二十一章 rust与动静态库的结合使用

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust与动静态库的结合使用 目录 注意一、前言二、库生成三、库使用四、总结一、前言 rust中多了很多类型的库,比如前面章节中我们提到基本的bin与lib这两种crate类型库。 如果你在命令行执行下列语句: rustc -…...

修改服务器DNS解析及修改自动对时时区

修改服务器DNS解析&#xff1a; 1、搜索一下当地的DNS服务器的地址 2、登录服务器&#xff0c;执行 vim /etc/resolv.conf文件&#xff0c;在nameserver字段后填写DNS服务的地址 3、chattr i /etc/resolv.conf 加上不可修改权限&#xff0c;防止重启DNS被修改 修改自动对时…...

中科院TOP“灌水神刊”合集!盘点那些“又牛又水”的国人友好SCI

【SciencePub学术】本期&#xff0c;小编给大家推荐几本“又牛又水”的期刊&#xff0c;并且都是清一色的国人友好刊&#xff0c;涵盖各领域&#xff0c;以供各位学者参考&#xff01; NO.1 Nature Communications IF&#xff1a;14.7 分区&#xff1a;JCR1区中科院1区TOP 年…...

Python列表浅拷贝的陷阱与破解之道

引言 在Python编程世界中&#xff0c;列表的拷贝操作看似简单&#xff0c;却常常隐藏着一些令人意想不到的陷阱&#xff0c;尤其是当涉及到浅拷贝时。今天&#xff0c;我们将深入探讨Python列表浅拷贝现象及产生原因&#xff0c;并提供有效的解决方案&#xff0c;帮助你写出更…...

开放式系统互连(OSI)模型的实际意义

0 前言 开放式系统互连&#xff08;OSI&#xff0c;Open Systems Interconnection&#xff09;模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;在1984年提出&#xff0c;目的是为了促进不同厂商生产的网络设备之间的互操作性。 定义了一种在层之间进行协议实现…...