Linux网络编程——HTTP协议的理解与运用

目录

前言

一、认识URL

二、认识HTTP样例

三、HTTP的报头内容

1.url

2. Content-Type

3.Method 方法

1.GET方法 

2.POST方法 

4、状态码

5.cookie和session


前言

我们知道,协议就是一种约定,客户端与服务端统一的用这种约定进行传输数据。我们也进行了自定义协议的序列化与反序列化,了解到了协议是如何进行约定的。今天我们来学习一下被广泛运用的应用层协议——HTTP(超文本传输协议)

一、认识URL

在我们访问别人的网站时,通常会输入网址或者点击别人的链接(跳转到该网址)进行访问,我们平时说的网址也就是url

比如说百度的链接如下,https为他的协议方案名,比http多了加密,www.baidu.com为他的服务器地址(也是域名),会通过DNS域名解析将该域名转化为一个IP地址,"/"为访问他的web根目录。

https://www.baidu.com/

再比如说我们百度搜索caixukun,就会访问到"/s目录","?"后面就可以带参数了,"wd=caixunkun"为我们的搜索内容,"&"后面又跟着很多参数

https://www.baidu.com/s?wd=caixukun&rsv_spt=1&rsv_iqid=0xa125eeac0124f4d8&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&oq=%25E8%2594%25A1%25E5%25BE%2590%25E5%259D%25A4&rsv_btype=t&inputT=1356&rsv_t=30ce7B8KPAgBA5MzP%2Fj0%2Bouk7Tznt866T6e0B%2Fv5EUHIzUkxc34g%2BwyPnOzHtYLvNupJ&rsv_pq=b89a996d00b45a5c&rsv_sug3=38&rsv_sug1=22&rsv_sug7=100&rsv_sug2=0&rsv_sug4=1356&rsv_sug=1

因此,我们平时访问网站,本质上就是在进行进程间通信,只不是是跨网络的,通过域名转化为IP地址,端口号是协议默认的。

二、认识HTTP样例

如下是一个http请求样例,有  请求行、请求报头、空行、请求参数(请求参数可以为空)

GET 为http请求方法  / 为请求资源的目录(这是web更目录)  HTTP/1.1是http协议版本。

请求报头中的内容我们暂时不管,等第三章来看,这里只是了解一下http的样子。

对于http协议,请求报头是按 "\r\n" 做结尾的,因此可以通过读取到空行的"\r\n"表示读完了请求报头。而正文(请求参数)的读取完毕,是在请求报头中有一个参数Content_Length来表示正文的长度,知道了长度之后,再拿着这个长度去读正文,读到了这个长度表示正文读取完毕。

反序列化也是按照"\r\n"来进行截取,至此服务器就能清楚我们的请求,同时给我们的请求做出响应。

其中http的响应字段也是类似的,其中浏览器会将响应正文做解释,就变成我们看到的网页了

如下是http的响应字段 

三、HTTP的报头内容

1.url

前面我们的请求行,中间的内容为目录,默认访问的是web根目录,代表默认访问该网站的首页

如果我们指定访问某个文件夹下某个资源,那么请求行中url内容也会随之改变,参数也可以这样传递

实际上我们可以通过http协议,截取出你的url是什么,如果是根目录,那么就拼接首页并给你首页网站。

如果是其他目录,只要我有该目录下的该文件,我就给你,如果没有,我就404 not fount。代码逻辑如下。

2. Content-Type

Content-Type 用于指示响应中包含的数据的类型,如果你的html里面有图片、视频等链接,http进行解析正文的时候发现有链接,那么他会再次发送请求该链接。如下

浏览器虽然足够智能,但是仍需要我们指定类型让浏览器进行渲染,因此我们需要给响应字段添加Content-Type,让浏览器知道如何渲染。

Content-Type 扩展名对照表

因此我们需要截取出请求报头中的url,分析url的后缀是什么,根据后缀进行返回内容

3.Method 方法

请求行的第一个参数就Method方法,最重要、也是最常见的是 GET 和 POST

我们通常使用GET 请求去获取资源,比如网页、图片等。

POST请求通常用于提交表单数据、上传文件等操作。

1.GET方法 

GET方法请求参数通常以 URL 的查询字符串的形式附加在 URL 后面,html中如果不写method,默认方法也是“GET”

这样就可以通过截取的方式把用户输入的数据给到后台。后台根据数据再给你提供服务。

2.POST方法 

post方法会将表单的请求参数放在正文部分,私密性会更强一些。

GET与POST的区别 

  1. GET是在url传递参数,POST是在请求正文传参
  2. GET在url传参字节个数有限,POST参数字节没有限制
  3. GET请求通常用于请求服务器发送某个资源,POST请求通常用于向服务器提交数据
  4. GET私密性比POST差(私密性不等于安全性,GET和POST都不安全,都是明文传输,https才更安全)

4、状态码

在http的响应行中,有状态码这个东西,访问成功状态码是通常200。

如果你请求的文件不存在,状态码通常是404 ,描述为not fount

状态码并不是固定的,而是大多是大家默认遵守的规矩,你可以逾矩,但是会让其他程序员看不懂。 重定向是例外,不能乱写

