关于心跳包的问题,UDP协议

时间:2021-07-08 19:31:12
如果内存的A,创建了一个socket,用它向服务器S发送数据,则在路由器上创建了一个senion,映射成一个公网IP和一个端口号,

以为为了维持这个对话,要每隔壁一段时间,向服务器发一个数据包(心跳包)。

我的问题是:如果A既要和服务器S通信,又要和另一台电脑B通讯,那么是不是既要向服务器发送心跳包,同时也要向B发送心跳包?

就是说:内网的主机A,如果要向不同的电脑通信,为了维持对话,是不是它向几个因特网上的电脑通信,就要向这几个电脑都发送心跳包?不是说:只向一个电脑(比如向服务器发)发心跳包就够了?

12 个解决方案

#1


我不知道我说清楚我的意思没有。

就是说:一个主机,处在内网中,如果它要和服务器S以及其他几个客户諯通讯,是不是说:得向服务器和这几个客户端都发送心跳包?只向服务器发送心跳包是不够的?

#2


udp发什么心跳包?

#3


引用 2 楼 xuddk727 的回复:
udp发什么心跳包?

难道UDP不要发心跳包?

我做的是一个类似QQ的即时通讯软件,特点是A和B通过服务器互相交换IP地址和端口,然后它们直接通讯,不经过服务器,既提高了效率,又增加了保密性。

我用的是UDP协议。

现在的问题是:通讯的两个人,很可能都是(或者一个是)处于内网中的。需要穿透。如果在服务器S的牵头下,A和B互相对发信息,即可以打通通讯。但同时,A和B又得和服务器保持联系。而且A和B有可能与多人聊天。

我的问题是:如果A既要与服务器S通讯,又要与多达几个或十几个用户聊天(通讯),那么,他如果处在内网中,当然得穿透,穿透了以后,是不是要向服务器和那十几个用户分别发送心跳包?否则过一段时间不发信息,路由器的seesion(对话)是不是会关闭?如果只向服务器发送心跳包,是不是可以保证向那十几个用户的通讯session不会关闭,因此就不需要向那十几个用户发送心跳包了?

我的意思是:如果A处在内网中,用UDP协议,既向服务器发信息,又向其他十几个用户发信息(直接点对点,不经过服务器)。 是只需要向服务器发送心跳包维持session就够了呢?还是必须向所有通讯端,包括那十几个用户都发送心跳包?

#4


引用 3 楼 screen12 的回复:
Quote: 引用 2 楼 xuddk727 的回复:

udp发什么心跳包?

难道UDP不要发心跳包?

我做的是一个类似QQ的即时通讯软件,特点是A和B通过服务器互相交换IP地址和端口,然后它们直接通讯,不经过服务器,既提高了效率,又增加了保密性。

我用的是UDP协议。

现在的问题是:通讯的两个人,很可能都是(或者一个是)处于内网中的。需要穿透。如果在服务器S的牵头下,A和B互相对发信息,即可以打通通讯。但同时,A和B又得和服务器保持联系。而且A和B有可能与多人聊天。

我的问题是:如果A既要与服务器S通讯,又要与多达几个或十几个用户聊天(通讯),那么,他如果处在内网中,当然得穿透,穿透了以后,是不是要向服务器和那十几个用户分别发送心跳包?否则过一段时间不发信息,路由器的seesion(对话)是不是会关闭?如果只向服务器发送心跳包,是不是可以保证向那十几个用户的通讯session不会关闭,因此就不需要向那十几个用户发送心跳包了?

我的意思是:如果A处在内网中,用UDP协议,既向服务器发信息,又向其他十几个用户发信息(直接点对点,不经过服务器)。 是只需要向服务器发送心跳包维持session就够了呢?还是必须向所有通讯端,包括那十几个用户都发送心跳包?


你的这种方式属于NAT穿透,实现P2P通信,不是传统意义上的UDP了,穿透需要发送心跳包,来维持这个有效的连接,不然长时间不通信,路由器会不允许

