浏览器相关总结

215 阅读4分钟

TCP 三次握手 四次挥手

好文推荐: juejin.cn/post/684490…

在介绍TCP三次握手四次挥手之前,我们先回忆一下OSI计算机网络七层结构

物理层:以二进制数据形式在物理媒体上传输数据

数据链路层:如何将数据组合成数据块,在数据链路层中称这种数据块为帧(简:传有地址的帧);如何控制帧在物理信道上的传输,包括如何处理传输差错(简:错误检测功能)…(再多不提了)

网络层:介于传输层和数据链路层之间,它在数据链路层提供的两个相邻端点之间的数据帧的传送功能上,进一步管理网络中的数据通信,将数据设法从源端经过若干个中间节点传送到目的端,从而向运输层提供最基本的端到端的数据传送服务。也有说是为数据包选择路由。

传输层:主要负责向两个主机中的进程之间的通信提供服务。

会话层:建立在传输层之上,利用传输层提供的服务,使应用建立和维持会话,并能使会话获得同步。会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信。这种能力对于传送大的文件极为重要。

表示层:数据格式化,代码转换,数据加密等

应用:文件传输,电子邮件,文件服务,虚拟终端等

三次握手为了建立连接(就是三次确认建立一个TCP连接)

为什么三次握手: 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。
本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。
于是就向client发出确认报文段,同意建立连接。
假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。
由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。
但server却以为新的运输连接已经建立,并一直等待client发来数据。
这样,server的很多资源就白白浪费掉了。
采用“三次握手”的办法可以防止上述现象发生。
例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

四次挥手:为了关闭连接(表示结束连接前的操作)

为什么要四次分手

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。
TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;
但是,这个时候主机1还是可以接受来自主机2的数据;
当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;
当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。

多种跨域方式的实现原理

同源策略

协议、域名、端口号三个都相同

为什么浏览器不支持跨域

  • 为了保证用户信息的安全,防止恶意的网站盗取数据
  • 为了安全防止csrf攻击
  • DOM元素也有同源策略,比如无法操作iframe里的内容
  • ajax也不支持跨域

实现跨域

  • jsonp 参考文章
  • cors 参考文章
  • postMessage (两个页面通信)参考文章
  • document.domain (一级域名和二级域名通信)
  • window.name
  • location.hash
  • http-prox (webpack)
  • nginx
  • websocket

持续补充完善中。。。