TCP特性-缓冲区

549 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

TCP特性-缓冲区

之前一直有个疑惑,假设服务端向客户端不断的发送大量数据,而客户端处理不过来怎么办?现在终于也有了答案。

TCP 缓冲区

TCP的缓冲区分为两个部分

  • 用户缓冲区 (接收发送的缓冲区,可以通过setSendBufferSize修改)

  • TCP低层缓冲区 (操作系统TCP模块的缓冲区,各系统下变现会不同,无法修改)

TCP通信模块流程复杂,但这些复杂的流程不需要上层软件去操心,这是系统底层TCP模块的事情,我们只需要将数据丢入缓冲区。

由于TCP是可靠的协议,当网络很差时,数据发送失败时,tcp socket程序会报错。 但是有一种情况,当网络通道遭到破坏时,无法立即给出报错提示。这种场景包括:

  1. 客户端断开网络连接,但依然有网络连接时(拔网线,路由器电源还在)

  2. 服务端断开网络,客户端向服务器发送数据。

大家可以用一些即使通信的软件去试试,服务端拔不了网线,就用拔自家的网线吧。

如何解决这一痛点,那就是使用心跳包 + 确认包确认收到的协议。

又扯远了,回到正题。。

TCP发送消息时阻塞

笔者之前有个误区,我认为:

TCP发送端在发送数据时,一直往缓冲区里一直放,底层的TCP模块就会一直发送给接收端,无论接收端是否能处理过来

实际上,当发送端的缓冲区满了之后,就会一直阻塞,当接收端取了数据之后,发送端缓冲区空出来了,发送端才可以继续往缓冲区中放。

所以... 文章引言部分的问题压根就不存在!

因为不可能存在处理不过来的情况,而作为安卓客户端接收的话,唯一的做法就是在接收到数据之后,加个线程去处理数据,接收线程继续接收。