#5


发心跳包的目的:
1.TCP发心跳包是为了维持连接的状态,防止对方断开了,自己不知道。
2.UDP发心跳包的目的,就是为了保持私网和外网的一个通道,防止一段时间后,外网主动发信息给私网被路由器挡掉。针对私网来说,如果不关注外网给自己发消息,就没必要心跳包

#6


引用 4 楼 jzycode 的回复:
Quote: 引用 3 楼 screen12 的回复:

Quote: 引用 2 楼 xuddk727 的回复:

udp发什么心跳包?

难道UDP不要发心跳包?

我做的是一个类似QQ的即时通讯软件,特点是A和B通过服务器互相交换IP地址和端口,然后它们直接通讯,不经过服务器,既提高了效率,又增加了保密性。

我用的是UDP协议。

现在的问题是:通讯的两个人,很可能都是(或者一个是)处于内网中的。需要穿透。如果在服务器S的牵头下,A和B互相对发信息,即可以打通通讯。但同时,A和B又得和服务器保持联系。而且A和B有可能与多人聊天。

我的问题是:如果A既要与服务器S通讯,又要与多达几个或十几个用户聊天(通讯),那么,他如果处在内网中,当然得穿透,穿透了以后,是不是要向服务器和那十几个用户分别发送心跳包?否则过一段时间不发信息,路由器的seesion(对话)是不是会关闭?如果只向服务器发送心跳包,是不是可以保证向那十几个用户的通讯session不会关闭,因此就不需要向那十几个用户发送心跳包了?

我的意思是:如果A处在内网中,用UDP协议,既向服务器发信息,又向其他十几个用户发信息(直接点对点,不经过服务器)。 是只需要向服务器发送心跳包维持session就够了呢?还是必须向所有通讯端,包括那十几个用户都发送心跳包?


你的这种方式属于NAT穿透,实现P2P通信,不是传统意义上的UDP了,穿透需要发送心跳包,来维持这个有效的连接,不然长时间不通信,路由器会不允许


是的,我就是在实现NAT穿透来实现P2P通信。
在这种情况下,如果A与服务器以及几个用户进行通信 。是只需要向服务器发送心跳包维持连接就够了?还是必须向服务器和所有用户都发送心跳包来维持各自的连接?

#7


引用 5 楼 xihu1364 的回复:
发心跳包的目的:
1.TCP发心跳包是为了维持连接的状态,防止对方断开了,自己不知道。
2.UDP发心跳包的目的,就是为了保持私网和外网的一个通道,防止一段时间后,外网主动发信息给私网被路由器挡掉。针对私网来说,如果不关注外网给自己发消息,就没必要心跳包


我就是为了第二个目的。

请问:如果一个客户端A,和服务器S以及另两个客户端B,C通信。它是只需要向服务器S发送心跳包就够了?还是必须向S,B,C都发送心跳包?

#8


必须向S,B,C都发送心跳包。我觉得。

#9


IM消息通过服务器转发,就只要向S发心跳了。

#10


这个是由你和对方的网关决定的,通常情况下,需要服务器端和客户端都进行发送,以保持在路由的nat
此外还有isp接入局端的nat处理
由于现在ipv4公网地址越来越少
所以例如移动 铁桶之类的都采用了伪公网地址[保留地址]进行分配
然后你所谓的nat穿透实际是3+次nat转换
在这种情况下,你不仅仅需要向服务器端发送noop包来维持,还需要对每一个连接的p2p节点发送noop包来维持
但实际上,在双方都是内网通过路由上网,而且分配到的是伪公网的情况下
nat穿透的概率基本是0
 只有在至少一方能够获得公网地址的情况下,你这种nat穿透才有意义,另外通常,如果其中一方采用了例如cisco等企业级路由的情况下,穿透的概率也依然会接近0,或者在穿透成功后5分钟内连接中断

