当 iOS 应用程序确实进入后台时,TCP 和 UDP(使用多播)连接会发生啥情况
Posted
技术标签:
【中文标题】当 iOS 应用程序确实进入后台时,TCP 和 UDP(使用多播)连接会发生啥情况【英文标题】:What happens to TCP and UDP (with multicast) connection when an iOS Application did enter background当 iOS 应用程序确实进入后台时,TCP 和 UDP(使用多播)连接会发生什么情况 【发布时间】:2012-01-28 17:10:36 【问题描述】:我创建了几个实验:
设置 1:我创建了一个 TCP Sender 应用和一个 TCP Receiver 应用。
对于这个实验,我在一个 ios 设备上启动了 TCP Sender,在另一个 iOS 设备上启动了 TCP Receiver。然后验证两者都已建立连接并发送和接收数据。然后我将 TCP Receiver 应用程序置于后台。 TCP Sender 应用程序指示失去连接并崩溃(是的,我打算那样做)。
设置 2:我创建了一个 UDP Sender 应用和一个 UDP Receiver 应用。
同上,我在 iOS 设备上启动了 UDP Sender 应用程序,在另一台 iOS 设备上启动了 UDP Receiver 应用程序。在 UDP Receiver 应用程序上,我订阅了一个多播组等。我验证了 UDP Receiver 应用程序正在接收来自 UDP Sender 应用程序发送的该多播组的数据。然后我将 UDP Receiver 应用程序置于后台。 2 分钟后,我让 UDP Sender 应用程序发送另一条数据。然后我完全退出 UDP Sender 应用程序并关闭该 iOS 设备。然后我再等待 2 分钟或更长时间,然后从后台启动 UDP Receiver 应用程序。 UDP Receiver 应用在终止之前确实收到了 UDP Sender 应用发出的数据。
在setup1中,我的解释是因为TCP是面向连接的。
在 setup2 中,我了解 UDP 是无连接的。任何解释为什么 setup2 它在我的经验中起作用? (即使在后台模式下仍然接收数据)
【问题讨论】:
【参考方案1】:当您将应用程序置于后台然后让它暂停时发生的所有事情就是它停止被内核调度。它不会立即断开任何连接或拆除任何套接字(除非您强制它这样做。)
在您的 UDP 情况下,内核接收数据包并将其放入内核缓冲区,等待您的应用接收它。由于您的应用程序进程存在但实际上已停止,因此数据将仅位于内核缓冲区中。如果你得到太多数据,它会溢出内核缓冲区并被丢弃。否则,您的应用可以在(如果)再次安排时接收它。
在 TCP 案例中,几乎发生了同样的事情。
但是(大但是):如果操作系统愿意,基于内存压力等,它总是可以选择拆除挂起的应用程序的套接字。因此,虽然它不一定会无缘无故地这样做,但它可能会这样做。
我不确定您看到 TCP 连接快速断开的确切原因。可能是因为 TCP 连接比 UDP 套接字需要更多的状态和更连续的处理,所以用于服务器 TCP 连接的内核启发式比 UDP 套接字更积极。
见Technical Note TN2277 Networking and Multitasking。
【讨论】:
顺便说一句,我假设当您说“后台”时,您的意思是“已暂停”,因为您没有提到试图运行支持后台的应用程序(VOIP、音乐等)。 ) 除非你做一些特别的事情,否则后台是你的应用程序的一个暂时状态,进入后台后会迅速暂停。请参阅 Apple iOS 应用生命周期文档。 很好的解释!我的想法与您的解释一致,并且(+1 票)技术文章非常证实了这一点。是的,我的意思是暂停而不是背景。仅供参考:我的 TCP Sender 快速崩溃的原因是因为它不断向 Receiver 发送数据流。 这是有道理的:如果您发送目的地没有接收到的数据并在主线程上使用阻塞调用来执行此操作,iOS 将看到您的应用程序没有响应并终止它。 TCP 连接可能仍然没问题;它有流控制来管理缓冲区,但你不能阻塞主线程太久。 很好的答案!它解释了我在项目中的经历:我在 appWillResignActive 中向服务器发送了数据,服务器立即收到,服务器立即响应,但 iOS 应用程序无法立即看到响应;几秒钟后,当我将应用程序带回前台时,调试日志中转储的第一件事就是上述来自服务器的响应。但是,如果我在几分钟而不是几秒钟后将应用程序带回前台,我的应用程序就会崩溃 - 请参阅答案中的“大但是”。【参考方案2】:我的看法是因为操作系统,如果您在安卓操作系统上尝试过,这不应该发生,因为 IO 对哪些可以在后台运行以及哪些不能在后台运行有限制。
从你所说的我认为这是因为 TCP 需要更多资源来发送信息。 TCP 使用数据流,UDP 使用数据块。问题是 TCP 会创建更大的数据包,而 UDP 使用 8 kb 的数据块。
【讨论】:
以上是关于当 iOS 应用程序确实进入后台时,TCP 和 UDP(使用多播)连接会发生啥情况的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序进入后台和前台时,带有通知中心的登录屏幕,Swift
UIWebView:当应用程序进入后台时,iOS 6 中的 HTML5 音频暂停