问:网络编程时的同步、异步、阻塞、非阻塞是什么
答:同步:函数调用在没得到结果之前,没有调用结果,不返回任何结果。异步:函数调用在没得到结果之前,没有调用结果,返回状态信息。阻塞:函数调用在没得到结果之前,当前线程挂起,得到结果后才返回。非阻塞:函数调用在没得到结果之前,当前线程不会挂起,立即返回结果。
问:什么是BIO
答:在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。
问:什么是NIO
答:NIO本身是基于事件驱动思想来完成的其主要想解决的是BIO的大并发问题,在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理,这样做虽然可以达到我们的要求,但同时又会带来另外一个问题,
由于每创建一个线程,就要为这个线程分配一定的内存空间,而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪,NIO基于Reactor,当socket有流可读或可写入socket时,建立管道,建立管道注册到多路复用器上,应用再将流读取到缓冲区或写入操作系统,
也就是说这个时候已经不是一个连接就要对应一个处理线程了,而是有效的请求对应一个线程当连接没有数据时是没有工作线程来处理的,BIO与NIO一个比较重要的不同,是我们使用BIO的时候往往会引入多线程,每个连接一个单独的线程而NIO则只使用少量的多线程每个连接共用一个线程,NIO的最重要的地方是当一个连接创建后,不需要对应一个线程,
这个连接会被注册到多路复用器上面,所以所有的连接只需要一个线程就可以搞定,当这个线程中的多路复用器进行轮询的时候,发现连接上有请求的话才开启一个线程进行处理,也就是一个请求一个线程模式。
问:什么是AIO
答:与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可,这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区并通知应用程序,对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序,即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。
问:典型的TCP客户端要经过那三步操作
答:创建一个Socket实例,构造函数向指定的远程主机和端口建立一个TCP连接,通过套接字的I/O流与服务端通信,使用Socket类的close方法关闭连接。
问:Java如何实现无阻塞方式的Socket编程
答:NIO有效解决了多线程服务器存在的线程开销问题,在NIO中使用多线程主要目的不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程充分利用多个CPU的处理能力和处理中的等待时间达到提高服务能力的目的。
问:典型的TCP服务端执行操作是什么样的
答:创建一个ServerSocket实例并指定本地端口用来监听客户端在该端口发送的TCP连接请求,重复执行,调用ServerSocket的accept()方法以获取客户端连接并通过其返回值创建一个Socket实例,为返回的Socket实例开启新的线程,并使用返回的Socket实例的I/O流与客户端通信,通信完成后,使用Socket类的close()方法关闭该客户端的套接字连接。
问:TCP协议的三次握手
答:第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server。Client进入SYN_SENT状态,等待Server确认。
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack (number )=J+1随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态。
完成三次握手随后Client与Server之间可以开始传输数据了。
问:TCP协议的四次挥手协议
答:第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1,Server进入CLOSE_WAIT状态。
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
问:tcp和udp的区别
答:TCP:是面向连接的流传输控制协议,具有高可靠性,确保传输数据的正确性,有验证重发机制,因此不会出现丢失或乱序。
UDP:是无连接的数据报服务,不对数据报进行检查与修改,无须等待对方的应答,会出现分组丢失、重复、乱序,但具有较好的实时性,UDP段结构比TCP的段结构简单,因此网络开销也小。