应用层简介
- 功能:定义了各种应用协议规范数据格式,如:HTTP协议、HTTPS协议、FTP协议、DNS协议、TFTP协议、SMTP协议;从而实现对不同的字节流进行识别和操作
- 信息存在形式:应用程序数据
HTTP协议
HTTP协议简介
HTTP(Hyper Text Transfer Protocol)超文本传输协议
HTTP协议基于TCP协议,默认80端口
功能:用来规定客户端和服务器的数据传输格式
特点:基于请求与响应模式的、无状态、无连接的应用层协议

HTTP报文
HTTP请求数据包构成
1. 请求行
请求行:请求方法 + URL(定位资源) + HTTP版本信息
HTTP请求方法
| 请求方法 | 含义 |
|---|---|
| GET | 请求读取由URL所标识的信息 |
| POST | 给服务器发送、提交数据 |
| HEAD | 请求读取由URL所有标识的信息的首部 |
| PUT | 在指明的URL下存储一个文档–restful–替换资源 |
| DELETE | 删除指明的URL所标识的资源 |
| CONNECT | 用于代理服务器 |
| OPTION | 请求一些选项的信息 |
| TRACE | 用来进行环回测试的请求报文 |
2. 请求头部
| 字段名 | 含义 |
|---|---|
| User-Agent | 产生请求的客户端类型:Windows,浏览器版本(内核) |
| Accept | 客户端可识别的内容类型列表 |
| Host | 请求的主机名,允许多个域名同处于一个IP地址,即虚拟主机 |
| Accept-Encoding | 客户端使用的编码环境和编码方式 |
| Accept-Language | 客户端语言环境 |
| Accept-Charset | 客户端接受的字符集 |
| Authorization | 授权信息,一般用于存放授权之后的信息 |
| Authentication | 客户端提供给服务器,进行权限认真的信息 |
| Connection | 表示是否需要持久连接 |
| Content-length | 表示请求数据正文即请求体的长度,GET请求一般没有此字段,因为你GET请求一般没有数据正文 |
| Cookie | 与服务器端做交互的,存储保持会话的重要信息 –login(用户名+密码)–对无状态连接的保持极其重要 |
| Referer | 表示该次请求的来源,一般用于做防盗链 |
| content-type | 传给服务器的内容的格式。请求体内容的类型,如:application/X-www-from-urlencoded |
| Cache-control | 缓存机制:不设置缓存:Cache-control:no cache |
| Pragma | 防止页面被缓存,和Cache-control:no cache一样 |
3. 空行
空一行,表示请求头部结束
4. 请求体
请求数据的正文内容。一般地,GET请求没有请求体,POST请求有请求体
响应报文的构成
1. 响应行
响应行:HTTP版本 + HTTP状态码 + 原因描述
HTTP响应码(状态码)
- 1xx:收到信息,请求,正在处理,网络极慢时可以看到
- 2xx:成功,请求被成功地接受、理解和采纳
- 200 存在文件
- 3xx:重定向,为了完成请求,必须进一步执行的动作,服务器为客户端重定向到另一个URL
- 302 重定向
- 304 缓存:目前已经访问过,存在缓存,服务器返回304说明没有改动,不作处理
- 3xx 均可能存在文件
- 4xx:客户端错误
- 403 存在文件夹
- 404 不存在文件及文件夹
- 5xx:服务器错误
- 503 服务器的服务不可达如服务器服务崩溃
- 500 均可能存在文件
2. 响应头部
| 字段 | 含义 |
|---|---|
| Server | HTTP服务器软件信息 |
| Date | 响应报文的时间 |
| Expires | 指定缓存过期时间 |
| Set-Cookies | 设置cookies,服务器返回的文本 |
| Last-Modify | 资源最后修改的时间 |
| Content-type | 响应的类型和字符集:content-type:text/html;charset=utf-8 |
| Content-length | 响应正文长度 |
| Connection | 一般都是keep-alive,保持TCP连接不关闭,但是不会长久保持连接,服务器可以设置。此字段辅助无连接状态的保持。 |
| Location | 指明重定向的设置,新的URL地址 |
3. 空行
空一行
4. 响应体
响应正文,即服务器返回的真正页面的内容,和浏览器检查页面源码的内容相同
Wireshark抓HTTP包详解HTTP协议
浏览器访问www.pingliang.gov.cn;使用Wireshark抓包并过滤条件设置为HTTP,而后追踪访问IP为61.178.180.240的HTTP报文并追踪该HTTP流:

其中粉色表示客户端发送的请求,蓝色表示服务器响应的请求

