HTTP协议基础知识(URL,请求响应格式,状态码,方法,cookie和session等)

news2024/11/25 16:45:51

目录

URL

 urlencode和urldecode

http请求格式

http响应格式

http请求解析

http响应发送

http的方法

GET vs POST

http的状态码

重定向

http常见报头属性

cookie和session


URL

首先我们需要知道以下几点,

1.我们请求的图片,html,css,js,视频,音频,标签,文档,等这些都称之为"资源"。

2.服务器后台,是用Linux做的。

3.IP + Port唯一的确定一个进程。

4.公网IP地址是唯一确认一台主机的,而我们所谓的网络"资源"都一定是存在于网络中的一台Linux机器上。Linux或者传统的操作系统,保存资源的方式,都是以文件的方式保存的。单Linux 系统,标识一个唯一资源的方式,就是通过路径

5.所以:IP+Linux路径,就可以唯一的确认一个网络资源

6.IP地址通常是以域名的方式呈现的。路径可以通过目录名+/确认。

         URL(Uniform Resource Locator)——统一资源定位符,通过URL可以定位到互联网中某个确定的资源。

1.协议:用哪种协议来获取这个资源

2.登录信息:可以用表单的方式认证。

3.服务器地址:也叫作域名,和每个IP地址形成映射。

4.服务器端口号:一般的协议名和这个端口号是紧密联系的,确定了协议,一般端口号就被确定了,所以这里的端口号一般都会省略。(比如你是http协议,那我就知道端口号是80)

5.带层次的文件路径:当前IP地址对应的linux主机下对应资源的绝对路径。

6.?后面的是参数

 urlencode和urldecode

像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.

比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转码

        我们在百度里面搜c++,会看到后面的参数里面有wd,wd的值就是我们要搜索的内容。但是我们发现c++变成了c%2B%2B,因为+是特殊字符,需要对这种字符进行转码。

        转码的规则:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式

"+" 被转码成了 "%2B"

urlencode:称为编码/转码

urldecode就是urlencode的逆过程,称为解码

一般由浏览器帮我们编码,服务器可能要自己解码

http请求格式

无论是请求还是响应,基本上http都是按照行(\n)为单位进行构建请求或者响应的!

