OSI 七层模型与 TCP/IP 五层模型
- OSI 七层模型:物理层、数据链路层、网络层、传输层、会话层、展示层、应用层
- TCP/IP 五层模型:物理层、数据链路层、网络层、传输层、应用层
HTTP/ HTTPS 协议
HTTP 0.9
- 只有
GET
命令 - 响应后就马上关闭连接
HTTP 1.0
- 增加了
HEAD
、POST
方法 - 增加了
HTTP Headers
和响应状态码
HTTP 1.1(普遍使用)
- 持久连接(Keep-Alive),通道复用
- 增加了
PUT
、DELETE
,OPTIONS
等方法 - 新增断点续传,身份认证,状态管理,缓存等特性
HTTP 2.0
- 数据以二进制分帧进行传输
- 头信息压缩
- 服务端推送
HTTPS
- 使用
SSL
加密传输的HTTP
安全版本
URL 和 URI 的区别
URI = URL + URN
-
URI
:统一资源标识符,用来唯一标识互联网上的信息资源,就像身份证号可以独一无二的标识出来 -
URL
:统一资源定位符,通过资源位置来标识资源,就像是身份证上的地址
常见状态码
-
1xx
:请求正在处理 -
200 OK
:请求成功 -
201 Created
:已创建,POST
或PUT
请求成功的响应 -
202 Accepted
:已接受,但未响应 -
204 No Content
:请求成功,但无内容 -
206 Partial Content
:请求部分内容,如断点续传 -
301 Moved Permanently
:永久性重定向,比如请求路径忘记添加最后的斜杠 -
302 Found
:临时性重定向 -
304 Not Modified
:资源未修改,使用缓存 -
400 Bad Request
:请求语法错误 -
401 Unauthorized
:要求身份认证 -
403 Forbidden
:请求资源被拒绝 -
404 Not Found
:资源不存在 -
405 Method Not Allowed
:请求的方法不支持 -
500 Internal Server Error
:服务器错误 -
502 Bad Gateway
:代理服务器错误 -
504 Gateway Timeout
:请求超时
GET 和 POST
GET
:语义上是指请求获取指定的资源,使用URL
进行传参,数据长度有限制,资源可以被缓存
POST
:语义上是指对请求资源做出处理,请求数据放在body
中,数据长度无限制,相对GET
更安全,支持更多的编码类型,不能被缓存
本质区别:GET
是幂等的,而POST
不是幂等的。就是说对于相同的请求,GET
请求返回相同的结果,而POST
会有副作用。所以不应该使用GET
请求做增删改操作,也不应该使用POST
请求做查询操作
常用请求/相应头
通用头
-
Cache-Control
:控制缓存行为-
no-cache
:向服务器验证后,再决定缓存获取或还是请求 -
no-store
:不进行缓存,直接从服务器获取 -
max-age
:设置缓存最大有效时间,单位是秒
-
-
Connection
:连接管理-
keep-alive
:持久连接 -
close
:每次请求都会重新创建TCP
连接
-
-
Date
:服务端发送资源时的时间 -
Via
:代理服务器相关信息
请求头
-
Accept
:可接受的响应内容类型 -
Accept-Language
:可接受的响应内容语言列表 -
Cookie
:客户端存储的Cookie
字符串 -
Host
:请求资源所在的服务器 -
If-Modified-Since
:上次访问时的更改时间,资源未修改的情况下返回304 Not Modified
-
If-None-Match
:此次访问使用的E-Tag
-
Range
:请求实体的字节范围,用于断点续传 -
Referer
:请求资源的原始URI
-
User-Agent
:客户端相关信息
响应头
-
Content-Type
:资源资源的内容类型 -
Etag
:资源标识信息,标识资源是否更新,用于缓存验证 -
Last-Modified
:资源最后修改日期 -
Server
:服务器软件信息 -
Set-Cookie
:设置Cookie
-
Access-Control-Allow-Origin
:跨域设置
TCP三次握手和四次挥手
三次握手
- 客户端发送
SYN
标志,等待服务器确认 - 服务器确认
SYN
标志后,发送SYN+ACK
包给客户端 - 客户端接收到
SYN+ACK
包后,发送ACK
包,双方建立连接
四次挥手
- 客户端 --
FIN
--> 服务端,关闭数据传送,客户端进入FIN_WAIT_1
状态 - 服务端 --
ACK
-> 客户端,服务端进入CLOSE_WAIT
状态 - 服务端 --
ACK + FIN
--> 客户端,服务端进入LAST_ACK
状态 - 客户端 --
ACK
-> 服务端,服务端进入CLOSED
状态
跨域
同源策略限制:如果两个URL
的协议,域名和端口相同则表示它们同源,否则被当做跨域
跨域解决方法:
-
JSONP
:利用<script>
标签不受跨域限制,缺点是只支持GET
请求 -
CORS
:设置Access-Control-Allow-Origin
头允许跨域
HTTP 缓存策略
强缓存
根据Cache-Control
和Expires
头来判断是否强缓存,如果命中强缓存,则直接从缓存读取资源,不会发请求到服务器,在Chrome
浏览器下如下所示:
协商缓存
通过Last-Modified
和Etag
来验证资源是否命中协商缓存,如果命中则服务器会返回这个请求,但不会返回这个资源的数据,依然是从缓存中读取数据,在Chrome
浏览器下如下所示:
缓存策略
安全
-
XSS
:跨站脚本攻击,浏览器内运行非法的HTML
标签或JS
进行的一种攻击- 将
Cookie
设置为HttpOnly
- 转义页面上的输入内容和输出内容
- 将
-
CSRF
:跨域请求伪造,攻击者盗用了你的身份,以你的名义发送恶意请求
RESTful
URL 设计
- 动词(HTTP Methods) + 宾语,注意方法要语义明确
- 宾语必须是名词,如
/articles
,而不是/getArticles
- 复数
URL
,如GET /articles/2
,而不是GET /article/2
- 避免多级
URL
,除了第一级其余级别都用查询字符串,如GET /authors/12?categories=2
,而不是GET /authors/12/categories/2
状态码
按照不同的场景,返回对应合适的状态码
服务器响应
-
API
返回的数据格式应该是一个JSON
对象,而不是纯文本,需要将服务器的响应头Content-Type
设置为application/json