应用层:
直面程序员的一层,因为应用程序是程序员自己写的,因此应用层的协议都是程序员自己定的
自定义协议
程序员自己根据自己应用的特点,定义协议(数据格式/数据描述信息)
eg:以一个简单的网络版计算机为例
功能:客户端发送两个数字以及一个运算符给服务端,服务端获取到数据然后进行运算
int num1; int num2; char op;
- num1, num2, op ----将所有的数据转成字符串,使用特殊字符间隔;这时候就将数据按照指定协议组织起来了.
- 采用结构体构造二进制数据串
struct cal_t{ int num1; int num2; char op; };
序列化:将各个数据对象按照指定的协议组织成为持久化存储/数据传输的二进制数据串
反序列化:将二进制数据传按照指定协议解析等到各个数据对象
常见的序列化方式:json序列化/protobuf/二进制序列化
知名协议
HTTP协议: 超文本传输协议—早期专门用于传输超文本数据html,但是随着协议发展多元化,不限制数据格式
网站-统一资源定位符:URL----在网络中唯一表示定位一个资源
如何定位----URL中包含的元素:
协议方案名称://认证用户名:认证密码@服务器IP地址:服务器处理进程端口/请求的资源路径?查询字符串#片段标识符
http://username:password@www.xxx.com:80/index.html
服务器IP地址:
我们看得到不一定是IP地址,也可能是域名-服务器别名----通过域名解析服务器就能得到服务器的IP地址
服务器端口:
web服务器默认http服务器端口是80端口,默认不显示
/请求的资源路径:
资源在服务器上的路径,这里的/是http根路径,但是是一个服务器上的相对根目录,只是一个子目录
查询字符串:
客户端提交给服务端的一些数据,有key=val&key=val形式的键值对组成
查询字符串中不能出现特殊字符,因为URL中特殊字符都有特殊含义,一旦提交的数据中有特殊字符,就会造成歧义,因此若提交的数据中有特殊字符,则需要进行数据转义
urlencode: url编码,将特殊字符每一个字节,转换为16进制的数字字符,并且使用%前缀做为转移表示
urldecode:url解码,在url中遇到%,则认为气候两个字符需要转移,将第一个字符转换成数字乘以16/左移4位,加上第二个字符转换的数字
片段标识符
html中的一个标签id,直接跳转到页面的某个位置
HTTP协议实现:
抓包工具:wireshark / fiddler
wireshark:网卡抓包工具,抓取流经网卡的所有数据流量----什么包都能抓
fiddler:浏览器的代理工具,通过代理实现数据抓包-----专业的http抓包工具
HTTP协议格式:
请求:
首行: GET http://123.123.123.123/admin HTTP1.1 以空格进行间隔包含三个要素,并且最终以\r\n作为结尾
请求方法:GET/POS/HEAD/DELETE/CONNECT/OPTION
GET --请求实体资源,也可以通过url中查询字符串向服务器提交数据(数据不安全),但url长度有限制(各个服务器应用商的限制)
POST --主要用于向服务器提交数据,提交的数据在正文中(数据安全)
HEAD --类似于GET,相较于GET,HEAD只要响应头部,而不响应正文
URL: http://123.123.123.123
协议版本: HTTP1.1 0.9/1.0/1.1/2.0
0.9: 这时候的http仅用于传输html数据,并且只有get请求,并且协议格式不完整
1.0: 正式规定了http协议格式,并且增加了多种请求方式,并且支持了不同文件格式的数据流
1.1: 在1.0的基础上增加了更多请求方式和头部描述信息,并且支持长连接
2.0: 采用二进制流传输,并且进行多路复用,并且允许服务端主动推送数据
短连接: http基于在传输tcp实现通信,短连接指的是建立连接,发送一个请求,得到响应后,则关闭连接
长连接: 一次连接可以发送多条请求
头部:描述本次请求的关键字段信息,由key-val形式的键值对组成,并且每个键值对以\r\n作为结尾
Connection- -控制长短连接, Cache-control - -缓存控制, User-Agent - -客户端属性, Accpet - -描述自己所能接收的数据属性, Content-length - - 描述正文长度, Content-Type - -描述符正文数据类型, Cookie
Cookie: 早期http是短连接通信,是一个无状态协议,不会保存客户端状态,每次访问都需要进行登录,因此引入Cookie保存客户端状态。 Cookie中可以带有一些信息,持续在通信中描述客户端的通信状态,但是不够安全
空行:间隔头部于正文,\r\n 接收http数据的时候,当连续接收两个\r\n\r\n(\r\n\r\n)的时候,则认为头部信息到此结束
先获取完整头部,通过头部中的Content-Length获取正文长度,然后获取指定
正文:提交服务端的数据
响应
首行: HTTP/1.1 303 See other, 包含3个要素,以空格进行间隔,以\r\n作为结尾
协议版本: 0.9/1.0/.1.1/2.0
响应状态码: 表示本次的请求服务端做出的响应
1xx:描述信息
2xx:表示本次请求正确处理完毕
3xx:重定向 - -你请求的资源在另一个位置,要求客户端重新请求新的位置; 301 - 永久 302 - 临时
4xx:表示客户端请求错误; 400- -请求错误/ 404 - -表示请求的资源不存在
5xx:表示服务端错误; 500- -服务器内部错误/ 502- -代理请求失败/无效响应/504- -代理请求超时
状态码描述:对状态码的描述信息,可以是官方文档对应描述,也可以自定义
头部:关于本次响应的一些关键字段描述信息,以key-val键值对组成,以\r\n作为结尾
Transfer-Encoding:实体正文的传输方式
Expires:缓存过期时间
Location:重定向的新位置
Set-Cookie:服务端通过Set-Cookie向客户端传递信息,会被保存在客户端浏览器的Cookie文件中
Cookie:客户端通过Cookie文件读取数据通过cookie向服务端传递信息
Session:会话,服务端会为每个登录的客户端创建会话,在服务端描述一些信息(客户端身份信息,状态信息),保存在服务端,可以通过Cookie将session id返回给客户端,客户端每次通信都会通过cookie带又自己的session id;