网络原理 - HTTP / HTTPS

HTTP

超文本传输协议,目前最主流的一种应用层协议 ,大多数基于TCP协议实现

当我们浏览器中输入一个bing"网址"(URL)时,浏览器就给必应的服务器发送了一个HTTP请求,必应的服务器返回了一个HTTP响应。这个响应被浏览器解析之后,就展示成我们看到的页面内容(这个过程中浏览器可能会给服务器发送多个HTTP请求,服务器对应返回多个响应,这些响应里就包含了页面格式等信息)

协议格式

抓包工具的使用

左侧窗口显示了所有的HTTP请求/响应,可以选中某个请求来查看详情

右侧上方显示了HTTP请求的报文内容(切换到Raw标签页可以看到详细信息)

右下侧显示了HTTP响应的报文内容(切换到Raw标签页可以看到详细信息)

抓包工具的原理

正向代理: Fiddler相当于一个代理,浏览器要访问www.baidu.com时,就会把HTTP请求发给FiddlerFiddler再发给百度的服务器 ;当百度服务器返回数据时,Fiddler拿到返回数据再把数据交给浏览器

反向代理: Fiddler不直接访问百度服务器,而是访问中间服务器,通过百度服务器通过中间服务器与Fiddler进行请求和响应

抓包结果

请求:

首行: 请求方法+URL+版本号

请求头Header: 请求的属性,冒号 分隔的键值对,每组属性之间使用**\n分隔** 。遇到空行表示Header部分结束

Body:空行后面的内容 都是Body,Body允许为空字符串 ,如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度

响应:

首行:版本号+状态码+状态码解释

Header: 响应的属性冒号 分隔的键值对,每组属性之间使用**\n** 分隔。遇到空行表示Header部分结束

Body:空行后面的内容都是Body,Body允许为空字符串,如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度。如果服务器返回了一个html界面,那么html页面的内容就在body中

HTTP请求

URL

协议方案名: 常见的有http和https ,也有其他类型,比如访问mysql的jdbc:mysql。省略后默认http://

登录信息(用户名密码): 现在的网络一般不通过URL 进行验证,一般都会省略

服务器地址: 可以是域名 也可以是IP ,域名会被DNS系统 解析成一个具体的IP地址。在HTML中可以省略,省略后表示服务器的域名与当前HTML所属的域名一致

端口号:一般省略 ,浏览器会根据协议类型自动决定使用哪个端口号,http默认80端口,https默认443端口

带层次的文件路径: 表示要访问主机上哪个资源 (可以是一个硬盘上的文件,也可以是虚拟的资源),每一层就相当于一个目录 。可以省略,省略后默认**/.** 一些服务器发现是/.会自动访问**/index.html**

查询字符串: 对要访问的资源补充说明,也是键值对 结构,键值对之间使用**&** 分隔,键和值之间 使用 = 分隔,可以省略

片段表示符 :区分当前这个页面的哪个部分 ,用于页面内的跳转,可以省略

URL encode

像/ ? :这样的字符,已经被url当成特殊意义理解的,因此这些字符不能随意出现。所以说出现这些字符就要进行转义

汉字由UTF-8或者GBK这样的编码方式构成,也需要进行转义,防止浏览器把某个字节当作URL的特殊符号

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

方法(method)

GET方法:

用于获取服务器上的某个资源 ,在浏览器中直接输入url ,此时浏览器就会发送出一个GET请求 。HTML中的link,img,script等标签 ,也会触发GET请求

POST方法:

用于提交用户输入的数据给服务器

区别:本质没有区别可以混用使用方法和习惯上有区别

1. 语义不同 ,GET一般用于获取数据 ,POST一般用于提交数据

2. GET的body一般为空 ,需要传输的数据通过query string 传递,POST 的query string一般为空 ,需要传递的数据通过body传递

