应用层协议简介
应用层
为用户提供服务通信活动
常见的协议:http, websocket, dns, smtp
http协议
特点: 简单快速,灵活,无连接(链接一次就会断掉),无状态(不能区分两边连接者的身份)
一个请求的过程:域名解析->发起tcp三次握手->发送http请求->服务器响应http请求->浏览器解析响应
关于http协议是无状态协议是因为对于事务处理没有记忆能力。
缺少状态意味着如果后续处理需要前面的信息.所以需要通过Cookie或者session保存信息
相对于http1.0
关于http1.1
的优点:
- 默认是
Connection: keep-alive
不会主动关闭连接 - 引入了管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求
不过http1版本的协议缺点也很明显:头部内容携带过多,多个消息头都是重复的,在安全上都是明文传输,
相对于http1
关于http2
的优点:
- 安全上更优越,内容都是二进制传输也就是帧的形式发送
- 一个消息的多个帧可以无序发送,传输效率更快
- 多路复用,可以在一个tcp链接上承载多个双向数据流
缺点:http2只会建立一次tcp连接,连接上出现丢包现象就需要等待重传
相对于http2
关于http3
的优点:
- 基于udp进行链接的,不会因为丢包发生等待重传的事情
http报文
请求报文格式:
1 | GET /index.html HTTP/1.1 |
响应报文格式:
1 | HTTP/1.1 200 VERY OK |
关于请求方式:
其中get和post的区别:
- get的发送数据是放在url的后面的
- post是有body的,参数是放在body里的
1 | GET 请求访问已经被URI识别的资源 |
常见状态码:
状态码 | 状态名称 | 解释 |
---|---|---|
200 | ok | 请求成功。一般用于GET与POST请求 |
201 | Created | 已创建成功,请求并创建了新的资源 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替,也就是替换成了Location字段指定的URI |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | See Other | 查看其它地址。与301类似。不管原请求是什么方法,重定向请求的方法都是 GET |
304 | Not Modified | 未修改。协商缓存命中返回304.所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
307 | Temporary Redirect | 307 的定义实际上和 302 是一致的,唯一的区别在于,307 状态码不允许浏览器将原本为 POST 的请求重定向到 GET 请求上 |
308 | permanent Redirect | 永久重定向,308 的定义实际上和 301 是一致的,唯一的区别在于,308 状态码不允许浏览器将原本为 POST 的请求重定向到 GET 请求上。 |
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置”您所请求的资源无法找到”的个性页面 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
缓存原理
上面刚说完http的状态码,就不等不说浏览器的缓存机制了
- 浏览器在加载资源时,根据请求头的
expires
和cache-control
判断是否命中强缓存,是则直接从缓存读取资源,不会发请求到服务器。 - 如果没有命中强缓存,浏览器一定会发送一个请求到服务器,通过
last-modified
和etag
验证资源是否命中协商缓存,如果命中,服务器会将这个请求返回,但是不会返回这个资源的数据,依然是从缓存中读取资源 - 如果前面两者都没有命中,直接从服务器加载资源
另外解释以下
expires
,cache-control
,etag
,last-modified
.这几个字段:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29# 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优化:
- 利用负载均衡优化和加速HTTP应用
- 利用HTTP Cache来优化网站
关于https
对称加密算法加密数据+非对称加密算法交换秘钥+数字证书验证身份
对称加密数据:发送发的报文通过ssl加密,接收方通过ssl套接字进行解密
下面是https协议的加密过程:
下面是https的ssl过程:
https的通讯方式
1 | 客户端发送请求 |
https的ssl过程
1 | (1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。 |
关于dns解析过程
浏览器搜索自己的dns缓存-》查询wins服务器-》进行广播查找-》读取host文件
dns查询过程
1 | 请求主机首先向本地DNS服务器查询目标域名, |
关于smtp协议
smtp是邮箱访问协议,它是一个推送协议,只能够进行下面的操作:
- 将邮件从发送方的邮件服务器传输到接收方的邮件服务器
- 将邮件从发送方的用户代理传送到发送方的邮件服务器
所以当接收方的用户代理想要从接收方的邮件服务器获取邮件需要用到下面的协议
pop3(第三版的邮局协议) 或 imap(因特网邮件访问协议) 或 http协议
websocket协议
1 | HTTP协议通信只能由客户端发起,于是有了websocket进行p2p的模式。 |