那我们就可以去进行各种判断,看是什么问题,然后给你返回对应的状态码与状态码描述。其他的我们都能理解,这个重定向状态码是什么情况呢?

HTTP报头中还有一个Location字段,客户端会根据该字段中指定的 URL 自动进行重定向,如下代码,当你的报头中状态码为307,并且有Location字段(缺一不可),其他内容也就不重要了,访问到这个网站即会重定向到你所设置的网站内。

其中307代表临时重定向,请求的资源暂时移动到了新位置,但所有后续的请求应该继续使用原始的 URL。

如果状态码是301,表示请求的资源已永久移动到新位置,且所有后续的请求应该使用新的 URL。这意味着浏览器在收到 301 响应后,应该自动更新其缓存的链接,并使用新的 URL 进行所有后续的请求。

5.cookie和session

  • http的请求是无连接和无状态的。
  • 无连接代表像服务器发送请求,服务器对你的请求做出响应,然后就结束了,后续你要再次跳转或者做其他操作又会发送新的请求。
  • 无状态是说服务器根本就不知道你请求了多少次,你是一直在做刷新操作,还是只访问了一次,我不知道耶不关心,我只知道根据你的请求做出响应。
  • 但是我们实际使用的时候,比如抖音登录成功后关闭抖音,再次访问,发现他还是记得我,我仍处于登录状态,这是cookie在起作用。

当我们将账号和密码输入给服务器时,服务器会将你的账号和密码与数据库做对比,如果发现有该用户,就会response响应用户登录成功了,同时该响应里面有Set-Cookie字段,该字段的内容就是你的账号和密码。

浏览器发现response响应里面有该字段,就会利用自动保存cookie字段,当用户再次访问该服务器时,浏览器会自动将cookie里面的内容取出,并帮我们在请求报头添加Cookie字段,该字段的内容就是你之前输入的账号和密码,这样我们第一次登录后,后面都不需要再次登录。

同时后续访问时,request请求报头就自动添加上了Cookie 

但是如果仅仅只有cookie,有坏人想截取我的http请求可太简单了,直接获取到我的用户名和密码,拿着我的账号去干坏事,这样肯定不好。

因此服务器在我登录之后,会把我输入的数据保存到session中,同时通过键值对的唯一性,响应回来的Set-cookie为这个session的id值,这样客户端就收到一个Set-cookie:sessionid。以后就不用在明文传输,而是依靠这个sessionid进行验证用户了。

当然这样我们能保证自己的账号不会被盗,但是别人依然可以利用sessionid去干坏事,比如把账号里面的记录删一删等等,因此还是得需要服务器通过判断客户端的ip地址是否一致、或者sessionid持续时长等来更好的保护客户端(使用者)。

重要报头字段

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

目前已经能通过http进行数据传输了,但是黑客仍然有各种办法截取用户的信息,因此需要对http进行加密,提出了https。https我们下一章见!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速优雅的免费申请和搭建属于自己的服务器

今天来讲一下如何快速优雅的搭建属于自己的服务器,我们以阿里云的云服务器为例,新用户一般是有三个月使用期限。 首先我们进入官网,选择云服务器ecs 链接直达:https://cn.aliyun.com 打开网页后,往下滑,然…

「AIGC」Python实现tokens算法

本文主要介绍通过python实现tokens统计,避免重复调用openai等官方api,开源节流。 一、设计思路 初始化tokenizer使用tokenizer将文本转换为tokens计算token的数量二、业务场景 2.1 首次加载依赖 2.2 执行业务逻辑 三、核心代码 from transformers import AutoTokenizer imp…

ssrf初步

一,简介 全称:Server-Side Request Forgery(中文:服务器端请求伪造) 攻击者从服务端发起请求,让服务器连接任意外部系统,从而泄露敏感数据。主要利用各种协议的请求伪造,例如php协…

战网国际服怎么下载 暴雪战网一键下载安装图文教程

战网国际版,或称为Battle.net全球版,是暴雪娱乐构建的一项跨越国界的综合游戏交流平台,它无视地理限制,旨在服务全球每一个角落的游戏爱好者。不同于地区专属版本,国际版为玩家开启了一扇无门槛的大门,让每…

char x[]---char*---string---sizeof

字符串数组 #include <iostream>int main(){char c_str[]"abcd";char c_str1[]{a,b,c,d};std::cout<<sizeof(c_str)<<std::endl;std::cout<<sizeof(c_str1)<<std::endl;return 0; } char*存储的字符串个数 char*字符串所占字节大小 c…

Hadoop3:HDFS副本节点选择逻辑讲解

一、副本节点选择&#xff08;机架感知&#xff09; 说明 第一个副本&#xff0c;因为我们的client可能是web页&#xff0c;也可能是shell终端。 如果是web页&#xff0c;则随机选取一个节点&#xff0c;如果是shell终端&#xff0c;则选择当前shell终端所在的节点。 节点距离最…

【计算机毕业设计】springboot分类信息服务平台移动端的设计与实现

