应用层协议简介

497 阅读11分钟

欢迎访问我的博客

应用层

为用户提供服务的通信活动

常见的协议:http, websocket, dns, smtp

http协议

特点: 简单快速,灵活,无连接(链接一次就会断掉),无状态(不能区分两边连接者的身份) 一个请求的过程:域名解析->发起tcp三次握手->发送http请求->服务器响应http请求->浏览器解析响应 关于http协议是无状态协议是因为对于事务处理没有记忆能力。 缺少状态意味着如果后续处理需要前面的信息.所以需要通过Cookie或者session保存信息 相对于http1.0关于http1.1的优点:

  1. 默认是Connection: keep-alive不会主动关闭连接
  2. 引入了管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求 不过http1版本的协议缺点也很明显:头部内容携带过多,多个消息头都是重复的,在安全上都是明文传输,

相对于http1关于http2的优点:

  1. 安全上更优越,内容都是二进制传输也就是帧的形式发送
  2. 一个消息的多个帧可以无序发送,传输效率更快
  3. 多路复用,可以在一个tcp链接上承载多个双向数据流 缺点:http2只会建立一次tcp连接,连接上出现丢包现象就需要等待重传

相对于http2关于http3的优点:

  1. 基于udp进行链接的,不会因为丢包发生等待重传的事情

http报文

请求报文格式:

GET /index.html HTTP/1.1
Host: hacker.jp
Connection: keep-alive(持久连接,减少通讯量的开销)
Content-Type: applicaiton/x-ww-form-urlencoded
Content-Length: 16

name=ueno&age=37

响应报文格式:

HTTP/1.1 200 VERY OK
Date: Tue, 10 Jul 2012 06:50:15 GMT
Content-Length: 355
Content-Type: text/html

<html></html>

关于请求方式: 其中get和post的区别:

  1. get的发送数据是放在url的后面的
  2. post是有body的,参数是放在body里的
GET 请求访问已经被URI识别的资源
POST 传输实体主体
PUT 传输文件
DELETE 删除文件
HEAD 获取报文首部
OPTIONS 查询针对请求URI指定的资源支持方法
TRACE 追踪路径
CONNECT 要求用隧道协议链接代理
LINK 建立与资源之间的联系
UNLINK 断开连接关系

常见状态码:

状态码状态名称解释
200ok请求成功。一般用于GET与POST请求
201Created已创建成功,请求并创建了新的资源
301Moved Permanently永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替,也就是替换成了Location字段指定的URI
302Found临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303See Other查看其它地址。与301类似。不管原请求是什么方法,重定向请求的方法都是 GET
304Not Modified未修改。协商缓存命中返回304.所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
307Temporary Redirect307 的定义实际上和 302 是一致的,唯一的区别在于,307 状态码不允许浏览器将原本为 POST 的请求重定向到 GET 请求上
308permanent Redirect永久重定向,308 的定义实际上和 301 是一致的,唯一的区别在于,308 状态码不允许浏览器将原本为 POST 的请求重定向到 GET 请求上。
400Bad Request客户端请求的语法错误,服务器无法理解
403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求
404Not Found服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
500Internal Server Error服务器内部错误,无法完成请求

缓存原理

上面刚说完http的状态码,就不等不说浏览器的缓存机制了

  • 浏览器在加载资源时,根据请求头的expirescache-control判断是否命中强缓存,是则直接从缓存读取资源,不会发请求到服务器。
  • 如果没有命中强缓存,浏览器一定会发送一个请求到服务器,通过last-modifiedetag验证资源是否命中协商缓存,如果命中,服务器会将这个请求返回,但是不会返回这个资源的数据,依然是从缓存中读取资源
  • 如果前面两者都没有命中,直接从服务器加载资源

另外解释以下expires,cache-control,etag,last-modified.这几个字段:

# expires
Expires是http1.0提出的一个表示资源过期时间的header,它描述的是一个绝对时间,由服务器返回。
Expires 受限于本地时间,如果修改了本地时间,可能会造成缓存失效

# Cache-Control
Cache-Control 出现于 HTTP / 1.1,优先级高于 Expires ,表示的是相对时间

# Last-Modified,If-Modified-Since
Last-Modified 表示本地文件最后修改日期,浏览器会在request header加上If-Modified-Since(上次返回的Last-Modified的值),
询问服务器在该日期后资源是否有更新,有更新的话就会将新的资源发送回来

# ETag、If-None-Match
Etag就像一个指纹,资源变化都会导致ETag变化,跟最后修改时间没有关系,ETag可以保证每一个资源是唯一的
If-None-Match的header会将上次返回的Etag发送给服务器,询问该资源的Etag是否有更新,有变动就会发送新的资源回来

# 关于etag
当发送一个服务器请求时,浏览器首先会进行缓存过期判断。浏览器根据缓存过期时间判断缓存文件是否过期。

