Http协议解读,运营商劫持

上一篇文章中写到了TCP协议的一些特点,这篇文章对http协议的大体内容做出一些解释,同时,更详细的协议参照RFC文档。这里写官方一点

http协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,就是客户端和服务器进行数据传输的一种规则。

Http协议

首先 先了解一下Http协议的基本格式,http是平时我们在使用浏览器过程中很常见的一个协议。下面的协议不一定是真实存在的,仅仅用作说明

  • http://www.baidu.com:8080/stu/demo?id=1#ch1

上面是一条字节随便写的http协议, 其中

  1. http: 表示协议名,也就是使用的协议
  2. www.baidu.com 表示域名或者IP地址(是同一个内容 域名用NAT技术转变之后就是IP)
  3. 8080 表示端口号,平时很多时候没有写的话就是使用的http默认端口号80
  4. /stu/demo 表示访问的文件目录,如果省略该部分访问则是/ 根目录,因为服务器也是有组织的是一个树形结构。根节点一般对应服务器主页。(一般的约定,开发者遵不遵守不确立了)
  5. ?id=1 ? 号后面的表示查询字符串 这个是程序员自己定义的,不是开发者一般不知道别人定义的是啥意思。
  6. ch1 表示的是片段表示符,是前端的内容,我也不太了解,平时也不怎么常见,但大概的作用好像是用来记录当时网页所到的位置。

对于上述部分,很多内容是可以省略的。正因为这个灵活的特性,http协议被广泛应用现在。

url encode

当我们在www.baidu.com搜索C++为例

可以看到,搜索之后在查询字符串中C++变成了C%2B%2B,这是为什么呢,其实这个和编程中的反斜杠的含义差不多

因为在在查询字符中 可能会有一些特殊符号,同时这些特殊符号在url中本身就有一定的特殊含义,所以我们需要对一些特殊符号进行处理,来保证浏览器解析成功。 

所以这里的url encode本质是一个转义字符。

  • 转换规则,把每个需要转义的内容的二进制数据的每个字节都用十六进制来表示,然后再前面加上百分号就好了。

“ + ”号的assic码值就是0x2B

方法

有些学后端的同学可能,经常使用到方法,但是问具体是什么可能也不是很清楚。 方法就是描述当前http协议大概是干什么的,也是一种约定方法

不一定要遵守后面约定,说明板块只是表示最好是干嘛。但具体内容还是有程序员设计的。很多时候设计的过程中,开发者都会放飞自我。

但是大部分开发中,get和post2个方法独占9成使用率,剩下的方法占剩下一成的使用率。

  • get方法,一般会将自定义参数放到查询字符串中(query string) body一般是空的
  • post方法,一般会将自定义参数放到body中 ,查询字符串是空的。

最大的差别就是用户在访问中能不能直接看到。

一些GET和POST方法的误区

1.get数据有长度限制
本人在对一些网络资料进行阅读的时候,看到好多都说,长数据使用post,因为get方法的url有长度的限制,但是在 RFC文档中明确指出了对url的长度不做任何的限制 ,但是在以前计算机资源短缺的情况下,在浏览器中确实有长度限制,但具体限制的多少,取决于浏览器

2. post比get方法安全
首先先明确一点安全的定义( 安全是指,在网络通信的过程中,数据不容易被黑客截取到,即使截取到了也不容易破解) 但是post请求只是保证了普通用户无法直接看到,对黑客完全没啥影响,保证安全的关键是加密

3. get是幂等的 post不是幂等的
这里先解释一个含义,什么是幂等,幂等就是每次相同的输入,输出的结果都能保持一致。就叫做幂等。 就比如gpt在运行过程中,就不能是幂等的,就是每次问相同的话,出来的结果就不同。
       这句话出自RFC文档,当时上面写的是建议这么设计,就是实际开发中,是否遵守,另当别论所以说太绝对了就是不对的。

4.get可以缓存 post不能缓存
这一个机制其实是承接上述幂等的,因为在网页请求的过程中,有些操作可能很耗时,所以与其每次都进行计算机,不如直接缓存下来,但是缓存的前提是幂等,幂等就涉及到上述内容,所以说太绝对的话也是不对的。

这一段想讲的核心其实是,学到的每一个知识都应该要有自己的理解和判断,而不是看到网上说什么,八股是什么就直接去背。

请求报头

headers

这就是一条请求的报头 他也是键值对形式的结构每一行是一个键值对 同时键值对由 : 空格 分开 headers中的键值对是有标准规定的,但是查询字符串和body中的键值对就是开发者自己定义的了。

  • host:表示服务器主机的地址和端口号
  • Content-Length 描述了请求的body长度是多少个字节,如果有body这个字段必须要有
  • Content-type 描述了body中的请求格式 就是针对这个数据http该怎么解析 因为http用途广泛,传输的数据是很多的
  • User-Agent: 简称UA,表示浏览器和操作系统的属性,就是是什么浏览器和是什么操作系统发起的请求。 现在一般用来区分移动端和pc端
  • Referer:用来描述从哪里来的,通俗讲就是如果是通过浏览器的输出地址打开了一个网页,这时候的这个请求是不带referer的,但是如果是在一个页面通过跳转进入了另一个页面,此时这个请求所携带的referer就是当前网页的。