#11


引用 9 楼 bluesen 的回复:
IM消息通过服务器转发,就只要向S发心跳了。

不是,我的通信软件是A与B直接通讯,通过服务器S,只是交换一下对方的IP地址和端口,然后通讯的时候,就是直接通讯了。不通过服务器转发的。

#12


你这个属于P2P,比较复杂,可以找一本这方面的书看一下

#1


我不知道我说清楚我的意思没有。

就是说:一个主机,处在内网中,如果它要和服务器S以及其他几个客户諯通讯,是不是说:得向服务器和这几个客户端都发送心跳包?只向服务器发送心跳包是不够的?

#2


udp发什么心跳包?

#3


引用 2 楼 xuddk727 的回复:
udp发什么心跳包?

难道UDP不要发心跳包?

我做的是一个类似QQ的即时通讯软件,特点是A和B通过服务器互相交换IP地址和端口,然后它们直接通讯,不经过服务器,既提高了效率,又增加了保密性。

我用的是UDP协议。

现在的问题是:通讯的两个人,很可能都是(或者一个是)处于内网中的。需要穿透。如果在服务器S的牵头下,A和B互相对发信息,即可以打通通讯。但同时,A和B又得和服务器保持联系。而且A和B有可能与多人聊天。

我的问题是:如果A既要与服务器S通讯,又要与多达几个或十几个用户聊天(通讯),那么,他如果处在内网中,当然得穿透,穿透了以后,是不是要向服务器和那十几个用户分别发送心跳包?否则过一段时间不发信息,路由器的seesion(对话)是不是会关闭?如果只向服务器发送心跳包,是不是可以保证向那十几个用户的通讯session不会关闭,因此就不需要向那十几个用户发送心跳包了?

我的意思是:如果A处在内网中,用UDP协议,既向服务器发信息,又向其他十几个用户发信息(直接点对点,不经过服务器)。 是只需要向服务器发送心跳包维持session就够了呢?还是必须向所有通讯端,包括那十几个用户都发送心跳包?

#4


引用 3 楼 screen12 的回复:
Quote: 引用 2 楼 xuddk727 的回复:

udp发什么心跳包?

难道UDP不要发心跳包?

我做的是一个类似QQ的即时通讯软件,特点是A和B通过服务器互相交换IP地址和端口,然后它们直接通讯,不经过服务器,既提高了效率,又增加了保密性。

我用的是UDP协议。

现在的问题是:通讯的两个人,很可能都是(或者一个是)处于内网中的。需要穿透。如果在服务器S的牵头下,A和B互相对发信息,即可以打通通讯。但同时,A和B又得和服务器保持联系。而且A和B有可能与多人聊天。

我的问题是:如果A既要与服务器S通讯,又要与多达几个或十几个用户聊天(通讯),那么,他如果处在内网中,当然得穿透,穿透了以后,是不是要向服务器和那十几个用户分别发送心跳包?否则过一段时间不发信息,路由器的seesion(对话)是不是会关闭?如果只向服务器发送心跳包,是不是可以保证向那十几个用户的通讯session不会关闭,因此就不需要向那十几个用户发送心跳包了?

我的意思是:如果A处在内网中,用UDP协议,既向服务器发信息,又向其他十几个用户发信息(直接点对点,不经过服务器)。 是只需要向服务器发送心跳包维持session就够了呢?还是必须向所有通讯端,包括那十几个用户都发送心跳包?


你的这种方式属于NAT穿透,实现P2P通信,不是传统意义上的UDP了,穿透需要发送心跳包,来维持这个有效的连接,不然长时间不通信,路由器会不允许

#5


发心跳包的目的:
1.TCP发心跳包是为了维持连接的状态,防止对方断开了,自己不知道。
2.UDP发心跳包的目的,就是为了保持私网和外网的一个通道,防止一段时间后,外网主动发信息给私网被路由器挡掉。针对私网来说,如果不关注外网给自己发消息,就没必要心跳包

