15 Java套接字编程,网络面试问答

网络和套接字编程是Java编程语言最重要的领域之一,对于在基于客户端/服务器的应用程序中工作的程序员而言,尤其如此。 对重要协议(例如TCP和UDP)的详细了解非常重要,尤其是如果您从事编写通过FIX协议或本机交换协议进行通信的高频交易应用程序时。

在本文中,我们将讨论一些有关网络和套接字编程常见问题 ,这些问题大多基于TCP IP协议。 本文虽然对NIO颇有帮助,因为它不包含有关多路复用,选择器,ByteBuffer和FileChannel等的问题,但确实包含诸如IO和NIO之间的区别之类的经典问题。 这篇文章的主要重点是使Java开发人员熟悉底层部分,例如TCP和UDP协议的工作方式,套接字选项以及用Java编写多线程服务器。

这里讨论的问题并没有真正与Java编程语言联系在一起,可以在任何编程语言中使用,从而使程序员可以编写客户端-服务器应用程序。 顺便说一句,如果您打算在一家投资银行接受Java核心开发人员的面试,则最好在Java NIO,套接字编程,TCP,UDP和网络以及其他流行主题(如多线程Collections API)上做好充分的准备和垃圾收集调优 。 您也可以提出任何询问给您的或与套接字编程和联网有关的问题,这对于Java采访很有用。

这是我的15个与网络基础知识,Internet协议和Java套接字编程有关的访谈问题的列表。 尽管它不包含来自API的基本问题,例如Server,ServerSocket,但它专注于使用NIO选择器以Java编写可伸缩服务器的高级概念,以及如何使用线程 ,限制和问题等来实现这一点。我可能会增加一些在用Java编写基于套接字的应用程序时,会基于一些最佳实践提出更多问题。 如果您知道有关此主题的好问题,请随时提出建议。

1. TCP和UDP协议之间的区别?

TCP(传输控制协议)和UDP(用户数据报协议)之间有很多区别,但是主要是TCP面向连接,而UDP则较少连接。 这意味着TCP提供了按消息发送顺序保证的消息传递,而UDP不提供任何传递保证。 由于这种保证,TCP比UDP慢,因为它需要执行更多工作。 TCP最适合您无法承受损失的消息,例如电子交易中的定单和交易消息,银行和金融业的电汇等。UDP更适合于媒体传输,即丢失一个数据包(称为数据报)价格适中,并且不会影响服务质量。

对于大多数面试而言,这个答案就足够了,但是当您作为高频交易台的Java开发人员面试时,您需要更加详细。 许多候选人忘记提及的一些要点是关于顺序数据边界的 。 在TCP中,确保以与发送消息相同的顺序传递消息,但不保留数据边界,这意味着可以将多个消息组合在一起发送,或者接收方可以在一个数据包中接收消息的一部分,而在另一数据包中则可以接收下一个数据包中消息的一部分。 虽然应用程序将以相同的顺序收到完整的消息。 TCP协议将为您完成消息的组装。 另一方面,UDP在数据报数据包中发送完整的消息,如果客户端接收到该数据包,则可以保证它将获取完整的消息,但不能保证数据包的发送顺序与发送时的顺序相同。 简而言之,在面试时回答时,您必须提及TCP和UDP协议之间的以下区别:

  • TCP是保证传递的,UDP是不能保证的。
  • TCP保证消息的顺序,而UDP不保证。
  • 数据边界未保留在TCP中,但UDP保留了它。
  • TCP比UDP慢。

有关更详细的答案,请参阅我的帖子9 TCP和UDP协议之间的区别

2. TCP握手如何工作?

作为TCP握手的一部分,交换了三个消息,例如,发起方发送SYN,接收方发送SYN-ACK,最后发起方回复ACK,此时TCP连接移至ESTABLISHED状态。 通过查看下图可以很容易地理解此过程。

TCP握手消息图

3.如何在UDP协议中实现可靠的传输?

这通常是先前面试问题的跟进。 尽管UDP在协议级别上不提供传递保证,但是您可以引入自己的逻辑来维护可靠的消息传递,例如通过引入序列号和重传。 如果接收方发现它错过了序列号,则可以要求服务器重播该消息。 Tibco Rendezvous (一种流行的高速消息传递中间件)中使用的TRDP协议使用UDP来加快消息传递速度,并通过使用序列号和重传来提供可靠性保证。

