前言
Linux网络通信环境中的应用层是直面程序员的一层,应用程序是程序员开发的,所以应用层的协议都是程序员自己定制的。
一:自定制协议
自定制协议:程序员根据应用的特点来根据数据的格式、数据的描述信息定义协议。
1.1 举例:网络版计算器
功能:客户端发送两个数字以及一个运算符给服务端,服务端获取到数据后运算完成返回结果。
三个数据对象:int num1、int num2、char op
1. 将所有数据转换成字符串并使用特殊字符间隔
num1 ;num2 ;op ;这样就将数据按照指定格式组织起来了。
2. 采用结构体构造二进制数据对象
struct cal_t:结构体中存放数据成员num1、num2、op
cal_t tmp:定义对象tmp,tmp.num1、tmp.num2、tmp.op进行赋值
数据解析:将数据按照结构体的格式进行解析
优点:自动约定数据的格式,不用将数据进行类型转换,将多个对象构造成一个数据对象进行传输。
1.2 序列化与反序列化
序列化:将各个数据对象按照指定的协议组织成为持久化存储或者数据传输的二进制数据串。(组织)
序列化方式:json序列化、protobuf序列化、二进制序列化(结构体),选择一个合适的序列化方式需要考虑解析性能及传输性能等多方面的因素。
反序列化:将二进制数据串按照指定协议解析得到各个数据对象。(解析)
二:HTTP协议
HTTP协议也叫超文本传输协议,早期用于传输超文本数据HTML。
HTML称为超文本标记语言,是一种标识性的语言,它通过标记符号来标记要显示的网页中的各个部分,网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的内容。
2.1 网址
网址:统一资源定位符(URL),在网络中唯一定位服务器上的某个资源,向指定服务器请求指定资源。
如下图以百度为例进行分析:
2.2 HTTP协议格式
HTTP协议格式:不论是请求信息还是相应信息都包含 1.首行、2.头部、3.空行、4.正文
fiddler:浏览器和服务器之间的通信抓包工具(代理)
wireshark:网卡抓包工具,抓取流经网卡的所有数据流量
2.2.1 首行(三种信息、空格间隔、换行结尾)
- 请求首行: GET http://124.156.68.35/admin HTTP/1.1
1.请求方法
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求实体资源(指定的页面信息),将数据作为查询字符串放到URL中提交,长度有限制,不安全 |
2 | POST | 向指定资源提交数据进行处理请求(提交表单或者上传文件),将数据存放于正文中提交,长度无限制,安全 |
3 | HEAD | 类似于GET请求,请求实体资源,只不过返回的响应中没有具体的内容,用于获取报头 |
4 | PUT | 传输的数据取代指定文档内容 |
5 | PATCH | PUT方法的补充(对已知资源进行局部更新) |
6 | DELETE | 请求服务器删除指定页面 |
7 | OPTIONS | 允许客户端查看服务器的性能 |
8 | TRACE | 回显服务器收到的请求(用于测试或诊断) |
9 | CONNECT | HTTP1.1中预留给能够将连接改为管道方式的代理服务器 |
2.URL
网址:统一资源定位符(URL),在网络中唯一定位服务器上的某个资源,向指定服务器请求指定资源。
3.协议版本
序号 | 版本 | 特性 |
---|---|---|
1 | HTTP 0.9 | HTTP协议格式不完整,仅用于传输HTML数据,仅支持GET请求方法 |
2 | HTTP 1.0 | 正式规定了HTTP协议格式,支持传输不同文件格式的数据流,支持GET、POST、HEAD请求方法 |
3 | HTTP 1.1 | 支持长连接管线化传输,在HTTP 1.0的基础上支持更多的请求方法 |
4 | HTTP 2.0 | 采用二进制流传输(之前都是明文传输)并且进行多路复用,还允许服务端向客户端主动推送消息 |
HTTP基于在传输层TCP实现通信,TCP是面向连接的。
短连接: 建立连接发送请求,得到响应之后关闭连接。
长连接: 一次连接可以发送多条请求,请求各种各样的信息。
管线化传输: 连续发送多条请求,按顺序进行响应,提高信道的利用率,但是会队头阻塞。
多路复用: 连续发送多条请求,响应顺序不用与请求顺序保持一致(头部中标识了请求信息),大大提高信道的利用率。
- 响应首行:HTTP1.1 303 SeeOther
1.协议版本
HTTP 0.9、1.0、1.1、2.0等版本上面表格进行了详细讲解
2.响应状态码
响应状态码表示服务端对本次请求的处理结果
序号 | 状态码分类 | 描述 |
---|---|---|
1 | 1×× | 描述信息,服务器收到请求,需要请求者继续执行操作 |
2 | 2×× | 请求成功,请求被成功接收并处理 |
3 | 3×× | 重定向,需要进一步操作完成请求 |
4 | 4×× | 客户端错误,请求包含语法错误或无法完成请求 |
5 | 5×× | 服务器错误,服务器在处理请求的过程中发生错误 |
注意:
200: 请求成功
301为永久重定向: 请求的资源被永久移动到新的URL中,客户端后来使用更新的URL。
302为临时重定向: 请求的资源被临时移动到新的URL中,客户端继续使用原有的URL。
400: 请求错误、404: 请求的资源不存在
500: 服务器内部错误、502: 代理请求失败、504: 代理请求超时
3.状态码描述
对状态码的描述信息,可以是官方文档对应描述也可以是自定义描述。
2.2.2 头部(由key : val的键值对组成)
- 请求头部: 描述请求的关键字段信息
序号 | 关键字段 | 描述 |
---|---|---|
1 | Connection | 控制本次请求为长连接(keep-alive)还是短连接(close) |
2 | Cache-Control | 缓存控制,下一次不用再请求服务器,直接从缓存种读取 |
3 | User-Agent | 客户端的属性信息 |
4 | Accept | 描述自己所能接收的数据属性 |
5 | Content-Length | 描述正文的数据长度(何时结束) |
6 | Content-Type | 描述正文的数据类型(如何处理) |
7 | Referer | 请求跳转的源地址 |
- 响应头部:描述响应的关键字段信息
序号 | 关键字段 | 描述 |
---|---|---|
1 | Connection | 本次请求为长连接还是短连接 |
2 | Content-Type | 描述正文的数据类型(如何处理) |
3 | Transfer-Encoding | 传输编码,不确定正文长度,将正文chunked分块传输 |
4 | Expires | 数据的过期时间 |
5 | Location | 搭配3** 状态码使用(资源重定向的新位置) |
- Cookie和Set-Cookie的作用
Cookie:客户端通过Cookie向服务端传递信息
Set-Cookie:服务端通过Set-Cookie向客户端传递信息
客户端发出请求,服务端会为每个登录的客户端创建一个Session(会话),保存当前的会话信息、客户端认证信息存储到数据库中,Session保存在服务端,并且会生成一个Sessionid(会话id),服务端给客户端响应时,响应头部中会有Set-Cookie信息,Sessionid,客户端收到响应后,将Sessionid存入到Cookie中,在客户端每次通信时,请求头部信息中都有Cookie,Cookie中有sessionid,服务端获取到sessionid后,就能通过sessionid找到对应的客户端信息,解决了HTTP协议是一个无状态协议的弊端,实现了状态的保持。另外Session的产生,解决了Cookie不安全的问题,敏感的信息放在服务端保存的Session当中。
- Cookie和Session的区别
Cookie是一种小型文本文件,用来辨别用户身份,进行Session跟踪而保存在客户端上的数据,保存的是服务器返回给自己的关键信息。
Session是一种会话控制,服务器为客户端建立的会话,其中保存特定服务端会话所需的属性以及配置信息。
Session保存在服务端而Cookie保存在客户端。
2.2.3 空行
空行就是用来间隔头部与正文的
2.2.4 正文
正文就是客户端提交给服务器的数据或者服务端响应给客户端的实体资源