2.图灵学院-----阿里/京东/滴滴/美团整理----高频JAVA网络/IO篇

简介: 2.图灵学院-----阿里/京东/滴滴/美团整理----高频JAVA网络/IO篇

一、TCP和UDP有什么区别?TCP为什么是三次握手,而不是两次?


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

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

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

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


TCP建立连接三次握手,断开连接四次挥手。


两次握手,如果有网络拥堵的情况,会有可能建立好通道,造成资源浪费的情况。

如果是两次握手,首先client给server发送了一个连接请求,server收到了这个请求并且发送了一个确认应答的请求,站在server的角度,它认为连接已经建立成功了,开始发送数据。但是此时client并没有得到响应,它会认为连接还没有建立成功,将忽略server发送的数据,这样server在发出的数据超时后,会重复的发送数据,就形成了死锁的情况。所以两次握手显然不行。


超过三次以上其实都可以,但是三次刚好可以完全建立连接,四次或者多次效率会低点。所以TCP建立连接采用“三次握手”。可能造成连接资源浪费的情况。


二、JAVA有哪几种IO模型?有什么区别?


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


20210508092131686.png

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

类似:web请求中的nginx,帮你选择响应那个请求。

20210508092214655.png

AIO 异步非阻塞IO 可靠性是最好的,吞吐量也是非常高。适用于连接比较多,并且连接比较长(重操作)。例如 相册服务器。JDK7版本才支持的。编程模型比较简单,需要操作系统来支持。


20210508092338306.png

同步 、异步- 针对请求 和 阻塞、非阻塞 - 针对客户端。

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

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

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

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

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


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


Channel Buffer Selector

20210508093642657.png

channel类似于一流。 每个channel对应一个buffer缓冲区。channel会注册到selector。

select会根据channel上发生的读写事件,将请求交由某个空闲的线程处理。

selector对应一个或者多个线程。

Buffer和Channel都是可读可写的。


四、select,poll和epoll有什么区别?


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

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


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


1.select机制: 会维护一个FD的结合 fd_set。将fd_set从用户空间复制到内核空间,激活socket。 x64 2048 fd_set是一个数组结构

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

3.EPoll:Event Poll.Epoll不再扫描所有的FD,只将用户关心的FD的事件存放到内核的一个事件表当中。这样,可以减少用户空间与内核空间之前需要拷贝的数据。


简单总结:


20210508100435160.png


java的NIO当中是用的那种机制?


可以查看DefaultSelectorProvider源码。在windows下,WindowsSelectorProvider。而Linux下,根据Linux的内核版本,2.6版本以上,就是EPollSelectorProvider, 否则就是默认的 PollSelectorProvider.

select 1984年出现, poll 1997年出现, EPoll 2002年


五、描述下HTTP和HTTPS的区别?


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

HTTPS: 是HTTP的加强版,可以认为是HTTP+SSL(Secure Socket Layer)。在

HTTP的基础上增加了一系列的安全机制。一方面保证数据传输安全,另一位方面对访问者增加了验证机制。是目前现行架构下,最为安全的解决方案。

主要区别

1、HTTP的连接是简单无状态的,HTTPS的数据传输是经过证书加密的,安全性更高。

2、HTTP是免费的, 而HTTPS需要申请证书,而证书通常是需要收费的,并且费用一般不低。

3、他们的传输协议不通过,所以他们使用的端口也是不一样的, HTTP默认是80 端口,而HTTPS默认是443端口。

HTTPS的缺点:

1、HTTPS的握手协议比较费时,所以会影响服务的响应速度以及吞吐量。

2、HTTPS也并不是完全安全的。他的证书体系其实并不是完全安全的。并且HTTPS在面对DDOS这样的攻击时,几乎起不到任何作用。

3、证书需要费钱,并且功能越强大的证书费用越高。

目录
相关文章
|
26天前
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
网络协议与IO模型
|
7天前
|
网络协议 物联网 API
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第26天】Python 是一门功能强大且易于学习的编程语言,Twisted 框架以其事件驱动和异步IO处理能力,在网络编程领域独树一帜。本文深入探讨 Twisted 的异步IO机制,并通过实战示例展示其强大功能。示例包括创建简单HTTP服务器,展示如何高效处理大量并发连接。
24 1
|
8天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
161 1
|
1月前
|
安全 NoSQL Java
一文搞懂网络通信的基石✅IO模型与零拷贝
【10月更文挑战第1天】本文深入探讨了网络通信中的IO模型及其优化方法——零拷贝技术。首先介绍了IO模型的概念及五种常见类型:同步阻塞、同步非阻塞、多路复用、信号驱动和异步IO模型。文章详细分析了每种模型的特点和适用场景,特别是多路复用和异步IO在高并发场景中的优势。接着介绍了零拷贝技术,通过DMA直接进行数据传输,避免了多次CPU拷贝,进一步提升了效率。最后总结了各种模型的优缺点,并提供了相关的代码示例和资源链接。
一文搞懂网络通信的基石✅IO模型与零拷贝
|
28天前
|
开发者
什么是面向网络的IO模型?
【10月更文挑战第6天】什么是面向网络的IO模型?
20 3
|
28天前
|
数据挖掘 开发者
网络IO模型
【10月更文挑战第6天】网络IO模型
35 3
|
27天前
|
缓存 Java Linux
硬核图解网络IO模型!
硬核图解网络IO模型!
|
29天前
|
数据挖掘 开发者
网络IO模型如何选择?
网络IO模型如何选择?【10月更文挑战第5天】
18 2
|
6天前
|
网络协议 调度 开发者
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第27天】本文介绍了Python网络编程中的Twisted框架,重点讲解了其异步IO处理机制。通过反应器模式,Twisted能够在单线程中高效处理多个网络连接。文章提供了两个实战示例:一个简单的Echo服务器和一个HTTP服务器,展示了Twisted的强大功能和灵活性。
18 0
|
1月前
|
Java Linux
【网络】高并发场景处理:线程池和IO多路复用
【网络】高并发场景处理:线程池和IO多路复用
39 2