#6


引用 4 楼 jzycode 的回复:
Quote: 引用 3 楼 screen12 的回复:

Quote: 引用 2 楼 xuddk727 的回复:

udp发什么心跳包?

难道UDP不要发心跳包?

我做的是一个类似QQ的即时通讯软件,特点是A和B通过服务器互相交换IP地址和端口,然后它们直接通讯,不经过服务器,既提高了效率,又增加了保密性。

我用的是UDP协议。

现在的问题是:通讯的两个人,很可能都是(或者一个是)处于内网中的。需要穿透。如果在服务器S的牵头下,A和B互相对发信息,即可以打通通讯。但同时,A和B又得和服务器保持联系。而且A和B有可能与多人聊天。

我的问题是:如果A既要与服务器S通讯,又要与多达几个或十几个用户聊天(通讯),那么,他如果处在内网中,当然得穿透,穿透了以后,是不是要向服务器和那十几个用户分别发送心跳包?否则过一段时间不发信息,路由器的seesion(对话)是不是会关闭?如果只向服务器发送心跳包,是不是可以保证向那十几个用户的通讯session不会关闭,因此就不需要向那十几个用户发送心跳包了?

我的意思是:如果A处在内网中,用UDP协议,既向服务器发信息,又向其他十几个用户发信息(直接点对点,不经过服务器)。 是只需要向服务器发送心跳包维持session就够了呢?还是必须向所有通讯端,包括那十几个用户都发送心跳包?


你的这种方式属于NAT穿透,实现P2P通信,不是传统意义上的UDP了,穿透需要发送心跳包,来维持这个有效的连接,不然长时间不通信,路由器会不允许


是的,我就是在实现NAT穿透来实现P2P通信。
在这种情况下,如果A与服务器以及几个用户进行通信 。是只需要向服务器发送心跳包维持连接就够了?还是必须向服务器和所有用户都发送心跳包来维持各自的连接?

#7


引用 5 楼 xihu1364 的回复:
发心跳包的目的:
1.TCP发心跳包是为了维持连接的状态,防止对方断开了,自己不知道。
2.UDP发心跳包的目的,就是为了保持私网和外网的一个通道,防止一段时间后,外网主动发信息给私网被路由器挡掉。针对私网来说,如果不关注外网给自己发消息,就没必要心跳包


我就是为了第二个目的。

请问:如果一个客户端A,和服务器S以及另两个客户端B,C通信。它是只需要向服务器S发送心跳包就够了?还是必须向S,B,C都发送心跳包?

#8


必须向S,B,C都发送心跳包。我觉得。

#9


IM消息通过服务器转发,就只要向S发心跳了。

#10


这个是由你和对方的网关决定的,通常情况下,需要服务器端和客户端都进行发送,以保持在路由的nat
此外还有isp接入局端的nat处理
由于现在ipv4公网地址越来越少
所以例如移动 铁桶之类的都采用了伪公网地址[保留地址]进行分配
然后你所谓的nat穿透实际是3+次nat转换
在这种情况下,你不仅仅需要向服务器端发送noop包来维持,还需要对每一个连接的p2p节点发送noop包来维持
但实际上,在双方都是内网通过路由上网,而且分配到的是伪公网的情况下
nat穿透的概率基本是0
 只有在至少一方能够获得公网地址的情况下,你这种nat穿透才有意义,另外通常,如果其中一方采用了例如cisco等企业级路由的情况下,穿透的概率也依然会接近0,或者在穿透成功后5分钟内连接中断

#11


引用 9 楼 bluesen 的回复:
IM消息通过服务器转发,就只要向S发心跳了。

不是,我的通信软件是A与B直接通讯,通过服务器S,只是交换一下对方的IP地址和端口,然后通讯的时候,就是直接通讯了。不通过服务器转发的。

#12


你这个属于P2P,比较复杂,可以找一本这方面的书看一下