网络编程-day4

面试问题总结

1.项目中如何实现TCP的并发?
答:
多进程:服务端为每个新的客户端连接创建一个新的进程。这种方法的优点是简单易理解,每个进程独立运行,容错性好。但缺点是进程创建和切换的开销较大,不适合大量并发连接。
多线程:服务端为每个新的客户端连接创建一个新的线程。相比多进程,多线程的开销较小,因为线程间切换的成本低于进程间切换,共享资源的管理也比较方便。但多线程程序设计相对复杂,需要妥善处理同步和并发问题。
I/O 多路复用:通过选择性地阻塞在多个 I/O 上,例如使用 select、poll 或 epoll(在 Linux 上)等系统调用,服务器可以在单线程或少量线程中管理多个客户端连接。当某个 I/O 流准备好进行读写操作时,系统会通知服务器程序,从而进行相应的处理。
在实现 TCP 并发时,还需要考虑到负载均衡、资源管理、错误处理等问题,以确保服务器的稳定和性能。选择哪一种方法取决于具体的应用需求、性能要求和开发资源。
2.TCP通信过程中的三次握手?
答:
第一次握手:SYN=1,seq=x。客户端给服务端发一个SYN报文,并指明客户端的初始序列号ISN。此时客户端处于SYN_SENT状态。首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。
第二次握手:SYN=1,ACK=1,seq=y,ack=x+1。服务器收到客户端的SYN报文后,会以自己的SYN报文作为应答,并且也是指定了自己的初始化序列号ISN(s)。同时会把客户端的ISN+1作为ACK的值,表示自己已经收到了客户端的SYN,此时服务器处于SYN_RCVD的状态。
第三次握手:ACK=1,seq=x+1,ack=y+1。客户端收到SYN报文之后,会发送一个ACK报文,当然,也是一样把服务器的ISN+1作为ACK的值,表示已经收到了服务器的SYN报文,此时客户端处于ESTABLISHED状态。服务器收到ACK报文之后,也处于ESTABLISHED状态,此时,双方已建立了连接。
简记:同步包→同步包+应答包→应答包
3.四次挥手的过程?
答:
刚开始双方都处于ESTABLISHED状态,假如是客户端先发送关闭请求。四次挥手的过程如下:
第一次挥手:FIN=1,序号seq=u。客户端发出连接释放报文段,并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务器的确认。
第二次挥手:ACK=1,确认号ack=u+1,序号seq=v,服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。
第三次挥手:FIN=1,ACK=1,序号seq=w,确认号ack=u+1。服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。
第四次挥手:ACK=1,seq=u+1,ack=w+1。客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
注:MSL是Maximum Segment Lifetime的英文缩写,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
简记:FIN包→应答包→FIN包→应答包
4.TCP/IP协议分几层?TCP/IP是哪一层?​​​​​​​​​​​​​​
答:
TCP/IP协议分为四层,从下到上分别为网络接口层、网络层、传输层、应用层。TCP位于传输层,IP位于网络层。
5.UDP为什么丢包,怎样处理?丢包发生在哪一层?为什么?
答:
1)接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在第二次调用间隔里,发过来的包可能丢失。对于这种情况,可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续recv。
2)发送的包太大导致丢包:虽然send方法会帮你做大包切割成小包发送的事情,但包太大也不行。例如超过50K的一个udp包,不切割直接通过send方法发送也会导致这个包丢失。这种情况需要切割成小包再逐个send。
3)发送的包较大,超过接受者缓存导致丢包:包超过mtu size数倍,几个大的udp包可能会超过接收者的缓冲,导致丢包。这种情况可以设置socket接收缓冲。
4)发送的包频率太快:虽然每个包的大小都小于mtu size 但是频率太快,例如40多个mut size的包连续发送中间不sleep,也有可能导致丢包。这种情况考虑sleep一下。
5)局域网内不丢包,公网上丢包。这个问题我也是通过切割小包并sleep发送解决的。如果流量太大,这个办法也不灵了。总之udp丢包总是会有的,如果出现了用我的方法解决不了,还有这个几个方法: 要么减小流量,要么换tcp协议传输,要么做丢包重传的工作。
丢包发生在网络层原因:
网络拥堵:当网络中的数据流量超过了网络设备(如路由器或交换机)的处理能力时,这些设备的缓冲区可能会满,导致无法继续接收新的数据包。当缓冲区满时,新到达的数据包将被丢弃。网络拥堵是导致丢包最常见的原因之一。
路由问题:数据包在网络层按照路由算法确定的路径从源头路由到目标。如果路由配置错误或是动态路由算法遇到问题,可能导致数据包被错误地发送到不存在或无法到达的目的地,从而导致丢包。
硬件故障:网络设备的物理损坏或故障也可能导致丢包。例如,路由器的接口损坏,导线问题,或其他硬件故障都可能阻止数据包的正确传输。
链路质量差:无线网络或长距离传输中的信号衰减、干扰、噪声等问题也是导致丢包的常见原因。在这些情况下,数据包在传输过程中可能会变得不完整或损坏,接收端设备无法正确解析这些数据包,导致丢包。
包过大:如果数据包的大小超过了网络中间设备的最大传输单元(MTU),而且数据包没有设定允许分片或者路径上的某个设备不支持分片,那么这个数据包会被丢弃。
安全策略:为了安全考虑,一些网络设备可能配置了包过滤或防火墙规则,用于阻止特定类型的流量。符合这些规则的数据包将被丢弃。
6.TCP是同步还是异步?谈谈你对同步异步的理解?
答:
TCP(传输控制协议)本身在底层是同步的,因为它需要建立连接,在发送方和接收方之间传输数据,并确认数据包已接收。TCP确保数据准确无误地从一个网络端点传递到另一个网络端点。
对于同步(Synchronous)来说,它通常指的是操作的发起者必须等待这个操作完成才能继续进行后续的操作。在同步操作中,任务按照它们发生的顺序依次执行,每个任务的完成是下一个任务开始的前提。例如,当你进行网络请求,在得到响应之前,程序将不会执行后续代码,这是同步操作的特点。
而异步(Asynchronous)操作则不同,异步意味着操作的发起者不必等待操作完成就可以继续执行后续的操作。在异步执行中,可以启动一个任务,并且在它完成之前就开始执行其他任务。当该任务完成时,程序会在适当的时间处理完成的操作。这种方式允许程序在等待长时间操作(如文件读写、网络请求等)的同时,继续执行其他代码,从而优化程序的整体性能。
系统中的同步和异步操作常常结合起来使用,以实现更高效、可靠的数据处理和通信。应用程序根据不同的需要,可能采用同步或异步模式来处理任务,或者结合使用二者的特点。例如,在一个TCP服务中,尽管TCP协议是同步的,但应用层可以采用异步编程模型来管理多个TCP连接,以提高系统的并发能力和性能。
7.什么是TCP的沾包现象,如何解决?
答:
​​​​​​​​​​​​​​TCP的粘包现象(sticky packets phenomenon)是指在使用TCP进行通信时,由于TCP是一个面向字节流的协议,它会将应用程序的数据看作一串无结构的字节流,数据包之间的界限并不是固定的。因此,当发送方连续快速发送多个较小的消息时,TCP可能将它们合并为一个较大的数据包来提高效率,同样,接收方也可能一次性读取并合并多个数据包。这就可能导致接收端不能确定每个数据包的边界,即发生粘包。
解决粘包问题一般有以下几种方法:
消息定界:为每个消息设置边界,如使用特殊的分隔符或序列来标识消息的开始和结束。接收方在接收数据时,根据这些定界符来分割原始字节流,从而恢复出独立的消息。
固定长度:每个消息都采用固定的长度,这样接收方就可以在接收到对应长度的数据后进行处理。
消息长度字段:在消息的开始处添加一个长度字段,这个长度字段指示了整个消息的长度,接收方首先读取长度字段,然后读取相应长度的数据作为一个消息。
组合方法:在消息开始处既指定消息的长度又包含一些结束符,确保接收方能准确无误地分割消息。
应用层协议设计:设计实用的应用层协议来处理消息的封包和解包。例如,HTTP、FTP等应用层协议都有自己的处理方式来防止粘包问题。
利用现成的框架和库:许多网络编程库(如Netty、asyncio等)提供了解决粘包问题的机制,无需手动处理粘包,只需要按库的规定编写逻辑即可。
在应用层实现这些策略可以避免TCP粘包现象,确保数据能够正确、完整地在客户端和服务器之间传输。
8.组播和广播的区别?
​​​​​​​​​​​​​​答:
组播(Multicast)和广播(Broadcast)是网络通信中用于发送消息给多个目的地的两种机制:
广播:
- 广播是一对所有的通信方式,其中一台主机发送的消息将传送给同一局域网(LAN)上的所有其他主机。
- 广播消息通常用在没有特定目标的情况下,例如,当新设备加入网络并寻址DHCP服务器以获取IP地址时,它会发送广播消息。
- 广播地址对于所有设备都是公开和可识别的,就像把信件扔进一个房间让每个人都能拿去阅读。
- 在广播中,网络中的每台设备即使对消息不感兴趣也会收到消息,这可能导致无用的网络流量和设备处理。
组播:
- 组播允许将消息同时发送给一组指定的目的地(即组播组中的主机)。只有加入该组的主机才会接收组播消息。
- 组播地址仅适用于那些已经表明愿意接收该特定组播组消息的设备。
- 组播有效地支持了多点传输,仅将消息传递给感兴趣的监听者,这样就减少了网络的拥堵和无效流量。
- 组播广泛用于流媒体、实时应用和网络服务中,例如视频会议和在线游戏,典型的例子有IGMP(Internet Group Management Protocol)和多播路由。
总结来说,广播是将消息发送给所有人,而组播是将消息仅发送给一组感兴趣的监听者。组播比广播更有效率,因为它减少了不必要的数据传输。
9.阻塞IO和非阻塞IO的区别?
答:
阻塞IO(Blocking IO)和非阻塞IO(Non-blocking IO)主要区别体现在程序如何等待IO操作完成:
阻塞IO:
- 在阻塞IO模型中,当一个IO操作(如读取或写入)开始时,如果数据没有准备好,程序会被挂起(即阻塞),直到数据准备好并且IO操作完成。
- 在数据准备阶段,程序做不了其他事情,它会等待在那里直到整个IO操作完全完成后才会继续执行。
- 阻塞IO简化了编程模型,因为在发起IO请求之后,你只需要等待结果,不必担心在这个过程中如何处理其他任务。
非阻塞IO:
- 非阻塞IO模型中,IO操作不会导致程序挂起等待。如果数据没有准备好,IO调用会立即返回一个指示数据尚未准备好的状态。
- 程序可以继续执行后续代码,它可以定期地检查IO操作是否可以进行,或者可以进行其他工作,这样很好地利用了等待时间。
- 非阻塞IO通常与事件驱动或轮询机制一起使用,程序可以在多个IO操作之间有效地切换,提高了程序的整体效率和响应性。
非阻塞IO更适用于处理高并发情况,尤其在需要同时管理多个连接或者进行多个并行IO操作时。但这种模型编程难度较高,因为要管理和调度多个IO操作,而且可能需要额外的机制(如IO复用或事件通知)来检测IO状态。
10.并发和并行的区别?
答:
并发(Concurrency)和并行(Parallelism)是计算机科学中两个关键概念,常常用来描述处理多个任务的能力,它们之间有着本质的区别:
并发:
- 并发是指一个处理单元(如CPU)在同一时间段内处理多个任务的能力。它更多地关注多任务的交错执行,即任务在单个核心上通过上下文切换实现多任务的“同时”处理。
- 并发不是真正的同时执行多个操作,而是从宏观角度看,使得每个任务都有机会按顺序执行,从而给用户一种多个任务同时处理的错觉。
- 并发更多地应用于任务处理的组织和调度上,常用于单核或多核处理器上的任务管理,以提高资源的使用效率和系统的响应速度。
并行:
- 并行是指多个处理单元(如多个CPU核心)同时执行多个任务或操作。在并行计算中,每个处理单元都在同一时刻独立地执行不同的任务,实现了真正的同时处理。
- 并行计算侧重于通过增加计算资源来增加计算速度,适用于有大量计算需要分割执行的场景,如大规模科学计算、图像处理等。
- 在多核和多处理器系统中,并行计算可以显著提高计算效率和处理速度,特别是对于可以明确分解和独立执行的任务。
简而言之,并发是任务交错执行(在单个核心上“同时”处理多个任务),并行是多个核心同时执行任务。并发的目的在于充分利用有限的计算资源以提高效率,而并行的目标是通过增加计算资源来减少计算时间。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值