应用层
满足我们日常需要的网络程序,都是在应用层,能够根据自己的需求设计应用层协议
1.具体如何自定义协议?
1.根据需求,明确传输什么信息
例如一个外卖网站
请求:用户的位置,id等等
响应:商家的id,名字,位置,价格,评分等等
2.约定信息组织的格式(有很多格式)
1)行文本形式
一个请求响应有多行构成,响应每一行都是一个商家,每行包含某个商家信息
1,肯德基(国贸店),北京市朝阳区建国门外大街,25,4.8
2,麦当劳(万达店),北京市朝阳区建国路99号,22,4.7
3,星巴克(中环店),北京市朝阳区光华路,35,4.9
2)通过xml格式约定
xml和html都是由成对的标签构成的键值对结构,html是固定的,而xml可以自定义
优点:可读性好
缺点:冗余信息多,网络传输中消耗带宽多
<response>
<shop>
<shopId>1</shopId>
<shopName>肯德基(国贸店)</shopName>
<shopLocation>北京市朝阳区建国门外大街</shopLocation> <deliveryPrice>25</deliveryPrice>
<score>4.8</score>
</shop>
<shop>
<shopId>2</shopId>
<shopName>麦当劳(万达店)</shopName>
<shopLocation>北京市朝阳区建国路99号</shopLocation> <deliveryPrice>22</deliveryPrice>
<score>4.7</score>
</shop>
</response>
3)json当下最流行的网络数据组织方案
优点:可读性强
缺点:还是存在冗余信息
{
"shopList": [
{
"shopId": 1,
"shopName": "肯德基(国贸店)",
"shopLocation": "北京市朝阳区建国门外大街",
"deliveryPrice": 25,
"score": 4.8
},
{
"shopId": 2,
"shopName": "麦当劳(万达店)",
"shopLocation": "北京市朝阳区建国路99号",
"deliveryPrice": 22,
"score": 4.7
}
]
}
4)protobuf
基于二进制格式对数据进行压缩,性能要求高的时候使用
优点:不涉及冗余信息,带宽消耗最少
缺点:可读性变差
binary: 08 01 12 05 e5 8c 97 e4 baac ...
约定一定二进制数据,哪几个字节表示哪个信息
除了自定义的协议还有固定好的协议:
2.HTTP协议:
客户端发一个请求,服务器返回一个响应,如浏览器打开网页就是典型一问一答场景
HTTP的报文格式要通过抓包工具 进行学习,它能够获取到网络的数据包,把详细的格式解析出来。抓包工具相当于代理,电脑上所有的网络通信,都会先发给抓包程序,抓包程序再把数据转发给服务器.
HTTP是一个文本格式的协议
请求:
1.首行
2.请求头
3.空行
4.正文

响应:
1.首行
2.响应头
3.空行
4.正文

每个部分是有什么组成?有什么意义?
请求
2.2.1首行
URL
URL是互联网用来标识资源位置的地址,俗称网址,存在于HTTP请求的首行中
例如:


URL本身有一些特殊的符号代表不同的含义,如果直接传输,可能使得网络请求不能正常被解析,此时URL的转义功能可以解决这个问题。
URL编码转义:将URL中 的特殊字符、非ASCLL字符转换为无歧义的ASCLL格式,保障网络请求正常解析的标准机制
认识方法
| 方法 | 用途 | 数据位置 | 幂等 | 缓存 |
|---|---|---|---|---|
| GET | 查询、获取资源 | 请求一般没有body,一般通过query string传递 | ✅ | ✅ |
| POST | 创建资源,传输实体主体 | 请求带有正文,正文就是保存当前上传数据内容 | ❌ | ❌ |
| PUT | 传输文件 | 请求体 | ✅ | ❌ |
| PATCH | 部分更新 | 请求体 | ✅ | ❌ |
| DELETE | 删除资源 | 无 / URL | ✅ | ❌ |
| HEAD | 仅获取响应头 | - | ✅ | ✅ |
GET和POST是最常用的方法,二者区别:
1.语义层面:
二者本质没有区别,技术底层是同一种TCP数据报,实际开发的时候可以混用,但是为了可读性和安全来说,我们约定GET用来"拿",比如获取html,获取css,获取js等操作,POST用来"给",比如登录,上传文件等操作。
2.携带数据的方式:
GET也可以通过query string进行传递,POST也可以通过正文进行传递,只是更加少见。
3.GET请求建议设计成幂等(请求一样响应一样),POST无要求
4.GET设计成幂等,就可以允许GET请求的结构被缓存,POST由于不要求幂等,经常不缓存,就被认为是不能被缓存的
三大误区:
1.POST比GET安全?
在登录的场景,GET直接将用户名和密码写在了url的query string里面,就显示在浏览器地址栏了,那POST写在正文就安全吗,通过抓包依然可以看见,关键是要加密传输
2.GET传输数据有限制?
在上古时代,IE浏览器时代对URL的长度有限制,如果传输数据太长可能会截断,但是现在浏览器/服务器已经没有这种限制了
3.GET只能传输文本,POST可以传输二进制?
GET确实url只能放文本,但是可以把二进制通过base64转码成文本,而且GET也不是完全不能带正文。
2.2.2报头header

