HTTP协议

概述

超文本协议,可以传输文本和二进制数据(字符串)以及多媒体数据,典型的"一问一答"的模型

HTTP的应用场景

1)网页前端和服务器后端的通信

2)移动端app和服务器后端的通信

3)分布式系统服务器之间的调用

利用抓包工具,抓包是读取网卡上的内容从而让你看到请求和响应的数据明细,抓包就是相当于它们之间的代理

请求格式

|-----------------------------------------------------------------------------------------------------|
| 请求行:method URL version |
| 请求报头(header): key: value key: value .............. 有若干行,每一行都是键值对,此处的键值对都有特定含义,HTTP规定好的,键和值之间用:空格来分割 |
| 空行:说明header结束 |
| 请求正文 |

URL

唯一资源定位符,标识一个网络上的资源位置

|------------------------------------------------------------|
| http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch1 |

http:// :协议方案名

user:pass :登陆信息认证

www.example:服务器地址(IP地址,通常是域名,当然写IP地址也是可以的)

80:服务器端口号,如果没有端口号会给一个默认值,浏览器根据协议类型按照对应的分配知名端口号,这里并不是操作系统分配由空闲的端口号

dir/index.htm:带层次的文件路径,但这个目录结构可能是真实存在的,也有可能是通过代码逻辑虚构的目录结构,但你按照目录结构访问服务器也会返回数据

uid=1:查询字符串(query string),&:分割键值对,=:分割键和值,这里的键值对是程序员自定义的

ch1:片段标识符,一般用来区分一个页面上的不同部分

URL uncode

对于query string有时候是需要进行转码的,因为URL中有很多特殊符号有特定的含义,但是query string是由程序员自定义的,万一里面包含了特殊符号呢

转码规则:标点符号和中文字符一般要进行转义,把要转义的内容,把字节拿出来转换成十六进制,然后再每个字节前面加上%

方法 method

是为了表示这个请求要做什么动作

GET:从服务器上获取资源,这个方法通常没有正文

POST:把数据发送到服务器上,一般有正文

POST和GET的区别:

本质上没有区别,就是能使用GET的时候也能使用POST,反过来同理,在使用习惯上有所区别

1)GET通常表示"获取数据"的语义,POST通常表示"提交数据"的语义

2)GET通常给服务器传递的数据放到query string,POST通常放到body当中

关于POST和GET之间的说法

1)GET的请求一般实现成幂等,POST没有幂等的要求,如果请求的结果是幂等的话是可以做缓存的,

幂等就是如果这个请求多次重复产生的结果是明确的

2)GET请求不安全,POST请求更安全**(错误的)**

GET实现登录,用户名密码出现URL的query string,显示在浏览器的地址栏里,POST会显示在body中不会在界面上,但是安全的关键是加密

3)GET请求单词的数据量比POST要小++(不准确)++

4)GET请求只能传输文本数据,POST可以传输文本和二进制++(不准确)++

二进制数据可以通过base64/urlencode转成文本,GET就可以传输了,但URL中确实不能放置二进制数据

请求报头

HOST:服务器主机和端口

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

Content-Type:表示请求中body的数据格式,告诉服务器/浏览器怎么理解数据

Content-Length和Content-Type也可能出现在响应头中

Content-Type常见的取值:

text/html渲染网页的骨架

text/css渲染网页的样式

application/JavaScript执行js中的逻辑

application/json浏览器一般不自主处理,由浏览器的js负责

强制刷新(Ctrl+F5):涉及到浏览器缓存,强制刷新就可以从网络中获取,不读缓存了,浏览器通常会把变动频率低的数据保存到本机的硬盘上作为"缓存",下一次再访问同一个网站,就不必通过网咯获取这些数据,直接从硬盘上都就可以了

Uer-Agent:Mozilla/5.0 (Windows NT 10.0 ; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.6.8151 SLBChan/112 SLBVPV/64-bit

UA功能:

通过UA描述浏览器和操作系统的版本,对应着返回只有文本还是多媒体的网页

区分用户设备PC和手机

Refer:表示这个页面是从哪个页面跳转过来的,让服务器知道,和浏览器的前进后退没有关系

Cookie:一系列键值对,键值对用;分割,键和值用=分割

浏览器给网页提供的本地存储数据的方式,但对网页访问本地硬盘做出了限制

Cookie从服务器当中来,以键值对方式存储,根据域名划分,,每个域名都有自己的cookie,本地存储之后,访问同一个域名的网站,就会把cookie的内容通过请求报头传递给服务器

通过Cookie保护用户的登录状态:

响应格式

|--------------------------------------------|
| 状态行:version 状态码 状态码描述 |
| 响应报头: key: value key: value .............. |
| 空行 |
| 响应正文 |

状态码

301永久重定向(可以做缓存)

302临时重定向

重定向就是类似于呼叫转移,例如访问u1,就会跳转到访问u2

浏览器作为HTTP客户端虽然很强但是并不能够随性所欲的构造HTTP请求

HTTPS

在HTTP基础上,引入了一个加密层

对称密钥

一个密钥既可以加密也可以解密

非对称密钥

有两个密钥,假设分别为key1,key2,如果key1加密,那么key2就解密,如果key1解密,那么key就加密

一个密钥公开就是"公钥",另一个自己保存就是"私钥"

引入对称加密

引入非对称加密

中间人攻击

应对中间人攻击

引入证书

证书里面的内容:证书发布的机构,证书的有效期,公钥pub1,证书的所有者........以及签名

证书里面的签名相当于加密的校验和,就是先计算校验和,然后用公证机构自己生成的对称密钥pub3/pri3,pri3对校验和进行加密,得到签名

客户端验证证书的真实性:

1.客户端使用相同算法计算校验和,得到check1

2.客户端用pub3对签名进行解密,得到check2

3.若check1=check2则证书有效

相关推荐
yenggd6 小时前
华为多级m-lag简单配置案例
网络·华为
洲覆6 小时前
Redis 驱动适配 Reactor 模式
开发语言·网络·数据库·redis
white-persist6 小时前
什么是网络安全,网络空间安全有哪些安全?
服务器·网络·安全·web安全·网络安全·系统安全·安全架构
virelin_Y.lin6 小时前
系统与网络安全------弹性交换网络(4)
网络·安全·web安全·mstp
Ronin3057 小时前
【Linux网络】应用层自定义协议
linux·网络·应用层·序列化
一勺菠萝丶15 小时前
「您的连接不是私密连接」详解:为什么 HTTPS 证书会报错,以及如何正确配置子域名证书
数据库·网络协议·https
夕泠爱吃糖15 小时前
HTTPS与HTPP的区别
网络协议·http·https
2501_9159090615 小时前
“绑定 HTTPS” 的工程全流程 从证书配置到真机验证与故障排查
网络协议·http·ios·小程序·https·uni-app·iphone
报错小能手15 小时前
linux学习笔记(43)网络编程——HTTPS (补充)
linux·网络·学习