情景一:若没有过期,则不向服务器发送请求,直接使用缓存中的结果,此时我们在浏览器控制台中可以看到 200 OK(from cache) ,此时的情况就是完全使用缓存,浏览器和服务器没有任何交互的。

情景二:若已过期,则向服务器发送请求,此时请求中会带上①中设置的文件修改时间和Etag
然后进行资源更新判断。服务器根据浏览器传过来的文件修改时间,判断自浏览器上一次请求之后,文件是不是没有被修改过;根据Etag判断文件内容自上一次请求之后有没有发生变化

情形三:若两种判断的结论都是文件没有被修改过,则服务器就不给浏览器发index.html的内容了,
直接告诉它,文件没有被修改过,你用你那边的缓存吧—— 304 Not Modified,此时浏览器就会从本地缓存中获取index.html的内容。此时的情况叫协议缓存,浏览器和服务器之间有一次请求交互。

情形四:若修改时间和文件内容判断有任意一个没有通过,则服务器会受理此次请求,之后的操作同①
① 只有get请求会被缓存,post请求不会

http优化:

  1. 利用负载均衡优化和加速HTTP应用
  2. 利用HTTP Cache来优化网站

关于https

对称加密算法加密数据+非对称加密算法交换秘钥+数字证书验证身份 对称加密数据:发送发的报文通过ssl加密,接收方通过ssl套接字进行解密 下面是https协议的加密过程: https加密过程 下面是https的ssl过程: https加密过程

https的通讯方式

客户端发送请求
服务端向客户端发送数字证书
客户端验证数字证书,验证成功生成一个会话秘钥
服务器拿到会话秘钥然后用自己的私钥解密
客户端与服务端进行加密通讯

大白话就是数字证书保证了:
1. 客户端这边能造一个箱子然后这个箱子可以用服务端的🔑 打开也可以用自己的公钥打开。
2. 客户端确认服务端就是自己要找的那个人,身份是对的
其中:这个箱子就是指对数据进行加密和解密的编码算法(随机对称密钥),这种编码算法可以对数据进行加密和解密.服务端的🔑 就是指服务端的秘钥

https的ssl过程

(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
(2)Web服务器收到客户端请求后,会生成一对公钥和私钥,并把公钥放在证书中发给客户端浏览器。
(3)客户端判断证书是否有效,无效弹出警告,有效生成一个随机值。并用证书的公钥对随机值进行加密
    加密后的随机值称为密钥,发送给服务端。
(4)Web服务器用私钥解密密钥。然后用该密钥加密数据。发送给客户端
(5)客户端用密钥解密数据

为什么说https是可靠的

为什么HTTPS是可靠的?

HTTPS是可靠的,因为它解决了三个问题。

1、加密通信,即使别人获取到了信息也没法复原成原来的信息。

2、防止中间人攻击。黑客没法冒充服务端。因为服务端给了客户端一个CA证书。

  • 如果客户端验证了这个证书,说明这个证书和公钥是由服务端发来的且真实可靠。
  • 如果客户端验证不了这个证书,就说明这个证书不可靠,有可能是假的。

3、CA证书的公信力。CA证书需要由公司或者个人发出申请,再通过邮箱验证等方法验证域名存在。避免了黑客冒充网站获取证书的可能。

在技术层面上,CA机构的公钥是写在操作系统或者浏览器里的。只有用CA机构的私钥加密的内容才能完成解密。确保了证书的确是CA机构发行的。

关于dns解析过程

浏览器搜索自己的dns缓存-》查询wins服务器-》进行广播查找-》读取host文件

dns查询过程

请求主机首先向本地DNS服务器查询目标域名,
首先查看本地缓存是否有目标域名的IP地址列表
否则查看本地DNS服务器没有目标域名的IP地址列表(即目标域名在该服务器上)
否则本地DNS服务器向跟DNS服务器获取该域名的TLD(域名后面的后缀.cn/.edu/etc)的IP地址列表
然后本地DNS服务器向TLD DNS服务器 发送查询报文
最后获得了该域名所在的权威DNS服务器所在地址,并向它做查询,获得到该ip地址的响应报文

关于smtp协议

smtp是邮箱访问协议,它是一个推送协议,只能够进行下面的操作:

  1. 将邮件从发送方的邮件服务器传输到接收方的邮件服务器
  2. 将邮件从发送方的用户代理传送到发送方的邮件服务器 所以当接收方的用户代理想要从接收方的邮件服务器获取邮件需要用到下面的协议 pop3(第三版的邮局协议) 或 imap(因特网邮件访问协议) 或 http协议

websocket协议

HTTP协议通信只能由客户端发起,于是有了websocket进行p2p的模式。
websocket协议是向网络发送报文和从网络接收报文的软件接口
特点:
1. 数据格式比较轻量,性能开销小,通信高效。
2. 可以发送文本,也可以发送二进制数据。
3. 没有同源限制,客户端可以与任意服务器通信。
4. 协议标识符是ws(如果加密,则为wss),服务器网址就是URL。