OSI七层模型讲一下
OSI模型是采取了分层的设计理念,把复杂的网络通信模型分成了七层,每一层都接收下一层的特定服务,向上一层提供特定服务。发送方的每层都会给数据添加首部信息,接收方的每层都会验证并拆除首部信息得到数据,层层之间职责明确。
应用层:
应用程序是跑在应用层之上的,主机间不同的应用程序之间是靠应用进程来进行通信,而应用进程的通信是在两个端系统的应用层上通过交换“报文”来完成的。报文由应用层通过socket套接字发向操作系统内核,传到对端后通过socket套接字进入对端应用层。所以应用层是面向具体的应用来进行网络传输。
表示层:
在主机应用程序交互的过程中,不同的机型与软件必然会导致数据的表现形式不同。表示层就是把发送方特定的数据格式转化为“网络通用的数据格式”,然后接收方就可以成功接收到数据,并转换成它所需要的数据格式。
会话层:
决定数据传输使用哪种连接、建立连接和断开连接的时机、数据传输的顺序,还包括建立检查点和数据恢复功能。会话层以下各层才是真正具有传输数据的功能。
运输层:
运输层将两个端系统的IP交互扩展为两个端系统上的IP之间的应用进程的交互。在因特网中,发送端承接应用层的传来的“报文”,加上运输层首部生成“报文段”并发送给网络层。接收端接收网络层传来的报文段,拆解出报文段中的目的端口号,定向到对应的进程套接字上,把数据交付给了主机上运行的应用进程,完成不同主机进程间的逻辑通信。
网络层:
网络层是为不同主机来提供逻辑通信。在因特网中,发送端根据目标IP地址确定目标主机在网络中的位置,然后承接运输层发送来的报文段,添加IP头部封装成一个个“数据报”,然后向相邻的路由器发送数据报(当然底层也是经过交换机),经过一个个的路由器和局域网,最终到达接收端。接收端得到来自路由器的数据报,验证IP通过后,提取出其中的运输层的报文段将其向上传递给运输层。
数据链路层:
基于目标的MAC地址把数据发送给对端主机,并对通过物理介质进行传输互连的设备进行数据处理。在因特网中,网络层将数据报下移至数据链路层,数据链路层将字节流数据包封装成比特“帧”,然后基于目标主机的MAC地址,沿着端到端之间的链路,通过交换机将数据报传递给下一个节点(主机或路由器),在下一个节点数据链路层将数据报上传给网络层。
物理层:
将二进制比特数据转换为电压、光等信号,通过通信媒介传输给对端物理层。
为什么要有TCP/IP四层模型?
因特网把OSI七层模型简化为四层,是为了让TCP/IP协议簇更加灵活。我们把表示层、会话层中数据格式转换和数据传输连接管理等留给开发者处理,这样可以灵活地根据业务场景来切换。比如不太重要的服务就不使用连接管理功能。
在浏览器地址栏中输入地址后会发生什么?
①输入域名后,浏览器会对域名进行DNS解析,得到目标IP地址
转DNS解析
②查看CDN中是否有该请求的缓存,若有则直接返回。
③HTTPS请求进行TLS握手,后续的数据传输都通过会话密钥保证安全传输。
转HTTPS
④为消息体添加HTTP头部组成HTTP报文,然后通过socket把报文发送给操作系统的传输层。
⑤传输层一般使用TCP协议,传输层会先判断是否与该目标IP+目标端口已经建立长连接,若没有则先通过三次握手建立TCP连接。然后把源端口和目标端口(URL输入)组装成TCP头部,然后拼接到HTTP请求报文中,生成TCP报文段,然后发送给给操作系统的网络层。
⑥网络层协议主要是IP协议,网络层把源IP和目标IP(解析域名后缓存在操作系统中)组装成IP头部,拼接到TCP报文段,生成数据报,然后发送给操作系统的MAC层。
⑦MAC层为数据报添加MAC头部,然后通过APR协议广播自己的IP地址,就得到了MAC网卡的MAC地址(MAC网卡即第一跳路由器),然后把数据报经过交换机发送给MAC网卡。MAC网卡得到具有目标IP的数据报,通过OSPF路由协议在一个个局域网和路由器之间跳转,最终达到最后一跳路由器,它的后面就是目标机器所在的局域网。然后此路由器根据通过ARP协议得到最终的目标服务器MAC地址,则网络包根据这个MAC地址,经过交换机达到目标服务器。
⑧目标服务器接收到这个数据包。
操作系统的数据链路层首先验证MAC头正确,取出MAC头并将网络包发送给操作系统的网络层。网络层验证IP头正确,取下IP头并将网络包发送给传输层。传输层收到数据包之后,会给源机器回发一个ACK报文,体现TCP连接的可靠传输。然后取下把数据包的TCP头,得到其中的80端口号,找到正在监听这个端口的进程。
Nginx代理服务器就监听到了这个请求,把请求报文路由转发给对应主机。
一般是由Tomcat应用服务器来接收请求,交给内部线程池来处理。Tomcat线程根据HTTP协议解析请求报文,把解析结果封装到一个Request对象中。然后经过责任链中的多个节点处理Request对象,最后一个责任链节点会生成一个Servlet实例并封装入这个Request对象中。然后就会触发filterChain过滤链,从Servlet上下文中拿到所有filter,按照servletName匹配过滤器并放入filterChain中。然后执行filterChain中的每个过滤器,读取解析servlet实例的请求体。完成后就调用servlet实例的service()方法,根据请求方法类型选择doGet()、doPost()执行业务逻辑处理,生成响应对象。
⑨响应对象由Tomcat原路返回至源主机,渲染出相应的页面。