关于tcp代理涉及3个实体:
c: client
p: proxy
s: server
c <—–> p <—–> s
c 和 p建立tcp连接, p 和 s 建立tcp连接;
对于tcp来讲,很可能不是http那样ask and answer then close的, 很有可能连接上长时间没有数据,那么会出现什么问题呢?
- 假如 c 和 p 之间的网线短了, c 不可能再关闭这个连接了,那么p如何释放这个连接呢?
- p 在该连接上设置keepalive,定期检查连接是否断开,一般系统设置的间隔时间为2小时
- 一定程度上,c也关心这个长时间没有使用的连接是否依然可用,那么,c也可以在该连接上设置keepalive
- 问题:
- p 是否会转发c 的keepalive 数据包?
- p 是tcp(传输层)的代理,只有接到数据才会转发,没有数据不会转发
- keepalive 实际上是一个数据长度为0的ip数据包
- 所以: p 不会转发keepalive
- 既然p不会转发keepalive,那么如果p和 s 之间的链路出现问题,c 将不知道其实连接已经不可用了,然后就会数据发送失败
- p 是否会转发c 的keepalive 数据包?
总结:
- p 有必要和c、s keepalive