这里给大家讲一个故事,在浏览器中,一个利润非常高的板块就是广告了,百度的广告占了百度的很大一部分,但是广告商一般是怎么来统计广告的呢,一般就是通过referer,要是这个链接是通过百度点进来的,通过referer就统计百度这边一次,要是搜狗浏览器点进来的,就统计搜狗一次,最后通过有效点击次数的多少,来决定金钱的大小。但是Referer这个东西是明文传输的,是否会有人偷偷改这个referer呢,答案是肯定的,而且这一个现象在2014年左右特别的火,而且修改的人也就是大家人尽皆知的运营商(移动,联通,电信)

在请求路由的过程中是通过路由器(交换机)进行转发的,运营商完全有技术在其中加入一个程序,来分析是否是广告的跳转请求,要是是的话,就进行修改referer

而且运营商也有自己的广告平台,运营商可以把referer改成自己的平台,所以有很大的利润。比如一个用户通过搜狗点进的一个广告,此时运营商把referer改成了自己的运营平台,然后运营商就可以自己赚钱了,要是搜狗那边程序员发现对不上账,肯定也会对数据一条一条的进行查询,但是查不出来的话,就不了了之了。

这个故事就是著名的故事  运营商劫持 所以这是一个非常恶劣的事情。所以百度搜狗这些肯定会告运营商的,但是打官司的过程中,一边一直在拖。打官司肯定能打赢,但一边的法务就是一直托着。详细自己去百度。

d

当然除了法律上的武器,肯定还要采取技术手段,这里的技术手段就是我们后面要讲的https也就是http的加密传输一般就是2014年左右开始流行的。

  • cookie 是浏览器本地存储数据的一个机制 用户在网页操作的过程中会产生很多的数据,重要的数据会在服务器进行存储,但是有些数据是需要存储在用户电脑上的,而服务器不能对用户电脑的文件进行操作,此时就可以通过cookie进行一些键值对的存储,cookie中的值也是键值对的形式。 键值对之间用“ ;”号进行分割,键与值之间通过等号进行分割。
  • session 前面已经讲到了cookie 那肯定需要把session也单独拎出来,cookie是一个存储在浏览器的存储键值对的东西,而session则是存储在服务器中的,cookie在一个用户换了一个浏览器之后之后,就会全部清除,但是session即使在用户换了浏览器之后,也会保留,因为他是存储在服务器中的一个程序 并且在服务器中,每个用户都单独对应了一个session,一般是通过哈希表这类数据结构进行维护的

下一篇文章https

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

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

相关文章

OpenCV 入门(五) —— 人脸识别模型训练与 Windows 下的人脸识别

OpenCV 入门系列: OpenCV 入门(一)—— OpenCV 基础 OpenCV 入门(二)—— 车牌定位 OpenCV 入门(三)—— 车牌筛选 OpenCV 入门(四)—— 车牌号识别 OpenCV 入门&#xf…

Flask-大体了解介绍

初识Flask Flask是使用 Python编写的Web微框架。Web框架可以让我们不用关心底层的请求响应处理,更方便高效地编写Web程序。 Flask主要有两个依赖,一个是WSGI(Web Server Gateway Interface,Web服务器网关接口)工具集…

初期Linux

一,系统分为 1.1window系统 个人 :win7,win8,Win10,Win11服务器版:window server 2003,window server 2008 1.2Linux系统 centos7redhatubantukali 1.3什么是Linux? Linux是基…

【Qt QML】Qt Quick Scene Graph

Qt Quick 2是一个用于创建图形界面的库,它使用一个专门的场景图(Scene Graph)来进行渲染。通过使用OpenGL ES、OpenGL、Vulkan、Metal或Direct 3D等图形API,Qt Quick 2可以有效地优化图形渲染过程。使用场景图而不是传统的命令式绘…

数据库事务隔离级别及mysql实现方案

1、数据库的并发问题 以下几个概念是事务隔离级别要实际解决的问题,所以需要搞清楚都是什么意思。 脏读:读到了其他事务未提交的数据, 不可重复读:在一个事务内,多次读取的同一批数据出现不一致的情况。 幻读&…

RapidJSON介绍

1.简介 RapidJSON 是一个 C 的 JSON 解析库,由腾讯开源。 支持 SAX 和 DOM 风格的 API,并且可以解析、生成和查询 JSON 数据。RapidJSON 快。它的性能可与strlen() 相比。可支持 SSE2/SSE4.2 加速。RapidJSON 独立。它不依赖于 BOOST 等外部库。它甚至…

