【问题标题】:Pros and cons to one port per client?每个客户端一个端口的优缺点?
【发布时间】:2012-01-22 19:33:34
【问题描述】:
参考 UDP。有些人会建议每个客户端有一个端口(因此绑定套接字),如例如所示。 Quake III 更适合缓冲传入的流。我不完全确定我会买这个。
这难道不是由自己的代码来确保这些缓冲区的内容不断被消耗吗?在我的服务器上,我计划每秒执行大约 20-30 次,如果我的客户端以相同的速率推出数据包,我看不出缓冲会有多大问题。 FWIW,我的数据包长度将达到 1024 字节。我会有 4 个或最多 8 个客户。我从许多来源(例如this answer)了解到,Windows 上的默认缓冲区大小为 8k。因此,在我看来,对于 4 个客户端,这通常应该没问题......虽然我想我可能需要稍微增加缓冲区大小,并且不确定是否有任何陷阱,尽管我知道这已经完成通过setsockopt()。
【问题讨论】:
标签:
sockets
networking
udp
ports
【解决方案1】:
无论端口如何,在操作系统和语言中进行缓冲的代码都是相同的,因此无论是进入多个套接字中的多个缓冲区还是一个套接字中的一个缓冲区都没有区别。在一个端口上的一个套接字上设置一个更大(N 倍)的缓冲区相当于在 N 个端口上设置 N 个缓冲区。
我还要说,如果您谈论的是每秒 8 * 30 个数据包(240 个数据包/秒),那么除非您在 1980 年代的计算器上运行此程序,否则您无需担心缓冲性能。
如果发送速率高于读取速率,那么无论缓冲区有多大,缓冲区都会填满并丢弃数据包。缓冲区的大小只会指定延迟。
如果您有 N 个客户端,并且它们都以 20/秒的速率发送数据包,那么您的服务器需要以至少 N*20/秒的速率读取数据包,但实际上它应该比实际读取速度更快因为机器上的时间(时钟)会有变化,特别是在负载下,所以服务器应该尝试比你计算的最小值更频繁地读取以确保它补偿它,或者它应该耗尽缓冲区 N每秒次数(无论您喜欢多频繁,只要您指定一个大小正确的缓冲区来应对)。
另外,因为您可能偶尔会收到一个延迟的数据包,该数据包可能会与沿路径的某个路由器的一两个其他数据包一起分批,我会说将缓冲区大小设置为略大于 8k(2x 或 3x),这样您就不会从一个客户端获取 3 个已批处理的数据包(其中 2 个是旧的,您将在读取时丢弃或覆盖)覆盖来自其他一些客户端的新数据包。