1.说一下BIO和NIO和AIO?

Java BIO: 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上 ,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。


2.java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。


3.TCP的3次握手和四次挥手?为什么是四次挥手,而不是三次或是五次、六次?

三次握手:要建立连接时,1客户端发送一个SYN报文给服务器,2服务器收到请求后,向客户端响应一个SYN+ACK连接数据报文,3然后客户端收到报文,回应ACK报文,服务器收的到ACK完成3次握手。

四次挥手:双方关闭连接要经过双方都同意。所以,1首先是客服端给服务器发送FIN,要求关闭连接,2服务器收到后会发送一个ACK进行确认。3服务器关闭连接然后再发送一个FIN,4客户端收到FIN发送ACK确认,并进入TIME_WAIT状态。等待2MSL后自动关闭。服务器收到ACK就关闭连接了。

为什么是3次握手:因为没有收到服务器返回确认报文,这时会放弃连接,重新启动一条连接请求,因为他们之间要相互确认是否收到ACK。


4.TCP与UDP的区别:

1.基于连接与无连接;

2.对系统资源的要求(TCP较多,UDP少);

3.UDP程序结构较简单;

4.流模式与数据报模式 ;

5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。