无论是请求还是响应,几乎都是由3或者4部分组成。(4部分就是包含空行了

  • 请求行:也就是首行第一行的内容,包括1.请求方法; 2.url;3.http协议的版本
  • 请求报头:每个请求报头占一行,这里是由多个请求报头。以key-value形式的属性构成,最后的分隔符是\n
  • 空行:请求报头和请求正文之间有一个空行\n
  • 请求正文:不一定有,主要存放用户提交的数据(比如登录的时候提交的用户名和密码)

注:请求行+请求报头 = http请求报头

请求正文 = 有效载荷

http响应格式

  • 状态行:也就是首行第一行的内容:1.http协议的版本;2.状态码(404);3.状态码描述
  • 响应报头:每个响应报头占一行,这里是由多个响应报头。以key-value形式的属性构成,最后的分隔符是\n
  • 空行:响应报头和响应正文之间有一个空行\n
  • 响应正文:服务器根据用户请求响应给用户的内容

注:响应行+响应报头 = http响应报头

响应正文 = 有效载荷

http请求解析

1.读到空行\n,就表示报头部分读完了;

2.如果在报头中读取到Content-Length,那就说明有正文部分(否则就是没有正文),Content-Length的值就是正文部分的长度(也就是有效载荷的长度)。如果有正文,我们根据Content-Length长度的字节即可。(Content-Length是一个自描述字段)

具体什么时候会没有正文,和请求方法有关。

http响应发送

read和write可以使用recv和send函数替换,后两个函数是Linux操作系统针对网络通信的。

当我们返回响应的时候,也需要按照http协议,发送一个字符串作为响应。

Http协议,如果自己写的话,本质是,我们要根据协议内容来进行文本分析

        每一行就像是一个成员,我们在每个成员后面加上\n,把它组成一个字符串的过程,实际上就是序列化的过程。

简单构建并发送响应的部分代码:

    ssize_t s = recv(sock, buffer, sizeof(buffer), 0);
    if(s > 0)
    {
        buffer[s] = 0;
        std::cout  << buffer; //查看http的请求格式! for test

        std::string http_response = "http/1.0 200 OK\n";
        http_response += "Content-Type: text/plain\n"; //text/plain,正文是普通的文本
        http_response += "\n"; //空行
        http_response += "hello,zebra!";

        send(sock, http_response.c_str(), http_response.size(), 0); //ok??
    }

http的方法

GET vs POST

一.概念

GET方法叫做获取,是最常用的方法,默认一般获取所有的网页,都是GET方法。但是如果GET要提交参数(GET方法是可以提交参数的),通过URL来进行参数拼接从而提交给server端。

POST方法叫做推送,是提交参数比较常用的方法,但是如果提交参数,一般是通过正文部分提交的,但是你不要忘记,Content-Length: XX表示参数的长度,这个属性要在报头中给出。

二.区别

参数提交的位置不同,(想要真的安全,就是要加密)

1、参数提交的位置不同,POST方法比较私密(私密!=安全),不会回显到浏览器的url输入框!get方法不私密,会将重要信息回显到url的输入框中,增加了被盗取的风险。

2. get是通过url传参的,而url是有大小限制的!和具体的浏览器有关!POST方法,是由正文部分传参的,一般大小没有限制

三.如何选择

1.如果提交的参数,不敏感,数量非常少,可以采用GET

2.POST:否则,就使用POST方法

http的状态码

1.比如404状态码,对浏览器并没有意义,不管状态码如何,浏览器就是正常显示服务端提供的界面。浏览器针对404并不会专门做处理。

2.4开头的是客户端的错误;5开头的是服务器端的错误

重定向

1.重定向概念

类似以下的现象就叫做重定向:

1.当访问某一个网站的时候,会让我们跳转到另一个网址。(比如老网站不用了,如果有人访问老网站,就自动重定向跳转到新网站)

2.等我访问某种资源的时候,提示我登录,跳转到了登录页面,输入完毕密码,登录的时候,会自动跳转回来(登录,美团下单)

2.永久重定向:

服务器不提供服务,而是告诉客户端去对一个新的网站重新发起请求。当浏览器收到服务端永久重定向的信息,就会把用户收藏夹(书签等)里面的旧网址也替换成新网址

使用场景:网站搬迁,域名更换。

3.临时重定向:

等我访问某种资源的时候,提示我登录,跳转到了登录页面,输入完毕密码,登录的时候,会自动跳转回来,这种就是临时重定向,每天都有可能发生,是一种业务的需求。

4.注意事项:

1.重定向是需要浏览器提供支持的,所以浏览器需要认识3开头的状态码。

2.server让浏览器重定向的时候,需要告诉浏览器要重定向到哪里,所以需要一个Location字段在http报头中

部分代码如下所示,只需要设置好状态码和Location字段,即可实现页面的重定向。(301是永久重定向;302,307是临时重定向)

        std::string response = "http/1.1 302  Found\n";
        response += "Location: https://www.qq.com/\n";
        response += "\n";
        send(sock, response.c_str(), response.size(), 0);

注:如果自己收藏网站,就可以明显观察到永久重定向和临时重定向的区别。(这里在Chrome浏览器里面测试。收藏网址后,即使服务器关闭,发生永久重定向以后访问收藏的网页还是会直接跳转到腾讯首页;当时如果是临时重定向就不会直接跳转到腾讯首页)

http常见报头属性

  • Content-Type: 数据类型(text/html等)
  • Content-Length: Body的长度
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
  • User-Agent: 声明用户的操作系统和浏览器版本信息;
  • referer: 当前页面是从哪个页面跳转过来的;
  • location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
  • Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;

cookie和session

1.cookie+session的本质:提高用户访问网站或者平台的体验。(因为http是一种无状态的协议,如果不使用cookie和session,每次访问服务器资源的时候都需要让你登录来认证你当前这个用户,有了cookie和session以后,你只要登录了,就可以在一定时间内访问对应的服务器资源,而不需要重新登录)

2.http是一种无状态的协议:http并不会记录这次请求的上下文信息,它不知道历史上这个人有没有发起过请求,也不会记录这次请求。

        ——因为是一种无状态的协议,所以http协议实现起来比较简单

3.但是我们在访问网站的时候,会有浏览记录,登录以后会自动保存密码,登录成功以后某段时间内不需要重新登录,在网页间跳转的时候不需要重复登录。

        ——这些并不是http本身要解决的问题,http可以提供一些技术支持,来保证网站具有“会话保持”的功能。(会话管理)


cookie

1.对于浏览器: cookie其实是一个文件,该文件里面保存的是我们的用户的私密信息。

2.对于 http协议:一旦该网站对应有cookie,在发起任何请求的时候,都会自动在request中携带该cookie信息。

-如何使用:

登录成功后,浏览器会把用户信息(如用户身份,用户名密码等),放在本地的一个cookie文件里面,然后之后每一次对这个网站发起请求的时候,每一个请求中都会携带对应的cookie信息代表用户的身份。

-保存位置:

1.文件版(cookie信息放在本地的文件中,在安装目录或者用户目录下);

2.内存版(存放在内存中,浏览器一旦关闭就cookie信息就没了)

-使用方法:在请求报头中加入Set-Cookie字段,也可以写在一个Set-Cookie里面。

            http_response += "Set-Cookie: id=zebra\n";

            http_response += "Set-Cookie: password=123456\n";

-注意事项:如果别人盗取我们的cookie文件,别人

1.可以凭借我的身份进行认证访问特定的资源

2.如果保存的是用户名密码,那么就非常糟糕了

3.单纯使用cookie,是具有一定的安全隐患的


session

单纯使用cookie,是具有一定的安全隐患的。现在的网络通信中一般是cookie+session一起用。

核心思路就是:把用户的私密信息,保存在服务端。

使用方式:

        当用户输入用户名密码登录,发起请求的时候,服务端会根据为当前用户生成一个session文件,里面保存了用户的用户名密码等私密信息,同时会为当前用户随机生成一个唯一的session_id,并放在Set-Cookie里面返还给浏览器,浏览器拿到Set-Cookie里面的session_id以后,在客户端生成一个cookie文件,之后每次发起请求的时候,都带上cookie的内容。

用了session为什么会更加安全?

        如果客户端本地的cookie被盗取,别人拿着session_id访问相同的网站,还是可行,但是相比于只用cookie,会更加安全一些。

防盗方式:

        根据IP地址可以知道当前主机的位置,中国各个省的IP地址是不一样的,所以可以根据IP地址知道你主机的实际地址。(想想为什么b站的评论区会直接显示你位于哪个省份)

        如果发现你在不同的地点登录,服务端就可以废弃掉原先的session_id,让用户重新登录,从而为用户生成一个新的session_id

        ——像这样就可以在服务端进行判断,从而提高安全性。(如果发现被盗取了,服务端直接废弃掉用户的session文件废弃掉即可。)

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring-webflux5 使用websocket

换做平常springboot程序中使用websocket的话是很简单的&#xff0c;只需要三步就能实现前后端的实时通讯。而在spring5中则更简单了&#xff0c;并且支持定点推送与全推送的灵活运用。在这里就分常规编程与响应式编程两种使用&#xff0c;进行记录下。一、非响应式编码1、引入W…

第十节 使用设备树插件实现RGB 灯驱动

Linux4.4 以后引入了动态设备树&#xff08;Dynamic DeviceTree&#xff09;&#xff0c;我们这里翻译为“设备树插件”。设备树插件可以理解为主设备树的“补丁”它动态的加载到系统中&#xff0c;并被内核识别。例如我们要在系统中增加RGB 驱动&#xff0c;那么我们可以针对R…

深入理解Android图形系统

一、图形系统简介图形系统是计算机中最重要的子系统之一。我们平时使用的电脑、手机都是图形界面的。对于普通人来说&#xff0c;没有图形界面的计算机几乎是没法用的&#xff0c;今天我们就来讲一讲图形系统背后的原理。1.1 图形系统的诞生早期的计算机是没有图形界面的&#…

一种基于深度学习的单导联心电信号睡眠呼吸暂停检测方法

在R峰识别的基础上&#xff0c;加入S峰的识别&#xff0c;并论正了该策略对检测结果的有效性。 1、大致方法 将数据集&#xff08;ECG信号&#xff09;划分为每五分钟的一个片段&#xff0c;为了减少噪声和信号伪影&#xff0c;首先对信号应用了一个有限脉冲响应&#xff08;…

使用python加密主机文件几种方法实现

本文主要介绍了使用python加密主机文件几种方法实现&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧数据加密是一种保护数据安全的技术&#xff0c;通过对数据进行编…

你所不知道的Number()、parseInt()、parseFloat()转换细则

为什么要写这篇文章 最近在阅读《javascript高级程序设计》&#xff08;第6版&#xff09;这本书&#xff0c;以写代记。同时刚刚入职新公司&#xff0c;发现自己对于number类型转换的细节掌握不足 使用场景 我们常常对于很多字符串类型的数字需要转换成Number&#xff0c;一…

2023春节,蔚来高速免费换电累计达37万余次

2023年春节放假前&#xff0c;蔚来官方宣布高速换电免费消息&#xff1a; 在高速公路上&#xff08;含高速出入口&#xff09;的所有蔚来汽车换电站将为蔚来用户&#xff0c;提供不限次免费换电服务。 消息发布后&#xff0c;部分电动车企也进行了跟进&#xff0c;提供了特定区…

二十四、Gtk4-GtkExpression

GtkExpression是一种基本类型。它不是GObject的后代。GtkExpression提供了一种描述对值的引用的方法。GtkExpression需要求值才能获得值。 它类似于算术计算。 1 2 3 12是一个表达式。给出了计算的方法。3是来自表达式的值。求值是计算表达式并得到值。 GtkExpression是一种…

【大厂高频真题100题】《有效的井字游戏》 真题练习第26题 持续更新~

有效的井字游戏 给你一个字符串数组 board 表示井字游戏的棋盘。当且仅当在井字游戏过程中,棋盘有可能达到 board 所显示的状态时,才返回 true 。 井字游戏的棋盘是一个 3 x 3 数组,由字符 ,X 和 O 组成。字符 代表一个空位。 以下是井字游戏的规则: 玩家轮流将字符…

CODESYS开发教程10-文件读写(SysFile库)

今天继续我们的小白教程&#xff0c;老鸟就不要在这浪费时间了&#x1f60a;。 前面一期我们介绍了CODESYS的文件操作库CAA File。这一期主要介绍CODESYS的SysFile库所包含的文件读写功能块&#xff0c;主要包括文件路径、名称、大小的获取以及文件的创建、打开、读、写、拷贝…

mysql数据库安装

三种安装方式 tar -xf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz [rootsc-mysql opt]# tar -xf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz [rootsc-mysql opt]# ls apache-zookeeper-3.6.3-bin kafka_2.12-2.8.1.tgz apache-zookeeper-3.6.3-bin.tar.gz mysql…

无线局域网

无线局域网&#xff08;Wireless Local Ara Network&#xff0c;WLAN&#xff09; 一、无线局域网的组成 无线局域网可分为两大类&#xff1a;&#xff08;1&#xff09;有基础设施的&#xff1b;&#xff08;2&#xff09;无基础设施的。 1. IEEE802.11 对于有基础设施的无…

Spring boot 实战指南(三):整合Elasticsearch、swagger、redis、mq

文章目录一、Elasticsearch创建项目配置maven完善依赖es连接配置实体映射repositoryservicecontroller二、swagger依赖启动类路径匹配配置配置类controller注解三、redis一、Elasticsearch 官方文档 Elasticsearch教程 自己搭建了一个简单的demo&#xff0c;仓库在这里&#…

分布式之CAP理论分析

写在前面 任何存在的事物都有其内在的特性&#xff0c;分布式也不例外&#xff0c;那么分布式都有什么特性呢&#xff1f;国外有大牛就帮我们总结了如下的三点&#xff1a; C:Consitency,一致性 A&#xff1a;Available&#xff0c;可用性 P&#xff1a;Partition tolerance&…

细讲一个 TCP 连接能发多少个 HTTP 请求(二)

第三个问题&#xff1a;一个 TCP 连接中 HTTP 请求发送可以一起发送么&#xff08;比如一起发三个请求&#xff0c;再三个响应一起接收&#xff09;&#xff1f; HTTP/1.1 存在一个问题&#xff0c;单个 TCP 连接在同一时刻只能处理一个请求&#xff0c;意思是说&#xff1a;两…

测试员都是背锅侠?测试人员避“锅”攻略,拿走不谢

最近发生了一起生产事故&#xff0c;究其根源&#xff0c;事故本身属于架构或者需求层面需要规避的问题&#xff0c;测试人员的责任其实是非常小的&#xff0c;但实际情况是&#xff1a;相关测试人员因此承担了很大的压力&#xff0c;成为质量问题的“背锅侠”。 实际上&#…

极验2代验证码分析

目标链接 aHR0cDovL3d3dy5qc2dzai5nb3YuY246NTg4ODgvbWluaS9uZXR3ZWIvU01MaWJyYXJ5LmpzcA接口分析 点击搜索就会跳出验证码&#xff0c;netWebServlet.json 的请求&#xff0c;会返回 challenge 和 gt 接着可以看响应请求图片信息的接口&#xff0c;可以看到请求参数包含cha…

iOS 组件化或SDK时对资源加载注意点

本文针对cocoapods进行打包的资源做个讲解&#xff0c;针对自身项目注意调整资源访问策略。 资源文件打包方式 使用pod lib create AppResourceModule 来进行演示。 use_frameworks! target AppResourceModule_Example dopod AppResourceModule, :path > ../ end podfil…

Python+Flask+MySQL开发的在线外卖订餐系统(附源码)

文章目录一、项目模块及功能介绍1、登录模块2、注册模块3、商家用户模块4、买家用户模块5、系统管理员模块源码二、项目结构三、环境依赖四、运行方法五、系统部分界面展示1、首页2、注册界面3、登录界面4、商家主界面5、商家菜单界面6、商家添加菜品界面7、商家修改菜品界面8、…

数值程序分析

原文来自微信公众号“编程语言Lab”&#xff1a;数值程序分析 搜索关注“编程语言Lab”公众号&#xff08;HW-PLLab&#xff09;获取编程语言更多技术内容&#xff01; 欢迎加入编程语言社区 SIG-程序分析&#xff0c;了解更多程序分析相关的技术内容。 加入方式&#xff1a;添…