Java架构探险_分布式网络通信框架Netty_网络编程模型和Linux网络IO模型_学习总结

          Java架构探险_分布式网络通信框架Netty_网络编程模型和Linux网络IO模型

                                                            学习总结

                                                                                                        田超凡 2019年10月20日

PS:转载请注明原作者

Q:OSI七层网络模型的介绍

A:OSI七层网络模型包含以下七层:

物理层:光纤、宽带等网络通信所必要的基本物理设备

数据链路层:基于二进制数据交换格式在不同主机上进行数据交换

网络层:通过路由器、交换机等第三方网络设备接收网络信号并进行数据传输

传输层:基于Socket通信技术实现不同格式不同类型数据在不同远程主机中的传输

会话层:基于端口号和主机host ip映射文件配置建立会话,建立接收到的数据和正在运行的某个应用程序之间的联系并进行本机数据传输。

表示层:通过中间语言工具对接收到的数据进行不同类型编程语言转换,例如.NET平台中间语言MSIL

应用层:已经注册端口的各类运行中的应用程序

 

Q:Socket技术中TCP与UDP区别

A:Socket技术是一个网络通信技术,不拘泥于某个语言,每个后台编程语言基本都具备成熟的网络通信相关API(比如java.net包中内置的大量Socket API),Socket技术基于网络传输协议TCP实现。

TCP和UDP都是网络传输协议,定义了网络数据传输规范并进行规范化的数据传输交互。

TCP网络传输协议是一个严格基于连接传输协议的协议,必须基于TCP三次握手四次挥手建立远程主机网络连接并进行数据传输,可以保证传输数据的有效性,但是传输数据速率不及UDP协议。比较常见的HTTP协议就是基于TCP协议的二次封装。

UDP网络传输协议是一个基于无连接传输协议的协议,不需要任何规则,只需指定需要连接的ip和端口号即可建立连接(我指的是除远程主机开启了防火墙等意料之外的情况),然后就可以进行数据传输,不能保证传输数据的有效性,容易产生数据丢包导致传输数据准确性和完整性丢失,但是传输速率较快。一般只有一些通讯平台后台开发可能用到UDP传输协议进行实时数据传输,但是为了确保数据准确性和完整性,Java应用程序不怎么使用UDP传输协议了,主要都是基于TCP传输协议进行网络数据传输。

 

Q:白话文翻译TCP三次握手协议

A:TCP三次握手是TCP协议规定的网络数据传输建立连接规范,简要概括如下:

第一次握手:客户端发送消息告诉服务器,我要访问你了。

第二次握手:服务器收到客户端发送的消息,并告诉客户端我收到了,你可以访问我了。

第三次握手:客户端接收到服务器返回的响应信息,再次发送信息和服务器建立连接,告诉服务器,我们正式连接成功了。

补充说明:第一次握手客户端会发送SYN和SEQ随机数到服务器,第二次握手服务器会返回SYN和ACK=SEQ+1告诉客户端,第三次握手客户端发送SYN和ACK告诉服务器正式建立连接。

TCP四次挥手是用来断开客户端和服务器的网络连接,但是对于服务器而言多了一个延时确定数据传输完毕的环节。

Q:Http协议长连接与短连接的区别

A:HTTP1.1版本协议长连接表示当客户端和服务器建立连接成功之后,一般情况下不会轻易断开连接,内部采用复用机制,默认当空闲连接时长超过300s之后才会断开连接,目前使用的HTTP协议都是HTTP1.0版本,所以也都是长连接协议,比较常用。

HTTP协议短连接是HTTP1.0版本使用的连接方式,表示当客户端和服务器建立连接成功之后,每次服务器返回响应之后都会断开连接,这种方式比较占用网络带宽,因为每次请求都需要重复建立连接,同时增加了服务器性能开销。

 

Q:Http与https的区别

A:HTTP协议表示的是无状态超文本传输协议,HTTPS协议是HTTP协议的一种,只不过HTTPS协议在HTTP协议的基础上加入了SSL+证书加密传输,确保HTTP协议交互的安全性。HTTP协议会话状态需要自行后台通过第三方中间件进行自行控制(比如Session、Token、JWT、OAuth、Shiro等),HTTP协议基于TCP传输协议,所以也会进行TCP三次握手和四次挥手,但是HTTP协议则提供了长连接、短连接模式,并且对请求和响应进行了更加细粒度的拆分,比如请求分为请求类型Content-Type(常用的form-urlencoding/multipart/form-data等),请求方式(GET/POST/DEL等),请求头(Header)、请求体(RequestBody),响应分为响应头(Response Header)、响应体(Response Body)等,常用的Java Servlet API就是主要基于HTTP协议的请求和响应模式进行了大量封装(HttpServlet、HttpServletRequest、HttpServletResponse)

 

Q:同步和异步的区别

A:从后台代码执行的角度来看,同步和异步的区别是:

同步:后台代码严格按照从上往下按顺序执行,如果加入其他调用代码则必须阻塞等待其他调用代码返回结果之后再继续往下执行。

异步:后台代码从上往下按顺序执行过程中加入其他调用代码,不需要等待其他调用代码返回结果即可继续往下执行,不影响程序正常执行。

 

Q:Bio模型存在那些缺点

A:BIO模型是阻塞IO模型,缺点体现在如果发送的请求数量过大,阻塞IO模型如果接收不到客户端请求就会一直等待,容易造成线程阻塞,且即使加了多线程优化,但是对于每次请求都需要创建多线程,如果在高并发请求下,多线程模式会增加服务器线程性能开销,容易产生线程池溢出等程序异常

 

Q:阻塞式io与非阻塞式io的区别

A:阻塞式IO简称BIO,非阻塞式IO简称NIO

阻塞式IO模型对于每次IO调用都需要等待调用结果返回之后才能继续往下执行,否则线程就会阻塞一直等待每次IO调用返回结果,即使加了多线程控制在高并发访问下也会增大服务器性能开销,容易宕机。

非阻塞式IO模型是单线程的,基于选择器、通道等机制,在每次IO调用时不需要等待调用结果返回,会主动采用轮询的方式加载选择器内部已经存在的IO调用,实现单线程批量IO调用,节省性能开销。网络通信框架Netty,还有非关系型数据库Redis、关系型数据库MySQL等都是采用非阻塞式IO模型来进行IO操作的。

 

Q:使用多线程实现异步io存在那些缺点

A:多线程实现异步IO缺点就是即使IO处理模式是异步的,但是当高并发请求模式下,仍然会加大服务器性能开销,每次请求都需要创建大量线程,容易出现线程池内存溢出等问题。

 

Q:Linux五种io模型

A:Linux网络IO模型分为同步IO模型和异步IO模型,

同步IO模型包括:

阻塞式IO(BIO)、非阻塞式IO(NIO)、IO复用、信号驱动IO

异步IO模型包括:

异步IO(AIO)

 

你可能感兴趣的:(Java架构)