硬件设计 之 RS485通信协议简单介绍及RS485测试波形

1.RS485定义: 增强型低功耗半双工RS-485(Enhanced Low Power Half-Duplesx RS-485 Transceivers) RS-485是一种串行通信标准,也被称为EIA-485或TIA-485。它定义了在多个设备之间进行数据传输的电气特性、信号线路和通信协议。 2.RS485通信电平&#xf…

华为机考入门python3--(23)牛客23- 删除字符串中出现次数最少的字符

分类:字符串 知识点: 访问字典中keychar的值,不存在则返回0 my_dict.get(char, 0) 字典的所有值 my_dict.value() 列表中的最小值 min(my_list) 题目来自【牛客】 import sysdef delete_min_freq_char(s):# 计算字母出现的频次…

贪心算法应用例题

最优装载问题 #include <stdio.h> #include <algorithm>//排序int main() {int data[] { 8,20,5,80,3,420,14,330,70 };//物体重量int max 500;//船容最大总重量int count sizeof(data) / sizeof(data[0]);//物体数量std::sort(data, data count);//排序,排完数…

JSON++介绍

1.简介 JSON 是一个轻量级的 JSON 解析库&#xff0c;它是 JSON&#xff08;JavaScript Object Notation&#xff09;的一个超集。整个代码由一个单独的头文件json.hpp组成&#xff0c;没有库&#xff0c;没有子项目&#xff0c;没有依赖项&#xff0c;没有复杂的构建系统&…

FL Studio20.9水果安装及切换修改中文语言教程

前言 喜欢音乐制作的小伙伴千万不要错过这个功能强大&#xff0c;安装便捷的音乐软件哦&#xff01;如果你们已经下载好了这款软件的话&#xff0c;小编今天在这里就为大家详细讲解下如何安装FL Studio软件&#xff0c;一起来学习吧&#xff01; 注意&#xff1a; &#xff0…

Java_方法引用

方法引用就是把已经有的方法拿过来用&#xff0c;当作函数式接口中抽象方法的方法体。 条件&#xff1a; 1.引用处需要是函数式接口 2.被引用的方法需要已经存在 3.被引用的方法的形参和返回值需要跟抽象方法的形参和返回值保持一致 4.被引用方法的功能需要满足当前的要求 简…

《Fundamentals of Power Electronics》——示例:Buck-Boost转换器模型变为正则形式

为了说明正则电路模型推导的步骤&#xff0c;让我们将buck-boost转换器的等效电路操作成规范形式。buck-boost转换器的一个小信号交流等效电路如下图所示。 为了将上图所示网络转换成正则形式&#xff0c;需要将所有独立源d(t)转换到左侧&#xff0c;而将所有电感转换到右侧与变…

爬虫学习(3)豆瓣电影

代码 import requests import jsonif __name__ "__main__":url https://movie.douban.com/j/chart/top_list#post请求参数处理&#xff08;同get请求一致&#xff09;headers {"User-Agent": Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53…

HCIP的学习(OSPF总篇)

HCIA的复习 这边可以与我之前写的HCIA博客结合起来一起看&#xff0c;效果更好 HCIA的学习&#xff08;6&#xff09; OSPF状态机 down—关闭-----一旦启动OSPF进程&#xff0c;并发出hello报文&#xff0c;则进入下一个状态init----初始化状态------当收到的hello报文中存在…

Web实操(6),基础知识学习(24~)

1.[ZJCTF 2019]NiZhuanSiWei1 &#xff08;1&#xff09;进入环境后看到一篇php代码&#xff0c;开始我简单的以为是一题常规的php伪协议&#xff0c;多次试错后发现它并没有那么简单&#xff0c;它包含了基础的文件包含&#xff0c;伪协议还有反序列化 &#xff08;2&#x…

QT creator qt6.0 使用msvc2019 64bit编译报错

qt creator qt6.0报错&#xff1a; D:\Qt6\6.3.0\msvc2019_64\include\QtCore\qglobal.h:123: error: C1189: #error: "Qt requires a C17 compiler, and a suitable value for __cplusplus. On MSVC, you must pass the /Zc:__cplusplus option to the compiler."…

如何迁移Windows PC数据到统信UOS 1070

原文链接&#xff1a;如何迁移Windows PC数据到统信UOS 1070 Hello&#xff0c;大家好啊&#xff01;随着统信UOS 1070的推出&#xff0c;越来越多的用户和企业选择迁移到这个基于Linux的操作系统&#xff0c;以享受其安全性和稳定性的优势。今天&#xff0c;我们将探讨如何使用…

栈与队列(包括例题一道)

栈 栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO &#xff08; Last In First Out &#xff09;的原则。 压栈&…

5月7号作业

将一张bmp图片&#xff0c;修改成德国国旗 #include <stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <pthread.h>#include <…