以下是我正在尝试做的事情:我正在开发一个Node.js http服务器,该服务器将在一台计算机上保存数千个移动客户端的推送目的(与redis协作)的长连接.
测试环境:
1.80GHz*2 CPU/2GB RAM/Unbuntu12.04/Node.js 0.8.16
Run Code Online (Sandbox Code Playgroud)
第一次,我使用"express"模块,在使用交换之前我可以使用它来达到大约120k并发连接,这意味着RAM不够.然后,我切换到本机"http"模块,我得到了大约160k的并发.但我意识到在本机http模块中仍然有太多功能我不需要,所以我把它切换到本机"net"模块(这意味着我需要自己处理http协议,但没关系).现在,每台机器可以达到大约250k并发连接.
这是我的代码的主要结构:
var net = require('net');
var redis = require('redis');
var pendingClients = {};
var redisClient = redis.createClient(26379, 'localhost');
redisClient.on('message', function (channel, message) {
var client = pendingClients[channel];
if (client) {
client.res.write(message);
}
});
var server = net.createServer(function (socket) {
var buffer = '';
socket.setEncoding('utf-8');
socket.on('data', onData);
function onData(chunk) {
buffer += chunk;
// Parse request data.
// ...
if ('I have got all I need') {
socket.removeListener('data', onData);
var req = { …Run Code Online (Sandbox Code Playgroud) 我想知道TCP中bind()的确切功能.将本地地址"绑定"到套接字是什么意思?如果它正在为套接字分配端口号,那么为什么我们不在客户端中使用它?我知道端口是由操作系统在客户端自动分配的,但我并没有全面了解所有这些是如何工作的.
在bind()之后,我们监听().绑定是如何与listen()相关的?listen()是否知道bind()已被执行?如果是这样,bind()会做出哪些更改以便知道它?我的意思是,为成功执行返回零如何帮助?
我已经经历了很多定义,但没有在哪里可以详细了解所有这些.所以,如果有人能够向我解释这一点,我将不胜感激.
我正在为客户端库编写单元测试.我想测试连接无效端口和无效的IP.什么是一个好的IP地址使用,不会在某个地方路由?我不想对运行单元测试的机器所在的网络做出任何假设.LOCALHOST似乎是一个糟糕的选择,因为这是运行服务器组件的有效机器,我想分别测试无效端口.是否在IPv4规范中的某处保留了INVALID-IP?
随着Nginx社区版本的TCP负载平衡的发布,我想混合使用OpenVPN和SSL传递数据.Nginx知道如何路由流量的唯一方法是通过他们的域名.
vpn1.app.com ???? nginx at 10.0.0.1 ???? vpn1 at 10.0.0.3
vpn2.app.com ?? ??? vpn2 at 10.0.0.4
https.app.com ?? ??? https at 10.0.0.5
Run Code Online (Sandbox Code Playgroud)
我已经看过TCP指南和模块文档,但它似乎没有被很好地引用.如果有人能指出我正确的方向,我将不胜感激.
关于ServerFault的相关问题:反向代理可以使用带SSL的SNI通过吗?
我知道这不是一个直接的"开发"问题,但我需要这些信息来测试一个开发项目,所以我认为有人可能遇到类似的问题.
我将测试一个运行TCP服务器的软件,并根据发送的命令回复一些答案.我将测试该软件,如果它不能正常工作,则不想编写代码.所以我想发送这些命令并测试驱动器服务器软件.
如何使用Linux机箱实现这一目标?
如果TCP有效负载在传输过程中损坏,则重新计算的校验和将与传输的校验和不匹配.很棒,到目前为止都很好.
如果TCP校验和在传输过程中损坏,则重新计算的校验和将与现在已损坏的校验和不匹配.很棒,到目前为止都很好.
当有效负载和校验和都被破坏并且重新计算的校验和虽然与它应该是不同的时候会发生什么,恰好匹配现在已损坏的校验和?
我可以看到一个良好的校验和算法(以及较低级别的额外校验和),这可能非常非常不可能,但TCP不是100%可靠吗?它如何解决这些误报?
我是一名经验丰富的C#开发人员,但到目前为止我还没有开发过TCP服务器应用程序.现在我必须开发一个高度可扩展的高性能服务器,它可以处理至少5-10万个并发连接:通过GPRS从GPS设备获取字节数据.
常见的通信过程应如下所示:
所以,在我的服务器中我需要
我开始通过互联网阅读这个主题,但对我来说这似乎是一场噩梦.有很多方法,但我找不出哪个是最好的.
异步套接字方法对我来说似乎是最好的,但是以这种异步方式编写代码非常糟糕且不易调试.
所以我的问题是:您认为在C#中实现高性能TCP服务器的最佳方式是哪种?你知道任何好的开源组件吗?(我尝试了几个,但我找不到一个好的.)
我有一个安全扫描发现指示我禁用TCP时间戳.我理解推荐的原因:时间戳可用于计算服务器正常运行时间,这对攻击者有帮助(http://www.silby.com/eurobsdcon05/eurobsdcon_silbersack.pdf标题下的"TCP时间戳"下的详细说明)).
但是,我的理解是TCP时间戳旨在增强TCP性能.当然,在成本/效益分析中,性能下降是一个很大的,可能是太大的成本.我很难理解可能会有多少(如果有的话)性能成本.hivemind中的任何节点都在关心吗?
如何实现HTTP Keep Alive?它内部是否使用TCP Keep Alive?如果没有,服务器如何检测客户端是死还是活?
什么是用于监视Web服务,SOAP,WCF等流量的最佳工具?我见过一些用Java制作的工具,但它们看起来有点糟糕.我想要的是一个位于中间作为代理的工具,并进行端口重定向(应具有可配置的侦听/重定向端口).是否有任何工具在Windows上可以执行此操作?
tcp ×10
networking ×3
http ×2
linux ×2
sockets ×2
bind ×1
c# ×1
checksum ×1
ip ×1
javascript ×1
monitoring ×1
nginx ×1
node.js ×1
scalable ×1
security ×1
stream ×1
unit-testing ×1
virtualhost ×1
web-services ×1