1.Host
**表示服务器主机的地址和端口,表示当前请求访问的服务器在哪,**服务器收到请求后可以校验URL目标地址是否与加密Header中的Host值是否一致,防止请求被劫持、篡改。
Host: ip地址(域名):端口号
2.Content-Length
表示body中的数据长度,单位是字节
请求:
1.首行
2.请求头
3.空行
4.正文
对于TCP来说一个连接可以发送多个请求,服务器收到数据就要区分,从哪里到哪里是一个完整的的http请求数据,没有正文的请求,直接通过空行就可以知道哪里结束,但是有正文就只能通过header中的Content-Length,知道就接下来读取固定字符的长度。
3.Content-Type
表示请求body的数据格式,提示接受方如何解析正文的数据。
因为HTTP能够携带的数据种类有很多种。
例如如下格式:HTML: text/html 浏览器就会解析其中标签,把标签转换成页面
CSS:text/css 浏览器就会解析其中选择器和属性,并且把这里指定的内容应用到页面的样式
JS:application/javascript 浏览器就会通过js引擎解释js中的逻辑
JSON: applicatoin/json 浏览器不会做任何处理(根据对应js程序员逻辑)
图片:image.png 浏览器按照图片二进制格式解析并且显示
4.User-Agent(简称UA)
包含了用户使用的浏览器和操作系统的情况。
因为不同的用户使用的浏览器不同版本不同,旧的浏览器支持功能少,新的支持功能多,所以服务器可以通过UA里面的版本号,区分用户最多支持哪些属性。新的浏览器可以返回功能多的网页,体验丰富;旧的返回功能少的。保证正确显示。
对于现在大家使用浏览器都差不多,但是UA还可以用来区分用户的设备,是PC还是手机之类的,从而返回适应用户页面的版本。
5.Referer
描述当前页面的来源,这个页面是从哪个页面进行跳转来的
用途:
防盗链:服务器通过校验.Referer只允许本站域名的请求访问图片/视频等资源
广告系统:通过Referer知道提供流量方到广告平台的点击数据
6.Cookie
浏览器展示页面过程中,页面虽然可以通过js实现一些逻辑,但是js代码无法访问你的硬盘,但是实际开发中希望保存一些数据到硬盘。浏览器引入cookie机制(cookie提供键值对机制 )进行存储客户端数据,不是让网页代码直接访问文件系统,而是做了一层抽象,
例如一个登录业务cookie就是后端给浏览器发送的身份小纸条,js无法访问本地硬盘,但实际开发要在客户端存储身份标识等数据,用于后续请求时把cookie键值对放到请求cookie header中传输向服务器证明身份。

HTTP响应
认识状态码
200 OK
表示成功
404Not Found
访问资源没找到
URL
IP定位到程序
port定位到程序
path定位程序管理的资源
403 Forbidden
访问被拒绝(没有权限)
405 Method Not Allowed
请求的方法和服务器这边声明的注解不匹配,就会出现405
500Internal Server Error
服务器出错,服务器处理逻辑的代码中抛出异常,没有catch
504Gateway Timeout
超时,服务器资源紧张容易出现
302 Move temporary
重定向,访问服务器A,A让你访问B服务器,例如迁址,服务器在新域名,给旧域名设置重定向,可以重定向到新域名。
2xx->视为成功
3xx->视为重定向
4xx->客户端出错
5xx->服务器出错
HTTPS 加密解密
| 特性 | HTTP | HTTPS |
|---|---|---|
| 传输方式 | 明文 | 加密(SSL/TLS) |
| 端口 | 80 | 443 |
| 安全性 | 低,易被窃听 / 篡改 | 高,防窃听、防篡改、身份认证 |
| 证书 | 无需证书 | 需要 CA 机构颁发的 SSL 证书 |
1.对称加密:加密解密使用同一个密钥
1.非对称加密:加密使用一个密钥,解密使用一个密钥,公钥加密私钥解密还是相反都可以
3.中间人攻击
4.引入证书



为什么不都用非对称加密?
对称加密:速度快,开销小,适合针对大量数据进行加密
非对称加密:速度满,开销大,适合加密小数据,不然耗时极大

如果黑客修改证书的公钥,那么后面算出的校验和不同
如果黑客自己申请一个证书,那么证书里面的域名肯定与url的域名不同
这些都会导致浏览器弹出红色页面,提示网络不安全,是否继续访问
