前几篇文章分享了一些js、vue面试题的答题方案和总结归纳以及借鉴的参考答案,那这篇就来分享一下网络相关的面试题。
答题思路:可靠、顺序、速度;面向连接/面向非连接、传输层协议
TCP 协议建立需要三次握手,断开连接需要四次挥手三次握手的原因是为了避免丢包(数据丢失)
握手过程中传递的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据, 断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次挥手”
TCP协议建立需要三次握手,断开连接需要四次挥手
三次握手:
==为什么 TCP 是三次握手而不是两次或者四次握手来建立连接?==
两次握手没办法确保客户端是不是已经收到了自己的同步信号。因为有这三个步骤就能确保初始序列号一致了,所以不需要第四个步骤。
四次挥手:
TCP/IP协议主要分为四层:数据链路层、网络层、传输层、应用层
优点:基于应用层的接口使用方便 缺点:1.传输速度慢,数据包大。2.数据传输安全性差 注意:服务器不会主动给客户端发送请求
非对称加密比较耗时,所以 HTTPS 采用的是:对称加密 + 非对称加密两种方式结合;用 非对称加密的方式来传输加密随机数的秘钥,然后采用对称加密的方式来传输数据。 具体过程如下:
有可能发生这种情况:客户端向服务端发起 https 请求,假如被假基站转发到一个中间人服务器,于是客户端是和「中间人服务器」完成了 TLS 握手,然后这个「中间人服务器」再与真正的服务端完成 TLS 握手。
中间人服务器与客户端在 TLS 握手过程中,实际上发送了自己伪造的证书给浏览器,而这个伪造的证书是能被浏览器(客户端)识别出是非法的,于是就会提醒用户该证书存在问题。
如果用户执意点击「继续浏览此网站」,相当于用户接受了中间人伪造的证书,那么后续整个 HTTPS 通信都能被中间人监听了。
所以,HTTPS 协议本身到目前为止还是没有任何漏洞的,即使你成功进行中间人攻击,本质上是利用了客户端的漏洞(用户点击继续访问或者被恶意导入伪造的根证书),并不是 HTTPS 不够安全。
TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。
答题技巧:可以与用ajax轮询技术做对比 WebSocket教程
websocket是H5的产物,应用层协议,是一种服务器推送技术,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,
WebSocket的特点:
规定网络地址的协议叫做IP协议,它所定义的地址,就被称为IP地址。目前,广泛采用的是IP协议第四版,简称IPv4。
XMLHttpRequest
对象有一个 readyState
属性,表示当前处在请求/响应过程的哪个阶段;readyState
的状态值:status
表示响应的HTTP
状态,如果 HTTP
状态码是 304,则表示资源未修改过,是从浏览器缓存中直接拿取的。当然这也意味着响应有效注意:为保证跨浏览器兼容, onreadystatechange 事件处理程序应该在调用 open() 之前赋值;为保证请求头部被发送,必须在 open() 之后、 send() 之前调用 setRequestHeader()
function ajax () {
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if ((xhr.status >= 200 && xhr.status <= 300) || xhr.status == 304) {
console.log(JSON.parse(xhr.responseText))
} else {
console.log("Request was unsuccessful:" + xhr.status)
}
}
}
xhr.open('get', 'json.txt')
// xhr.setRequestHeader("MyHeader", "MyValue");
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(null)
}
application/x-www-form-urlencoded
: ajax请求默认使用这种格式multipart/form-data
: 提交表单数据,用ajax
请求表单上传文件时,必须要把contentType
设置成multipart/form-data
application/json
: axios
默认提交就是使用这种格式,传递到后台的将是序列化后的json
字符串text/xml
:(很少用)什么叫跨域?
同源策略:同源策略(Same Orgin Policy)是一种约定,它是浏览器核心也最基本的安全功能,它会阻止一个域的js脚本和另外一个域的内容进行交互,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。
所谓同源(即在同一个域)就是两个页面具有相同的协议(protocol)、主机(host)和端口号(port);当一个请求url的协议、域名、端口三者之间的任意一个与当前页面url不同即为跨域。
跨域的业务场景:
解法方案:
nginx通过配置反向代理解决跨域问题
server
模块的 location
ocation 配置项定义了一条访问 Nginx 服务某一路径时的匹配规则,location 后面紧跟的是匹配的路径,这个路径可以直接写绝对路径,可以写正则匹配:
location ~ ^/(api2/api3) { # 当访问 http://localhost/api2 和 http://localhost/api 3 时命中
# ...
}
location 里有多个配置项,其中一个是 proxy_pass ,意思是将当前命中的 Nginx 接口(例如:http://localhost/api )代理到其他 server 的接口,如下例子就是将 http://localhost/api 代理到 https://baidu.com/api
location /api {
proxy_pass https://baidu.com;
}
Location 配置中的 add_header选项,表示 Nginx 将在 response 中添加一些额外的响应头信息给客户端。配置
Access-Control-Allow-Origin
、Access-Control-Allow-Methods
、Access-Control-Allow-Headers
location /api {
add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Headers *;
add_header Access-Control-Allow-Methods "GET, POST, PUT, OPTIONS";
proxy_pass https://baidu.com; # 需要代理的服务端地址
}
其中 * 代表通配符,意思是所有 origin 都允许跨域访问,在部署的时候写成自己前端服务地址就可以了