现对报文做如下分析:
HTTP请求报文:
1 | //1. 请求行 |
HTTP响应报文:
1 | //1.响应行 |
HTTP协议的无连接特点
HTTP:无连接应用协议
- 限制每次连接只处理一个请求
- 服务器处理完客户的请求,并收到客户的应答之后,即断开连接,不会保持连接
无连接应用协议设计初衷
服务器面对的用户量(十万、百万)极大,单个用户的浏览器和服务器交换数据的间歇性较大,且交互具有突发性和瞬时性,且一般两次请求之间的数据没有关联性。如果连接一直保持就会造成资源浪费,因此HTTP协议设计为:及时请求,及时建立连接,请求完毕马上释放连接,保证服务器处理效率,避免资源浪费。
Keep-Alive设置的引入
问题:网页越来越复杂,加入了很多图片,若每次访问都重新建立连接则效率低,因此在HTTP头部字段中定义了Connection:keep-alive字段,使得本次连接成为一个长连接,后续请求不需要去重新建立连接。
开启:Connection:keep-alive,会发起Keep-Alive连接请求,使得本次连接成为一个长连接,在HTTP1.1中默认打开。
关闭:在HTTP头部中设置Connection:close,即可关闭。
设置连接时间:根据需求在HTTP头部中设置Keep-Alive:timeout=5,max=1000
- timeout是超时时间,单位为秒,若超过这个时间后就断开连接 - max是最多的连接次数,若超过这个次数就强制断开连接
HTTP协议的无状态特点
HTTP:无状态应用协议
无状态含义
- 服务器对事务处理没有记忆能力,服务器不知道客户端是什么状态;给服务器发送HTTP请求之后,服务器回应之后,不会有任何记录;
- 每个请求都是独立的
- 若服务器要处理后续请求要用到前面提交的信息,则需要客户端重传
无状态优缺点
- 优点:释放了服务器的压力
- 缺点:重传重复传递内容,增大传输数据量,造成资源浪费
Cookies和Session的引入
问题:客户端和服务器的动态交互问题越来越多:如先登录,登录后续操作(充值)要使用到登录信息
Cookies
将前面的请求信息保存成一个临时文件即Cookies值,存放在浏览器中,关闭浏览器时就被删除,或手动清除历史。
如:淘宝购物车:不同商品信息写入Cookies当中;
如:登录→充值:把登录的账号信息保存到Cookies中,充值时调用Cookies
Session
可以理解为永久的Cookies值。
当客户端访问服务器时,服务器会设置一个名为session ID(会话编号)的东西并保存在服务器上,同时将session ID传递给客户端,客户端将其保存在内存里,不会轻易消失。后续浏览器每次访问服务器的连接都会自动加上session ID,服务器根据session ID获取客户端的数据信息。
问题:session ID占用服务器资源
解决:设置session超时时间,一旦超过这个超时时间,服务器就会自动清除此session
HTTPS协议
HTTP协议问题:
发送数据都是明文的;第三者窃听、截取数据包,伪装成客户端——双方无法确认对方身份;可能进行篡改数据。
缺点:存在安全隐患
HTTPS协议简介
概念:HTTPS(Hypertext Transfer Protocol Secure),超文本传输安全协议,是以安全为目标的HTTP通道,简单讲是HTTP的安全版(披着SSL外壳的HTTP协议)。
三个安全保障:
- 加密:加密数据并确保其由机密性,可保护用户在与网站交互时免于窃取个人信息个计费数据;
- 身份认证:能够在交互时实现身份认证;
- 完整性保障:可以保证信息不被篡改,即保证信息的完整性。
HTTP + 加密 + 身份认证 + 完整性保护 = HTTPS

HTTPS协议过程
by https://segmentfault.com/a/1190000021494676
图示

过程
HTTPS 的整个通信过程可以分为两大阶段:证书验证和数据传输阶段,数据传输阶段又可以分为非对称加密和对称加密两个阶段。具体流程按图中的序号讲解。
客户端请求 HTTPS 网址,然后连接到 server 的 443 端口 (HTTPS 默认端口,类似于 HTTP 的80端口)。
采用 HTTPS 协议的服务器必须要有一套数字 CA (Certification Authority)证书,证书是需要申请的,并由专门的数字证书认证机构(CA)通过非常严格的审核之后颁发的电子证书 (当然了是要钱的,安全级别越高价格越贵)。颁发证书的同时会产生一个私钥和公钥。私钥由服务端自己保存,不可泄漏。公钥则是附带在证书的信息中,可以公开的。证书本身也附带一个证书电子签名,这个签名用来验证证书的完整性和真实性,可以防止证书被篡改。
服务器响应客户端请求,将证书传递给客户端,证书包含公钥和大量其他信息,比如证书颁发机构信息,公司信息和证书有效期等。Chrome 浏览器点击地址栏的锁标志再点击证书就可以看到证书详细信息。

- 客户端解析证书并对其进行验证。如果证书不是可信机构颁布,或者证书中的域名与实际域名不一致,或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。就像下面这样:

如果证书没有问题,客户端就会从服务器证书中取出服务器的公钥A。然后客户端还会生成一个随机码 KEY,并使用公钥A将其加密。
客户端把加密后的随机码 KEY 发送给服务器,作为后面对称加密的密钥。
服务器在收到随机码 KEY 之后会使用私钥B将其解密。经过以上这些步骤,客户端和服务器终于建立了安全连接,完美解决了对称加密的密钥泄露问题,接下来就可以用对称加密愉快地进行通信了。
服务器使用密钥 (随机码 KEY)对数据进行对称加密并发送给客户端,客户端使用相同的密钥 (随机码 KEY)解密数据。
双方使用对称加密愉快地传输所有数据。
Wireshark抓包详解HTTPS协议过程
访问 www.baidu.com;并对此过程进行抓包,选中某个TLS协议的数据包,右键追踪TLS流(TLS是SSL协议的版本之一,SSL协议的版本:SSLv3、TLSv1.0、TLSv1.2)

后略。
