一、TCP和UDP有什么区别?TCP为什么是三次握手,而不是两次?
TCP(Transer Control Protocol) 是一种面向连接的、可靠的、传输层通信协议 。点对点通信、高可靠性、传输效率比较低、占用系统资源比较多。
UDP(User Datagram Protocol) 是一种无连接的、不可靠的、传输层通信协议。 广播发送、不可靠、传输效率高、占用系统资源比较少、协议比较简单。
TCP 建立连接是三次握手,断开连接是四次握手。
如果是两次握手,可能造成链接资源浪费的情况。如果服务端发生阻塞,服务端发送握手信息给客户端,此时客户端由于之前服务端阻塞以为握手失败,此时,服务的就处于无限等待状态,而客户端已断开链接,从而造成了服务的资源浪费的情况。
二、JAVA有哪几种IO模型?有什么区别?
1、BIO 同步阻带IO
特点:可靠性差、吞吐量低、适用于连接比较少且比较固定的场景;编程模型简单。
2、NIO 同步阻塞IO
特点:可靠性比较好、吞吐量也比较高、适用于连接比较多且连接比较短(轻操作业)的场景;编程模型复杂。
3、AIO 异步非阻塞IO
特点:可靠性高、吞吐量高、适用于连接比较多且连接比较长(重操作)的场景;编程模型相对简单,但是需要操作系统的支持,目前Linux系统不支持
三、JAVA NIO 的几个核心组件时什么?分别有什么作用?
三个组件:channel、buffer、selector
channel 类似于流,每个 channel 对应一个 buffer 缓冲区,channel 会注册到 selector
selector 会根据 channel 上发生的读写事件,将事情请求交由某个空闲线程处理
buffer 和 channel 都是可读可写的
四、select、poll、epoll 有什么区别?
它们是由Linux操作系统提供的NIO中多路复用的三种实现机制。
操作系统为了保护系统安全,将内核划分为两个部分:一个是内核空,一个是用户空间。用户空间不能直接访问底层的硬件设备,它必须通过内核空间来访问硬件。
文件描述符 File Descriptor (FD) :是一个抽象的概念,形式上是一个整数,实际上是一个索引值。指向内核中为每个进程准确进程所打开的文件记录表,当程序打开或创建一个文件时,内核就会向进程返回一个FD。
select 机制:会维护一个FD的集合fd_set,将fd_set从用户空间复制到内核空间,激活Socket。
poll 机制:和 select 机制基本一样,把fd_set机构进行了优化。FD集合的大小突破了操作系统的限制。pollfd结构代替fd_set,通过链表实现
epoll 机制:Event Poll epoll 不再扫描素有的FD,只是将用户关心的FD的事件存放到内核的一个事件表当中,可以减少用户空间与内核空间之间的数据拷贝。
操作方式 | 底层实现 | 最大连接数 | IO效率 | |
---|---|---|---|---|
select | 遍历 | 数组 | 受限于内核 | 一般 |
poll | 遍历 | 链表 | 无上限 | 一般 |
epoll | 事件回调 | 红黑树 | 无上限 | 高 |
JAVA的NIO中用到的机制:
可以查看 DefaultSelectorProvider 类的源码,在Windwos 下,WindwosSelcetorProvide;在 Linux 下,根据内核版本,2.6以上就是 EPollSelectorProvider ,否则就是 PollSelectorProvider
五、描述HTTP和HTTPS的区别?
HTTP:是互联网应用最为广泛的一种网络通信协议,基于TCP,可以使浏览器工作更为高效,减少网络传输。
HTTPS:是HTTP的加强版,可以认为是 HTTP + SSL(secure socket layer) 在HTTP的基础上增加了一系列的安全机制。一方面保证数据传输安全,另一方面对访问者增加了验证机制,是目前现象架构下最为安全的解决方案。
主要区别:
1、HTTTP 的连接时简单无状态的;HTTPS 的数据传输是经过证书加密的,安全性高;
2、HTTP 是免费的,而 HTTPS 需要申请证书,而证书通常是需要收费的,且价格不菲;
3、它们的传输协议也不同,所以它们的端口也不一样。HTTP 是 80 端口,HTTPS 是 443 端口;
HTTPS 的缺点:
1、握手协议比较费时,所以会影响服务的相应速度已经吞吐量;
2、并不是完全安全的,因为它的证书不是完全安全的,而且HTTPS在面对DDOS这样的攻击时,几乎起不到任何作用;
3、证书需要钱,而且功能越强大的证书费用越高;