3. GET的请求一般为幂等 ,POST一般是不 幂等的(多次请求得到的都是一样的结果,则为幂等

4. GET可以被缓存 ,POST一般不能被缓存

补充:

1.语义: GET完全可以用于提交数据 ,POST也可用于获取数据

**2. 幂等:**标准建议GET实现为幂等,实际开发中不完全遵循这个原则(个性化推荐)

其他方法:

PUT与POST相似,只是具有幂等特性,一般用于更新

DELETE删除服务器指定的资源

OPTIONS返回服务器所支持的请求方式

HEAD 类似于GET,不返回响应体只返回响应头

报头(header)

header的整体的格式也是键值对结构,每个键值对占一行,键和值之间使用冒号分隔

Host:服务器地址和端口

Content-Length: 表示body中数据的长度 ,单位是字节

Content-Type: 表示请求的body中的数据格式,提示接收方如何解析body中的数据

User-Agent (简称UA ):表示浏览器/系统的属性

Referer: 表示这个页面是从哪个页面跳转过来的

Cookie: 存储一个字符串 ,里面通过键值对 的方式存储数据

浏览器展示页面的过程中,页面里虽然可以通过JS实现一些逻辑,但是JS无法访问硬盘文件 。cookie就是浏览器允许网页在本地硬盘存取数据的一种机制 -> 不是网页代码直接访问文件系统,而是访问cookie

来源:服务器自行通过JS写入 或者服务器在HTTP响应 中通过Set - Cookie字段返回给浏览器

HTTP响应

状态码(status code)

状态码表示访问一个页面的结果,以下是常见结果

200 OK

常见状态码,表示访问成功

404 Not Found

浏览器输入一个URL,目的就是访问对方服务器上的一个资源,如果这个URL标识的资源不存在 ,就会出现404

403 Forbidden

表示访问被拒绝 ,有的页面需要用户具有一定权限才能访问

405 Method Not Allowed

表示对方服务器不支持某种方法

500 Internal Server Error

**服务器出现内部错误,**一般是服务器的代码执行过程中抛出异常,但是没有catch到

504 Gateway Timeout

当服务器负载比较大的时候,服务器单条请求的时候消耗的时间就会很长,就会出现超时情况

302 Move temporarily

临时重定向

重定向:类似于呼叫转移功能,打某个号码自动转到另一个号码

总结:

HTTPS

HTTPS也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层 。HTTP协议的内容都是按照文本的方式明文传输的,这就导致传输过程中出现一些篡改情况

加密就是把明文进行一系列变换 ,生成密文

由于服务器是对多个客户端提供服务的,所以每个客户端都需要一个单独的密钥

对称加密: 加密和解密使用同一个对称密钥 ,但是如果密钥明文传输 ,就会被截获 ,这就引入非对称加密

运算速度快, 开销

非对称加密: 客户端使用公钥加密 ,加密内容只有服务器中的私钥能够解密

运算速度慢,开销大,所以在应用中只会通过非对称加密传输客户端生成的对称密钥,后期通过这个密钥进行对称加密传输

**公钥:**公开出的密钥

**密钥:**公司内部不公开的密钥

中间人攻击

客户端无法区分收到的公钥是服务器真实的公钥 还是被黑客篡改的公钥

引入证书

引入证书的目的就是让服务器判断收到的公钥是服务器的公钥,还是被串改过后的公钥,服务器在使用HTTPS前,需要向CA机构申请一份数字证书

  1. 服务器在搭建时,向有关机构申请证书

2. 因为证书里包含公钥 ,所以客户端先获取服务器的证书

如果对比结果相同,则证明信息没有被篡改,后续传输对称密钥使用公钥进行加密

中间人篡改证书

如果黑客对证书进行了篡改:

1. 对公钥篡改:计算的校验 和与数字签名解密后的校验和不一致

2. 对数字签名篡改: 黑客服务器没有认证机构的密钥 ,无法打包数字签名

中间人掉包证书

黑客证书中的URL客户端访问的URL不匹配

相关推荐
克莱因3582 小时前
思科 单区域OSPF(1
网络·路由·思科
Oll Correct2 小时前
实验十四:IPv4地址的无分类编址方法
网络·笔记
23zhgjx-ctl2 小时前
111111
网络·智能路由器
pshdhx_albert10 小时前
AI agent实现打字机效果
java·http·ai编程
古译汉书10 小时前
【IoT死磕系列】Day 9:架构一台“自动驾驶物流车”,看8种协议如何协同作战
网络·arm开发·单片机·物联网·tcp/ip·架构·自动驾驶
哼?~12 小时前
Linux--网络基础
网络
苏渡苇13 小时前
Docker 网络完全指南
网络·docker·容器·docker容器·容器通信
风曦Kisaki15 小时前
# Linux 磁盘查看命令详解:df 与 du
linux·运维·网络
攻城狮在此15 小时前
华为交换机Console口密码如何清除
运维·网络·华为