JAVA网络通信的理解和学习

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

TCP Transfer Control Protocol 是一种面向连接的、可靠的、传输层通信协议。
特点:好比是打电话:面向连接的,点对点的通信,高可靠的,效率比较低,占用的系统资源比较多。

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

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

3、如果是两次握手,可能造成连接资源浪费的情况。
client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。

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

1.BlO 同步阻塞IO
特点:可靠性差,吞吐量低,适用于连接比较少且比较固定的场景,JDK1.4之前唯一的选择,这种编程模型最简单。比如tomcat、web应用。
原理:当有一个客户端发起请求,服务端会生成一个处理请求的线程。
问题:当有多个客户端时,服务端需要开启多个线程,当并发量越来越多时,服务端的性能会被影响。
在这里插入图片描述
2.NIO 同步非阻塞IO
特点:可靠性比较好,吞吐量也比较高,适用于连接比较多并且连接比较短(轻操作),例如聊天室。JDK1.4开始使用。现在使用最广的是NIO,Netty也是基于NIO实现的。编程模型最复杂。
原理:为了解决BIO线程太多的问题,引入协调者selector,处理客服端发起的请求。
在这里插入图片描述

3.AIO 异步非阻塞IO
特点:可靠性是最好的,吞吐量也是非常高。适用于连接比较多,并且连接比较长(重操作)。例如 相册服务器。JDK7版本才支持的。编程模型比较简单,需要操作系统来支持。
原理:在NIO的基础上加了异步通知的功能,每次请求之后,服务端会有一个异步请求的队列,服务端处理完之后,把响应通过队列返回给客户端。所有客户端的请求,服务端不需要集中的处理,不用一直监控Thread线程。相对于NIO,编程模型比较简单,但是需要操作系统支持。
问题:异步通知的过程,服务端没有办法做,服务相对来说比较不稳定,有种情况:客户端请求了,服务端停了,就通知不了了。所以只能使用操作系统来保证。
在这里插入图片描述

同步、异步-针对请求 和 阻塞、非阻塞 -针对客户端。
在一个网络请求中,客户端会发一个请求到服务端。
1、客户端发了请求后,就一直等着服务端响应。客户端:阻塞。请求:同步
2、客户端发了请求后,就去干别的事情了。时不时的过来检查服务端是否给出了响应。 客户端:非阳塞。请求:同步。
3、优化之后,换成异步请求。客户端发了请求后,不用检查,等着服务端返回响应。客户端:阳塞。请求:异步。性能提升了。
4、最好的方式,客户端发了请求后,就去干别的事情了。等到服务端给出响应后,再过来处理业务逻辑。客户端;非阳塞。请求:异步。

BIO模型实现:在这里插入图片描述

在这里插入图片描述

NIO模型实现:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

AIO模型实现:
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
①channel类似于流。每个channel对应一个buffer缓冲区。channel会注册到selector。
②selector会根据channel上发生的读写事件,将请求交由某个空闲的线程处理。selector对应一个或者多个线程。
③Buffer和Channel都是可读可写的。

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

他们是NIO中多路复用的三种实现机制,是由Linux操作系统提供的。
用户空间和内核空间:操作系统为了保护系统安全,将内核划分为两个部分,一个是用户空间,一个是内核空间。用户空间不
能直接访问底层的硬件设备,必须通过内核空间。

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

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

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

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

简单总结:

Java的NIO当中是用的那种机制?
可以查看DefaultSelectorProvider源码。在windows下, WindowsSelectorProvider.而Linux下,根据Linu的内核版本,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、证书需要费钱,并且功能越强大的证书费用越高。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱喝皮蛋瘦肉粥的小饶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值