文章目录
应用层
应用层负责应用程序之间的沟通,程序员可以自己对数据的格式进行约定,消息发送方和接收方都需要遵守这种约定。
应用层的典型协议:自定制协议;知名协议—HTTP协议
自定制协议
自定制协议:其实就是程序员自己定制的协议,程序员自己规定一种数据格式,按照这种数据格式进行网络通信,定制的同时要考虑数据的传输性能以及解析性能是否适合当前应用场景。
实例:网络计算器
原理:客户端将两个数字以及运算符传输给服务端;服务端对数据进行运算后,将结果返回给客户端。
使用结构体来组织数据:
struct data_t{
int num1; //操作数1
int num2; //操作数2
char op; //运算符
};
查看完整代码请移步我的github主页,ctrl+f 搜索:自定制协议:网络计算器
序列化和反序列化
序列化:组织数据:按照指定协议,将数据对象组织成为一个二进制数据串,用于网络传输
序列化方式:结构体二进制序列化、json序列化,protobuf序列化…
反序列化:解析数据:按照指定协议,将一个二进制数据串解析得到数据对象
☆HTTP协议
http协议----超文本传输协议----html、xml;
特性:
http是一个明文字符串传输协议;
http是一个应用层协议,在传输层是基于tcp协议实现的;
http是一个简单的请求-响应协议;
http协议格式:
首行:请求行,响应行(包含本次请求与响应的关键性描述)
头部:对于请求或者响应或者正文的关键描述;由一个个键值对组成----key: value,每个键值对以 \r \n结束
空行:\r \n:以一个空白行间隔头部与正文
正文:客户端提交给服务端或者服务端响应给客户端的数据
首行:
请求行:
包含三个要素:请求方法 + URL(URI) + http版本协议 (用空格隔开)
最常用的请求方法:
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体(一个文件,图片等等);GET也可以用于提交数据,但是它提交的数据在URL中;GET没有正文 |
HEAD | 类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和已有资源的修改 |
注意:
- GET也可以用URL提交数据,但是不安全
- URL由长度限制
URL
URL,其实就是网址;Uniform Resource Locator----统一资源定位符,用于定位网络中的某个主机上的某个资源
组成:协议方案名称 : // (用户名:密码)@域名:端口 / 资源路径?查询字符串
http://user:passwd@ip:port/path?key=val&key=val
域名:服务器别名----要经过域名解析得到服务器IP进而访问服务器
资源路径:是一个相对根目录,不是绝对根目录;浏览器会进行过滤防止越界访问
查询字符串:提交给服务器的数据,由一个个键值对组成,键值对之间由 & 符号间隔
urlencode:编码----用户请求的资源路径或查询字符串中存在特殊字符,可能与URL中的特殊字符冲突
编码规则:将特殊字符的每个字节转换为16进制数字字符并前缀%;例如 : + ---->%2B
urldecode:解码----找到被编码过的字符进行解码,将紧跟%的两个字符转换为数字,第一个字符左移四位加上第二个数字
http协议版本:
0.9版本:最早期的版本,只支持GET请求方法,并且协议还没有当前的规范,只支持超文本数据传输。
1.0版本:支持了http协议格式,而且新增了GET、HEAD、POST请求方法,支持各种多媒体资源传输,简单的缓存控制
1.1版本:对1.0版本进行性能优化;支持更多的请求方法以及特性(支持长连接,更加完善的缓存方式,分块传输…)
2.0版本:由于1.1版本的http协议已经十分庞大,因此2.0版本不再新增特性,而是重新定义http协议(尚未普及)
- 使用二进制数据传输
- 支持主动推送资源
- 服务器进行长连接响应,不需要按序进行
短连接 长连接:
短连接:客户端在请求完一次资源后连接自动关闭,再请求资源时需要重新建立连接
长连接:可以在一次连接中多次请求资源,可以连续发送请求
响应行:
响应行:协议版本 + 响应状态码 + 状态码描述 \r\n (用空格隔开)
响应状态码:直观地向客户端反馈处理结果
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:
分类 | 分类描述 | 典型状态码 |
---|---|---|
1xx | 信息,服务器收到请求,需要请求者继续执行操作 | 101:协议状态切换码 |
2xx | 表示本次操作被成功接收并处理 | 200:请求成功;206:服务器处理了GET的部分请求 |
3xx | 重定向,表示本次请求的资源移动到了新链接处,但是原链接依然可用 | 301:永久移动;302临时移动 |
4xx | 客户端错误,请求包含语法错误或无法完成请求 | 404:所请求的资源不存在;414:所请求的URI过长,服务器无法处理 |
5xx | 服务器错误,服务器在处理请求的过程中发生了错误 | 502:代理服务器没有收到正确响应;504:响应超时 |
头部:
头部:关于请求或者响应或者正文的一些描述字段
组成:key:val\r\nkey:val\r\n
典型头部字段:
Connection:长短连接控制;keep-alive / close
Referer:记录本次请求的来源链接
Content-Type:用于表示正文的数据格式
Content-Length:用于表示正文的长度----http解决粘包问题的关键
Location:用于指定重定向的新链接地址,与3xx访问状态码搭配使用
cookie与session:设计的头部字段请求头Cookie,响应头Set-Cookie
- 一个客户端登录之后,服务端验证登录信息,成功后,通过Set-Cookie字段设置cookie信息(包括用户信息,状态…)返回给客户端
- 客户端收到响应后,将Set-Cookie字段的cookie信息保存起来,下次再请求该服务器时直接从cookie文件中读取cookie信息,然后发起请求
cookie是一个维护http通信状态的计数----但是存在安全隐患
解决方案:session
session是服务端针对每个客户端创建的会话,当客户端登陆成功后,创建会话,再会话中记录客户端的用户信息以及状态…,通过Set-Cookie字段将session_id 返回给客户端;用户的隐私信息一直保存在服务器中防止泄露。
空行:
空行就是一个\r\n,是与头部最后一个字段结尾的\r\n组成一个连续的\r\n\r\n作为特殊标志
标记http头部到此处结束;间隔头部与正文
正文:
针对不同的请求所提交或者响应的数据
http的实现
http协议是一个应用层协议,只是应用程序如何沟通的一种数据格式约定,其在传输层是基于tcp实现的
http客户端实际就是一个tcp客户端;http服务器就是一个tcp服务器
只不过http客户端与服务器的通信是通过http协议来约束的
简单的http服务器的处理流程:
- 搭建tcp服务器
- 获取新连接
- 使用新建连接等待接收数据(http协议格式的请求数据)
- 接受过程:先接收http头部,解析头部–Content-Length获取正文长度
- 接受指定长度的正文
- 根据请求方法和资源路径确定客户端的请求目的
- 进行对应的业务处理
- 组织http格式的响应数据,对客户端进行回复
- 如果时短连接,则直接关闭套接字;如果是长连接,继续等待接受请求
https协议
https协议:并不是一个新的协议,只是对http协议进行了一系列加密操作,其目的是为了实现数据的安全传输
加密方式:https协议是基于ssl加密进行的加密传输
实现安全传输需要考虑的两个问题:
- 身份验证问题:防止伪装
- 数据加密问题:防止窃听
ssl加密
ssl加密:将身份验证与数据加密传输合在一起
身份验证:
CA认证:
- 通信双方再通信前先到权威机构去申请一个CA证书(包含权威机构信息,和通信方自己的信息…)
- 通信双方建立连接后,在通信前将证书发送给对方
- 收到证书后,查看这个权威机构是否是自己信任的,如果是,则到这个机构进行身份验证;如果不是则可以自行判断是否要信任该证书
即使身份验证通过,也还是有可能被监听,所以需要对传输的数据进行加密。
数据的加密传输方式:
对称加密:加解密时使用同一个密钥
思路:在通信前将密钥发送给对方,对方使用该密钥对数据进行加密并返回给本机,然后本机再使用密钥进行解密得到原始数据。
优点:加解密效率高
缺点:一旦密钥被劫持,那么加密形同虚设非对称加密:加解密使用不同的密钥(公钥+私钥)
思路:通信中会生成一对密钥,公钥和私钥,在通信前将公钥发送给对方,对方使用公钥进行数据加密后传输,本机收到后使用私钥进行解密。
实现算法:RSA加密算法
优点:安全性更高
缺点:加解密效率低混合加密:
通信双方,先使用非对称加密保护对称密钥的协商过程。协商完毕后,使用对称密钥进行加密传输。
https加密流程
- 通信双方先各自生成一对密钥(公钥+私钥),到权威机构请求办法一个证书(证书内容包括:权威机构,本身机构,公钥信息,过期时间…)
- 通信双方建立连接后,将证书发送给对方
3.对证书进行解析,根据信息进行身份验证 - 身份验证通过后,使用公钥加密(一个随机数+自己支持的对称加密算法列表)发送给对方
- 对方收到数据后使用私钥进行解密,并且回复给我方一个随机数+自己支持的对称加密算法列表
- 双方通过自己的随机数与对方发送过来的随机数配合对称加密算法表进行计算得到一个对称密钥
- 往后通过这个对称密钥进行通信