Java网络通信

TCP和UDP有什么区别?

TCP(Transfer Control Protocol)是一种面向连接的、可靠的、传输层通讯协议。

TCP的特点:类似打电话,面向连接的、点对点的通信、高可靠的,效率比较低,占用的系统资源比较多。

UDP(User Datagram Protocol)是一种无连接的、不可靠的、传输层的通讯协议。

UDP的特点:类似广播,不需要连接,发送方不管接受方有没有准备好,直接发消息,可以进行广播发送的,传输不可靠,有可能丢失消息,效率比较高,协议比较简单,占用的系统资源比较少。

TCP为什么是三次握手,而不是两次?

TCP建立连接三次握手,断开连接四次挥手。 如果是两次握手,可能会造成连接资源浪费的情况,server端会建立通道一直等待连接,但是client端会认为连接失败,放弃本次通信。

Java有哪几种IO模型?有什么区别?

有BIO 同步阻塞IO、NIO 同步非阻塞IO、AIO异步非阻塞IO模型。

这里的同步、异步针对请求,阻塞和非阻塞针对客户端。

在一个网络请求中,客户端会发一个请求到服务端:

  • 客户端发了请求后,就一直等着服务端响应,客户端:阻塞。请求:同步

  • 客户端发了请求后,就去干别的事情了,是不是的过来检查服务端是否给出了响应,客户端:非阻塞,请求:同步

  • 换成异步请求,客户端发了请求后,就坐在椅子上,等着服务端返回响应。客户端:阻塞,请求:异步。

  • 客户端发了请求后,就去干别的事情了,等到服务端给出响应后,再来处理业务逻辑。客户端:非阻塞。请求:异步

具体区别如下:

BIO模式:可靠性差,吞吐量低,适用于连接比较少且比较固定的场景,JDK1.4之前唯一的选择。编程模型最简单。

image-20220614233811412

NIO模型:可靠性比较好,吞吐量比较高,适用于连接多,并且连接比较短(轻操作),例如聊天室,JDK1.4开始支持,编程模型最复杂。

image-20220614233902764

AIO模型:可靠性是最好的,吞吐量也是最高的,适用于连接比较多,并且连接比较长(重操作),例如相册服务器,JDK7开始支持的,编程模型相对简单,但是需要操作系统支持。

image-20220614233942183

Java NIO的几个核心组件是什么?分别有什么作用?

Java NIO的几个核心组件有:Channel、Buffer、Selector,它们之间的关系如下:

NIO

Channel类似于流,每个Channel对应一个Buffer缓冲区,Channel会注册到Selector,Selector会根据Channel上发生的读写时间,将请求交由某个空闲的线程处理,Selector对应一个或者多个线程。Buffer和Channel都是可读可写的。

select、poll、epoll有什么区别?

他们是NIO中多路复用的三种实现机制,是由linux操作系统提供的。

用户空间和内核空间:操作系统为了保护系统安全,将内核划分为两个部分,一个是用户空间,一个是内核空间。用户空间不能直接访问底层的硬件设备,必须通过内核空间。

文件描述符 File Descriptor(FD):是一个抽象的概念,形式上是一个整数,实际上是一个索引值。指向内核中为每个进程维护进程所打开的文件的记录表。当程序打开一个文件或者创建一个文件时,内核就会向进程返回一个FD,Unix、Linux。

  • select机制:会维护一个FD的结合fd_set。将fd_set从用户空间复制到内核空间,激活socket。

  • poll机制:和select机制差不多的。把fd_set结构进行了优化,FD集合的大小就突破了操作系统的限制,poll fd结构来代替fd_set,通过链表实现

  • epoll(Event poll):epoll中不再扫描所有的FD,而是只将用户关心的FD的事件存放到内核的一个事件表当中。这样就可以减少用户空间与内核空间之前需要拷贝的数据。

总结如下表:

操作方式底层实现最大连接数IO效率
select遍历数组受限于内核一般
poll遍历链表无上限一般
epoll事件回调红黑树无上限

那Java的NIO当中时使用的哪种机制呢?

这与操作系统有关,在windows下,WindowsSelectorProvider。而linux下,根据linux的内核版本,2.6内核版本以上,就是EpollSelectorProvider,默认使用的是PollSelectorProvider

HTTP和HTTPS的区别?

HTTP:是互联网上应用最为广泛的一种网络通信协议,基于TCP协议,可以使用浏览器工作更为高效,减少网络传输。

HTTPS:是HTTP的加强版,可以认为是HTTP + SSL(Secure Socket Layer)。在HTTP的基础上增加了一系列的安全机制,一方面保证数据传输安全,另一方面对访问者增加了验证机制。是目前现行架构下,最为安全的解决方案。

主要区别:

  • HTTP的连接时简单无状态的,HTTPS的数据传输时经过证书加密的,安全性更高。
  • HTTP是免费的,而HTTPS需要申请证书,而证书通常是收费的,并且费用一般不低。
  • 他们的传输协议不同,所以他们使用的端口也是不一样的,HTTP默认端口是80,而HTTPS默认是443端口

HTTPS的缺点:

  • HTTPS的握手协议比较费时,所以会影响服务的响应速度以及吞吐量。
  • HTTPS也并不是完全安全的,他的证书体系并不是完全安全的。 并且HTTPS在面对DDOS这样的攻击时,几乎起不到任何作用。
  • 证书不免费,并且功能越强大的证书费用越高。

三次握手和四次挥手?

所谓三次握手,是指建立一个TCP连接时,需要客户端和服务器总共发送3个包,三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。

在socket编程中,客户端执行connect时,将触发三次握手:

三次握手示意图

TCP的连接的拆除需要发送四个包,因此称为四次握手,也叫做改进的三次握手。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作:

四次挥手示意图