如果两个主机具有不同的字节顺序,该如何通信?

有两种方法可以在内存中存储两个字节:little endian(起始地址中的最低有效字节)和big endian(起始地址中的最高有效字节)。 它们统称为主机字节顺序。 例如,英特尔处理器将32位整数作为四个连续字节存储在内存中,顺序为1-2-3-4,其中1是最高有效字节。 IBM PowerPC处理器将以字节顺序4-3-2-1存储整数。 诸如TCP之类的网络协议基于特定的网络字节顺序 ,该顺序使用big-endian字节顺序。 如果两台机器彼此通信并且它们具有不同的字节顺序,则它们将在发送之前或接收之后转换为网络字节顺序。 因此,发送到UDP / IP网络的小端字节微控制器必须先将字节在多字节值内出现的顺序交换,然后再将值发送到网络上,并且必须交换在收到的多字节值中字节出现的顺序。在使用这些值之前从网络中获取。 简而言之,您也可以说网络字节顺序是传输期间存储字节的标准,并且它使用大端字节顺序机制。

5. Nagle的算法是什么?

如果访问员正在测试您对TCP / IP协议的了解,那么对他而言,不问这个问题是非常罕见的。 Nagle的算法是通过减少需要通过网络发送的TCP数据包的数量来提高TCP / IP协议和网络性能的方法。 它通过缓冲小数据包直到缓冲区达到最大段大小来工作。 这是因为仅包含1个或2个字节数据的小数据包在TCP标头(40个字节)方面具有更多的开销。 这些小数据包也可能导致慢速网络中的拥塞。 Nagle的算法试图通过缓冲TCP协议来提高TCP协议的效率,以便发送更大的数据包。 同样,Nagle的算法对非小写操作也有负面影响,因此,如果要在数据包上写大数据,则最好禁用Nagle的算法 。 通常,Nagle的算法是针对粗心应用程序的防御,粗心应用程序会将大量小数据包发送到网络,但是对于编写良好的应用程序(适当地照顾缓冲),它不会受益或产生负面影响。

6.什么是TCP_NODELAY?

TCP_NODELAY是禁用Nagle算法的选项,该选项由各种TCP实现提供。 由于Nagle的算法在TCP延迟确认算法方面表现不佳,因此最好在执行读写操作时禁用Nagle的算法。 如果在套接字上连续两次写入后的读取可能会延迟最多500毫秒,直到第二次写入到达目的地为止。 如果与带宽使用相比,延迟更受关注,例如在基于网络的多人游戏中,用户希望立即看到其他玩家的动作,则最好使用TCP_NODELAY标志绕过Nagle的延迟。

是TCP还是UDP?

多播或多播传输是一对多的分发,其中,消息是通过发布者的一次传输同时传递给一组订户的。 消息副本是在其他网络元素(例如路由器)中自动创建的,但是仅在网络拓扑需要时才创建。 Tibco Rendezvous支持多播传输 。 多播只能使用UDP来实现,因为它以数据报包的形式发送完整的数据,可以将其复制并传递给其他用户。 由于TCP是点对点协议,因此它无法将消息传递到多个订户,直到它们之间具有链接。 但是,UDP不可靠,并且消息可能会丢失或无法按顺序传递。 已经开发了可靠的多播协议,例如实用通用多播(PGM),以在IP多播的基础上增加丢失检测和重传。 IP多播已广泛部署在企业,商业证券交易所和多媒体内容交付网络中。 IP多播在企业中的常见用法是用于IPTV应用程序。

8. JMS中的Topic和Queue有什么区别?

Java消息服务中的主题和队列之间的主要区别在于,我们有多个使用者来使用使用者消息。 如果我们设置多个侦听器线程以使用Queue中的消息,则每个消息将仅分派到一个线程,而不是所有线程。 另一方面,在主题的情况下,每个订户都获得它自己的消息副本。

9. IO和NIO有什么区别?

NIO和IO之间的主要区别在于NIO提供了异步,无阻塞的IO,这对于编写更快,可扩展的网络系统至关重要。 另一方面,IO类中的大多数实用程序都是阻塞且运行缓慢。 NIO利用UNIX系统中的异步系统调用,例如对网络套接字的select()系统调用。 使用select(),应用程序可以同时监视多个资源,还可以轮询网络活动而不会阻塞。 select()系统调用确定数据是否挂起,然后可以使用read()write()知道它们将立即完成。

