1. 同源策略
同源策略是指域名, 协议, 端口相同; 不同源的客户端脚本在没明确授权的情况下, 不能读写对方的资源, 从而保护用户的隐私, 这就是为什么需要同源策略的原因
以百度网址为例https://www.baidu.com/
- 协议 -
https
- 域名 -
www.baidu.com
- 端口 -
443
- https 端口默认为 443
- http 端口默认为 80
- 默认端口可以隐藏, 加上端口号之后百度网址为
https://www.baidu.com:443/
以
http://www.example.com/dir/page.html
为例, 以下与之的同源情况:
http://www.example.com/dir2/other.html
同源http://example.com/dir/other.html
不同源(域名不同)http://v2.www.example.com/dir/other.html
不同源(域名不同)http://www.example.com:81/dir/other.html
不同源(端口不同)
1.1 协议
协议简单来说就是人类和计算机沟通的一些交流规则
1.1.1 HTTP
HTTP由请求与响应构成, 是一个标准的客户端服务器模型, HTTP协议永远都是客户端发起请求, 服务器回送响应
HTTP: 超文本传输协议, 是一种用于分布式、协作式和超媒体信息系统的应用层协议
HTTP是一个无状态的协议; 无状态是指客户端和服务器之间不需要建立持久的连接, 所以当客户端向服务器发出请求, 且服务器返回响应之后, 连接就被关闭了
HTTP缺点
- 通信使用明文, 可能被窃听
- 不验证通信方的身份, 可能遭遇伪装
- 无法证明报文的完整性, 有可能遭遇篡改
1.1.2 HTTPS
- HTTPS: HTTP + 加密 + 认证 + 完整性保护 = HTTPS
- HTTPS是在HTTP上建立SSL加密层, 并对传输数据进行加密, 是HTTP协议的安全版; HTTPS = HTTP + TLS/SSL
HTTPS: 超文本传输安全协议, 是一种通过计算机网络进行安全通信的传输协议
1.2 域名
域名用于在数据传输时对计算机的定位标识
域名和IP地址是互相映射的, 由于IP
地址不方便记忆等特点, 人们设计出了域名; 但是单凭一个域名也不能让我们直接访问到正确的地址, 只有将域名解析成实际的网络地址, 才能访问成功; 这种解析工作则由专门的域名系统——DNS
完成
1.3 端口
如果把 IP 地址比作一间房子, 端口就是出入这间房子的门, 一个IP地址的端口可以有多个
1.4 经典问题, 在浏览器中输入一个 url 会发生什么?
- 浏览器通过
DNS
域名解析到服务IP - 客户端通过
TCP
协议建立到服务器的TCP
连接(三次握手)- 三次握手的过程如下
- 客户端发送连接, 请求报文(SYN), 此时客户端处于
SYN_SEND
状态 - 服务端接收连接后回复ACK报文, 并未这次连接分配资源
- 客户端收到ACK报文后也想服务端发动ACK报文, 并分配资源, 这样TCP连接就建立了
- 客户端(浏览器)向web服务器端(HTTP服务器)发送HTTP协议包, 请求服务器里的资源文档
- 服务器向客户端发送HTTP协议应答包
- 客户端和服务器断开(四次握手), 客户端开始解析处理HTTP文档
-
四次挥手过程如下
-
客户端发起终端连接请求, 也就是发送FIN报文, 服务端接到FIN报文后, 意思是说: "我客户端没有数据要发送给你了, 但是如果你还有数据没有发送完成, 则不必着急关闭(Socket), 可以继续发送数据"
-
服务端发送ACK, 告诉客户端, 你的请求我收到了, 但是我还没准备好, 请继续等我的消息, waiting: 这时候客户端就进入FIN_WAIT状态, 继续等待服务端的FIN报文
-
当服务端确定数据已发送完成, 则向客户端发送FIN报文, 告诉客户端, 我这边数据发完了, 准备关闭连接了
-
客户端收到FIN报文后. 就可以到可以关闭连接了, 但是他还是不相信网络, 怕服务端不知道要关闭, 所以发送ACK后进入TIME_WAIT状态, 如果服务端没有收到ACK则可以重传, 服务端收到ACK后, 就知道可以断开连接了; 客户端等待了2MSL后依然没有收到回复, 则证明服务端已正常关闭, 此时, 客户端也可以断开连接, TCP连接就这样关闭了
-