分类信息 服务平台设计的目的是为用户提供活动信息、活动记录等方面的平台。 与PC端应用程序相比&#xff0c;分类信息服务平台的设计主要面向于移动端&#xff0c;旨在为管理员和用户、商铺提供一个分类信息服务平台。用户可以通过Android及时查看活动信息等。 分类信息服务平…

Linux守护进程

进程组和会话在 UNIX 系统中是非常重要的概念&#xff0c;特别是在进行作业控制和终端会话管理时。下面是关于进程组和会话的详细解释&#xff1a; 进程组&#xff08;Process Group&#xff09; 定义与作用&#xff1a; 进程组是一个或多个进程的集合&#xff0c;这些进程通常…

Android系统不同版本存储权限

一、Android存储简介 Android系统分为内部存储和外部存储 从Android6.0开始不断在更新存储&#xff08;读写&#xff09;权限&#xff0c;除了在AndroidManifest.xml文件里声明&#xff0c;app运行时也要动态申请使用对应的权限 提醒&#xff1a;应用私有存储不需要动态申请权…

一种基于电场连续性的高压MOSFET紧凑模型,用于精确表征电容特性

来源&#xff1a;A Compact Model of High-Voltage MOSFET Based on Electric Field Continuity for Accurate Characterization of Capacitance&#xff08;TED 24年&#xff09; 摘要 本文提出了一种新的高压MOSFET&#xff08;HV MOS&#xff09;紧凑模型&#xff0c;以消…

【C++】:string类的基本使用

目录 引言一&#xff0c;string类对象的常见构造二&#xff0c;string类对象的容量操作三&#xff0c;string类对象的访问及遍历操作四&#xff0c;string类对象的修改操作五&#xff0c;string类非成员函数六&#xff0c;整形与字符串的转换 引言 string 就是我们常说的"…

JSP技术

前言&#xff1a;虽然现在Vue盛行&#xff0c;但是对于初学者和一些项目我们还是采用jsp技术来编写前端代码&#xff0c;一些老的项目也需要jsp去维护。就像老师说的法国的银行系统还是采用COBOL这种古老语言。本篇文章主要介绍jsp技术。 目录 一、概述 &#xff08;1&#…

思科模拟器--2.静态路由和默认路由配置24.5.15

首先&#xff0c;创建三个路由器和两个个人电脑。 接着&#xff0c;配置两台电脑的IP&#xff0c;子网掩码和默认网关 对Router 0&#xff0c;进行以下命令&#xff1a; 对Router进行以下命令&#xff1a; 对Router2进行以下命令&#xff1a; 本实验完成。 验证&#xff1a;PC…

【嵌入式大赛应用赛道】机械手臂

电机 进步电机&#xff1a;它的转动是以确定的步数进行的&#xff0c;只要计算好脉冲数量和频率&#xff0c;就可以准确预测和控制电机的转动角度、速度以及停止的位置 伺服电机&#xff1a;将输入的电信号&#xff08;如电压或电流指令&#xff09;转换成轴上的精确旋转运动…

Golang RPC实现-day02

导航 Golang RPC实现一、客户端异步并发多个请求1、 客户端结构体2、 一个客户端&#xff0c;异步发送多个请求&#xff0c;使用call结构体代表客户端的每次请求3、客户端并发多个请求4、客户端接收请求 Golang RPC实现 day01 我们实现了简单的服务端和客户端。我们简单总结一…

docker-compose部署gitlab

需要提前安装docker和docker-compose环境 参考&#xff1a;部署docker-ce_安装部署docker-ce-CSDN博客 参考&#xff1a;docker-compose部署_docker compose部署本地tar-CSDN博客 创建gitlab的数据存放目录 mkdir /opt/gitlab && cd mkdir /opt/gitlab mkdir {conf…

石碑之谜:滚动机关

描述 在蒙德和璃月的边界地带&#xff0c;有一个被遗忘的神庙&#xff0c;里面有一个奇怪的机关&#xff1a;滚动石碑。小熊必须操作这个112的长方体石碑&#xff0c;使其通过不同的地面环境&#xff0c;最终放置到神秘的符号“O”上&#xff0c;以解开通往宝藏的大门。 石碑…

如何使用JMeter测试导入接口/导出接口?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 今天上班&#xff0c;被开发问了一个问题&#xff1a;JM…

OpenHarmony标准设备应用开发(二)——布局、动画与音乐

本章是 OpenHarmony 标准设备应用开发的第二篇文章。我们通过知识体系新开发的几个基于 OpenHarmony3.1 Beta 标准系统的样例&#xff1a;分布式音乐播放、传炸弹、购物车等样例&#xff0c;分别介绍下音乐播放、显示动画、动画转场&#xff08;页面间转场&#xff09;三个进阶…

TypeScript学习日志-第二十四天(webpack构建ts+vue3)

webpack构建tsvue3 一、构建项目目录 如图&#xff1a; shim.d.ts 这个文件用于让ts识别.vue后缀的 后续会说 并且给 tsconfig.json 增加配置项 "include": ["src/**/*"] 二、基础构建 安装依赖 安装如下依赖&#xff1a; npm install webpack -D …