10.如何用Java编写多线程服务器?

多线程服务器是可以为多个客户端提供服务而不会阻塞的服务器。 Java为开发这样的服务器提供了出色的支持。 在Java 1.4之前,您可以使用传统的套接字IO和线程编写多线程服务器。 这对可伸缩性有严格的限制,因为它会为每个连接创建一个新线程,并且您只能创建固定数量的线程,具体取决于计算机和平台的能力。 尽管可以通过使用线程池和工作线程来改进此设计,但它仍然是资源密集型设计。 在JDK 1.4和NIO推出之后,编写可伸缩的多线程服务器变得更加容易。 您可以使用Selector轻松地在单线程中创建它,它利用Java NIO的异步和非阻塞IO模型。

11.什么是临时端口?

在TCP / IP中,连接通常包含四项内容:服务器IP,服务器端口,客户端IP和客户端端口。 在大多数情况下,这四个中的三个是众所周知的,不知道的是客户端端口,这是短暂端口出现的地方。 当客户端连接未明确指定端口号时,临时端口是由计算机的IP堆栈从指定范围(称为临时端口范围)分配的动态端口。 这些是短暂的临时端口,一旦关闭连接即可重用。 但是,大多数IP软件在整个范围用尽之前不会重复使用临时端口。 类似于TCP,UDP协议在发送数据报时也使用临时端口。 在Linux中,临时端口范围是32768至61000,而在Windows中,默认临时端口范围是1025至5000。类似地,不同的操作系统具有不同的临时端口范围。

11.什么是滑动窗口协议?

滑动窗口协议是一种用于控制两个网络计算机之间传输的数据包的技术,在这些计算机之间需要可靠且顺序地传输数据包,例如由传输控制协议(TCP)提供的。 在滑动窗口技术中,每个数据包都包含一个唯一的连续序列号,接收计算机使用它来以正确的顺序放置数据。 滑动窗口技术的目的是使用序列号来避免重复数据并请求丢失数据。

12.什么时候出现“打开太多文件”错误?

就像文件连接一样,套接字连接也需要文件描述符。 由于每台机器都有有限数量的文件描述符,因此它们可能用完了文件描述符。 发生这种情况时,您将看到“打开太多文件错误。 您可以通过执行ulimit -n commandulimit -n command /proc/ /fd/上的条目进行计数,来检查在基于UNIX的系统上每个进程允许多少个文件描述符。

套接字连接什么时候进入TIME_WAIT状态?

当通过系统调用关闭TCP连接的一端时,它将进入TIME_WAIT状态。 由于TCP数据包可能以错误的顺序到达,因此不得立即关闭端口以允许较晚的数据包到达。 这就是为什么TCP连接的末端进入TIME_WAIT状态的原因。 例如,如果客户端关闭套接字连接,则它将进入TIME_WAIT状态,类似地,如果服务器关闭连接,则您将在此处看到TIME_WAIT。 您可以通过在UNIX中使用这些网络命令来检查TCP和UDP套接字的状态。

15.如果服务器上的TIME_WAIT状态的套接字连接过多,会发生什么情况?

当套接字连接或端口进入TIME_WAIT状态时,它不会释放与其关联的文件描述符。 仅在TIME_WAIT状态消失时(即在指定的配置时间之后)才释放文件描述符。 如果处于TIME_WAIT状态的连接太多,则服务器可能会用完文件描述符,并开始引发“打开太多文件”错误,并停止接受新连接。

这就是网络和套接字编程面试问题清单中的全部内容。 尽管我本来打算将此列表供Java程序员使用,但对于任何程序员来说同样有用。 实际上,这是每个程序员都应该具备的套接字和协议的最低限度的知识。 我发现C和C ++程序员比普通Java程序员更好地回答这些问题。 原因之一可能是因为Java程序员拥有太多有用的库,例如Apache MINA,它们可以为他们处理所有底层工作。 无论如何,基础知识非常重要,其他所有东西都只是一个借口,但与此同时,我还建议使用经过验证的库(例如Apache MINA)来生产代码。

翻译自: https://www.javacodegeeks.com/2014/08/15-java-socket-programming-networking-interview-questions-and-answers.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值