13 Java生产者是如何管理TCP连接的

为什么采用TCP连接

为什么采用TCP连接作为底层的通讯协议?
1.利用TCP协议本身的高级功能。比如多路复用请求和同时轮询多个连接的能力。
多路复用请求会在一个物理连接上创建多个虚拟连接,每个虚拟连接负责流转各自的数据流。

什么时候创建TCP连接

1.kafkaProducer实例创建时启动Sender线程,创建于bootstrap.servers中所有Broker的TCP连接。
2.kafkaProducer更新元数据后,还会与集群所有的broker创建TCP连接。
3.Producer发消息发现没有与对应的Broker创建连接,会创建连接
4.第二点中创建的连接,支持在长时间空闲后被关闭

评论区精选
1.CLOSE_WAIT状态是在被动方的,即:主动方发起close请求(FIN),被动方回复ACK后,被动方将进入CLOSE_WAIT状态; 之后,被动方才发起FIN请求,进行后续的关闭操作。 这里有个疑问:就是为啥被动关闭的后果是会产生大量的CLOSE_WAIT连接呢? 个人的理解是被动方接下来会发起FIN请求来接着完成四次挥手中的后两次挥手。 直到看了下面的评论才明白,客户端有可能会hold住这个连接,比如不是使用完这个Producer实例发送完消息就进行关闭,而是一直持有,那么就可能会出现上面这种现象!

2.如果Broker端被动关闭,会导致client端产生close_wait状态,这个状态持续一段时间之后,client端不是应该发生FIN完成TCP断开的正常四次握手吗?怎么感觉老师讲的这个FIN就不会再发了,导致了僵尸连接的产生?

问题在于客户端有可能一直hold住这个连接导致状态一直是CLOSE_WAIT。事实上,这是非常正确的做法,至少符合TCP协议的设计。当然,如果客户端关闭了连接,就像你说的,OS会发起FIN给远端

如何关闭TCP连接

1.客户端主动关闭
producer.cloes方法或者关闭producer进程

2.被动关闭
设置connections.max.idle.ms,默认为9分钟没有使用连接,broker就会主动关闭连接,关闭会产生大量的CLOSE_WAIT连接

补充

多路复用

多路复用是怎么回事?
多路复用是让多个信号共用同一个信道。有两个好处:
1.提升吞吐量。多个信号被紧密编排在一起,这样网络不容易空载。比如多个请求的TCP包使用同一个TCP连接并行发送。
2.多个信号之间隔离。信号之间并行传输,并且隔离,不会互相影响。比如多个请求的TCP包使用同一个TCP连接并行发送,某个请求发送失败不会影响其他请求。

多路复用

传输层多路复用

比如一个应用可能向服务器发送多个请求,建立一个请求是需要开销的,所以可以多个请求复用同一个TCP连接。能够提高吞吐量和降低延迟。多个请求的TCP包是并行发送的,如果其中一个请求TCP包发送出现了问题,不会影响其他的请求。

网络层多路复用

两个应用之间的线路、设备、需要跨越的网络往往是固定的。这些应用需要复用同样的基础设施,比如网线、路由器、网关、基站等。

HTTP握手和挥手

HTTP握手和挥手
HTTP握手和挥手讲得很好

你可能感兴趣的:(java,tcp/ip,网络)