当iOS应用程序进入后台时,TCP和UDP(与多播)连接会发生什么

我创建了几个实验:

设置1:我创建了一个TCP Sender应用程序和一个TCP Receiver应用程序。

在本次实验中,我在iOS设备上启动了TCP Sender,在另一台iOS设备上启动了TCP Receiver。 然后两者都经过validation已建立连接并发送和接收数据。 然后我将TCP Receiver应用程序置于后台。 TCP Sender应用程序指示连接丢失和崩溃(是的,我打算这样)。

设置2:我创建了一个UDP Sender应用程序和一个UDP Receiver应用程序。

与上面相同,我在iOS设备上启动了UDP Sender应用程序,在另一个iOS设备上启动了UDP Receiver应用程序。 在UDP Receiver应用程序上,我订阅了一个多播组等。我validation了UDP Receiver应用程序正在从UDP Sender应用程序发出的该多播组中接收数据。 然后我将UDP Receiver应用程序置于后台。 2分钟后,我得到UDP Sender应用程序发送另一条数据。 然后我完全退出UDP Sender应用程序并关闭该iOS设备。 然后我等待另外2分钟或更长时间,然后从后台启动UDP Receiver应用程序。 UDP Receiver应用程序确实接收了UDP Sender应用程序终止之前发送的数据。

在setup1中,我的解释是因为TCP是面向连接的。

在setup2中,我理解UDP是无连接的。 任何解释为什么setup2在我的经历中起作用? (即使在后台模式下仍然可以接收数据)

当你将一个应用程序放到后台然后让它被暂停时发生的一切就是它停止由内核调度。 它不会立即断开任何连接或拆除任何sockets(除非你强制它。)

在您的UDP情况下,内核接收数据包并将其放入内核缓冲区,等待您的应用程序接收它。 由于您的应用程序进程存在但有效停止,因此数据将仅位于内核缓冲区中。 如果你获得太多数据,它将超出内核缓冲区并被丢弃。 否则,您的应用程序可以在(如果)再次安排时收到它。

在TCP案例中,几乎完全相同。

但是(很大但是):操作系统总是可以选择根据内存压力等方式拆除已挂起的应用程序的套接字。因此,虽然它不一定无偿地执行,但它可能会这样做。

我不确定你为什么看到TCP连接快速切断。 可能是服务TCP连接的内核启发式比UDP套接字更具攻击性,因为TCP连接需要比UDP套接字更多的状态和更连续的处理。

请参阅技术说明TN2277网络和多任务处理 。

我的观点是因为操作系统,如果您尝试使用android操作系统,则不应该发生这种情况,因为IO对可以在后台工作的内容有什么限制,哪些不可以。

从你所说的我认为它,因为TCP需要更多的资源来发送信息。 TCP使用数据流,UDP使用数据块。 问题是TCP创建了更大的数据包,而UDP使用8 kb的数据块。