初步研究node中的网络通信模块

目前,我们处于互联网时代,互联网产品百花齐放。例如,当打开浏览器,可以看到各种信息,浏览器是如何跟服务器进行通信的?当打开微信跟朋友聊天时,你是如何跟朋友进行消息传递的?这些都得靠网络进程之间的通信,都得依赖于socket。那什么是socket?node中有哪些跟网络通信有关的模块?这些问题是本文研究的重点。

1. Socket

Socket源于Unix,而Unix的基本哲学是『一些皆文件』,都可以用『打开open ==> 读/写(read/write) ==> 关闭(close)』模式来操作,Socket也可以采用这种方法进行理解。关于Socket,可以总结如下几点:

  • 可以实现底层通信,几乎所有的应用层都是通过socket进行通信的,因此『一切且socket』
  • 对TCP/IP协议进行封装,便于应用层协议调用,属于二者之间的中间抽象层
  • 各个语言都与相关实现,例如C、C++、node
  • TCP/IP协议族中,传输层存在两种通用协议: TCP、UDP,两种协议不同,因为不同参数的socket实现过程也不一样

2. node中网络通信的架构实现

node中的模块,从两种语言实现角度来说,存在javscript、c++两部分,通过 process.binding 来建立关系。具体分析如下:

  • 标准的node模块有net、udp、dns、http、tls、https等
  • V8是chrome的内核,提供了javascript解释运行功能,里面包含tcp_wrap.h、udp_wrap.h、tls_wrap.h等
  • OpenSSL是基本的密码库,包括了MD5、SHA1、RSA等加密算法,构成了node标准模块中的 crypto
  • cares模块用于DNS的解析
  • libuv实现了跨平台的异步编程
  • http_parser用于http的解析

3. net使用

net模块 是基于TCP协议的socket网路编程模块,http模块就是建立在该模块的基础上实现的,先来看看基本使用方法:


  1. // 创建socket服务器 server.js  
  2. const net = require('net')  
  3. const server = net.createServer();  
  4. server.on('connection', (socket) => {  
  5. socket.pipe(process.stdout);  
  6. socket.write('data from server');  
  7. });  
  8. server.listen(3000, () => {  
  9. console.log(`server is on ${JSON.stringify(server.address())}`);  
  10. });  
  11. // 创建socket客户端 client.js  
  12. const net = require('net');  
  13. const client = net.connect({port: 3000});  
  14. client.on('connect', () => {  
  15. client.write('data from client');  
  16. });  
  17. client.on('data', (chunk) => {  
  18. console.log(chunk.toString());  
  19. client.end();  
  20. });  
  21. // 打开两个终端,分别执行`node server.js`、`node client.js`,可以看到客户端与服务器进行了数据通信。 

使用 const server = net.createServer(); 创建了server对象,那server对象有哪些特点:


  1. // net.js  
  2. exports.createServer = function(options, connectionListener) {  
  3. return new Server(options, connectionListener);  
  4. }; 
  5. function Server(options, connectionListener) {  
  6. EventEmitter.call(this);  
  7. ...  
  8. if (typeof connectionListener === 'function') {  
  9. this.on('connection', connectionListener);  
  10. }  
  11. ...  
  12. this._handle = null;  
  13. }  
  14. util.inherits(Server, EventEmitter); 

上述代码可以分为几个点:

  • createServer 就是一个语法糖,帮助new生成server对象
  • server对象继承了EventEmitter,具有事件的相关方法
  • _handle是server处理的句柄,属性值最终由c++部分的 TCP 、 Pipe 类创建
  • connectionListener也是语法糖,作为connection事件的回调函数

再来看看connectionListener事件的回调函数,里面包含一个 socket 对象,该对象是一个连接套接字,是个五元组(server_host、server_ip、protocol、client_host、client_ip),相关实现如下:


  1. function onconnection(err, clientHandle) {  
  2. ...  
  3. var socket = new Socket({
  4. ...  
  5. });  
  6. ...  
  7. self.emit('connection', socket);  

因为Socket是继承了 stream.Duplex ,所以Socket也是一个可读可写流,可以使用流的方法进行数据的处理。

接下来就是很关键的端口监听(port),这是server与client的主要区别,代码:


  1. Server.prototype.listen = function() {  
  2. ...  
  3. listen(self, ip, port, addressType, backlog, fd, exclusive);  
  4. ...  
  5. }  
  6. function listen(self, address, port, addressType, backlog, fd, exclusive) {  
  7. ...  
  8. if (!cluster) cluster = require('cluster');  
  9. if (cluster.isMaster || exclusive) {  
  10. self._listen2(address, port, addressType, backlog, fd);  
  11. return;  
  12. }  
  13. cluster._getServer(self, {  
  14. ...  
  15. }, cb);  
  16. function cb(err, handle) { 
  17. ...  
  18. self._handle = handle;  
  19. self._listen2(address, port, addressType, backlog, fd);  
  20. ...  
  21. }  
  22. }  
  23. Server.prototype._listen2 = function(address, port, addressType, backlog, fd) {  
  24. if (this._handle) {  
  25. ...  
  26. } else {  
  27. ...  
  28. rval = createServerHandle(address, port, addressType, fd);  
  29. ...  
  30. this._handle = rval;  
  31. }  
  32. this._handle.onconnection = onconnection;  
  33. var err = _listen(this._handle, backlog);  
  34. ...  
  35. }  
  36. function _listen(handle, backlog) {  
  37. return handle.listen(backlog || 511);  

上述代码有几个点需要注意:

  • 监听的对象可以是端口、路径、定义好的server句柄、文件描述符
  • 当通过cluster创建工作进程(worker)时,exclusive判断是否进行socket连接的共享
  • 事件监听最终还是通过TCP/Pipe的listen来实现
  • backlog规定了socket连接的限制,默认最多为511

接下来分析下listen中最重要的 _handle 了,_handle决定了server的功能:


  1. function createServerHandle(address, port, addressType, fd) {  
  2. ...  
  3. if (typeof fd === 'number' && fd >= 0) {  
  4. ...  
  5. handle = createHandle(fd);  
  6. ...  
  7. } else if(port === -1 && addressType === -1){  
  8. handle = new Pipe();  
  9. } else {  
  10. handle = new TCP();
  11. }  
  12. ...  
  13. return handle;  
  14. }  
  15. function createHandle(fd) {  
  16. var type = TTYWrap.guessHandleType(fd);  
  17. if (type === 'PIPE') return new Pipe();  
  18. if (type === 'TCP') return new TCP();  
  19. throw new TypeError('Unsupported fd type: ' + type);  

_handle 由C++中的Pipe、TCP实现,因而要想完全搞清楚node中的网络通信,必须深入到V8的源码里面。

4. UDP/dgram使用

跟net模块相比,基于UDP通信的dgram模块就简单了很多,因为不需要通过三次握手建立连接,所以整个通信的过程就简单了很多,对于数据准确性要求不太高的业务场景,可以使用该模块完成数据的通信。


  1. // server端实现  
  2. const dgram = require('dgram');  
  3. const server = dgram.createSocket('udp4');  
  4. server.on('message', (msg, addressInfo) => {  
  5. console.log(addressInfo);  
  6. console.log(msg.toString());  
  7. const data = Buffer.from('from server');  
  8. server.send(data, addressInfo.port);  
  9. });  
  10. server.bind(3000, () => {  
  11. console.log('server is on ', server.address());  
  12. });  
  13. // client端实现  
  14. const dgram = require('dgram');  
  15. const client = dgram.createSocket('udp4');  
  16. const data = Buffer.from('from client');  
  17. client.send(data, 3000);  
  18. client.on('message', (msg, addressInfo) => { 
  19. console.log(addressInfo);  
  20. console.log(msg.toString());  
  21. client.close(); 
  22. }); 

从源码层面分析上述代码的原理实现:


  1. exports.createSocket = function(type, listener) {  
  2. return new Socket(type, listener);  
  3. };  
  4. function Socket(type, listener) {  
  5. ...  
  6. var handle = newHandle(type);  
  7. this._handle = handle;  
  8. ...  
  9. this.on('message', listener);  
  10. ...  
  11. }  
  12. util.inherits(Socket, EventEmitter);  
  13. const UDP = process.binding('udp_wrap').UDP;  
  14. function newHandle(type) {  
  15. if (type == 'udp4') {  
  16. const handle = new UDP();  
  17. handle.lookup = lookup4;  
  18. return handle;  
  19. }  
  20. if (type == 'udp6') {  
  21. const handle = new UDP();  
  22. handle.lookup = lookup6;  
  23. handle.bind = handle.bind6;  
  24. handle.send = handle.send6;  
  25. return handle;  
  26. }  
  27. ...  
  28. }  
  29. Socket.prototype.bind = function(port_ /*, address, callback*/) {  
  30. ...  
  31. startListening(self);  
  32. ...  
  33. }  
  34. function startListening(socket) {  
  35. socket._handle.onmessage = onMessage;  
  36. socket._handle.recvStart();  
  37. ...  
  38. function onMessage(nread, handle, buf, rinfo) {  
  39. ... 
  40. self.emit('message', buf, rinfo);  
  41. ...  
  42. }  
  43. Socket.prototype.send = function(buffer, offset, length, port, address, callback) {  
  44. ...  
  45. self._handle.lookup(address, function afterDns(ex, ip) {  
  46. doSend(ex, self, ip, list, address, port, callback);  
  47. });  
  48. }  
  49. const SendWrap = process.binding('udp_wrap').SendWrap;  
  50. function doSend(ex, self, ip, list, address, port, callback) {  
  51. ...  
  52. var req = new SendWrap();  
  53. ...  
  54. var err = self._handle.send(req, list, list.length, port, ip, !!callback);  
  55. ...  

上述代码存在几个点需要注意:

  • UDP模块没有继承stream,仅仅继承了EventEmit,后续的所有操作都是基于事件的方式
  • UDP在创建的时候需要注意ipv4和ipv6
  • UDP的_handle是由UDP类创建的
  • 通信过程中可能需要进行DNS查询,解析出ip地址,然后再进行其他操作

5. DNS使用

DNS(Domain Name System)用于域名解析,也就是找到host对应的ip地址,在计算机网络中,这个工作是由网络层的ARP协议实现。在node中存在 net 模块来完成相应功能,其中dns里面的函数分为两类:

依赖底层操作系统实现域名解析,也就是我们日常开发中,域名的解析规则,可以回使用浏览器缓存、本地缓存、路由器缓存、dns服务器,该类仅有 dns.lookup

该类的dns解析,直接到nds服务器执行域名解析


  1. const dns = require('dns');  
  2. const host = 'bj.meituan.com';  
  3. dns.lookup(host, (err, address, family) => {  
  4. if (err) {  
  5. console.log(err);  
  6. return;  
  7. }  
  8. console.log('by net.lookup, address is: %s, family is: %s', address, family);  
  9. });  
  10. dns.resolve(host, (err, address) => {  
  11. if (err) {  
  12. console.log(err);  
  13. return;  
  14. }  
  15. console.log('by net.resolve, address is: %s', address);  
  16. })  
  17. // by net.resolve, address is: 103.37.152.41  
  18. // by net.lookup, address is: 103.37.152.41, family is: 4 

在这种情况下,二者解析的结果是一样的,但是假如我们修改本地的/etc/hosts文件呢


  1. // 在/etc/host文件中,增加:  
  2. 10.10.10.0 bj.meituan.com  
  3. // 然后再执行上述文件,结果是:  
  4. by net.resolve, address is: 103.37.152.41  
  5. by net.lookup, address is: 10.10.10.0, family is: 4 

接下来分析下dns的内部实现:


  1. const cares = process.binding('cares_wrap');  
  2. const GetAddrInfoReqWrap = cares.GetAddrInfoReqWrap;  
  3. exports.lookup = function lookup(hostname, options, callback) {  
  4. ...  
  5. callback = makeAsync(callback);  
  6. ...  
  7. var req = new GetAddrInfoReqWrap();  
  8. req.callback = callback;  
  9. var err = cares.getaddrinfo(req, hostname, family, hints);  
  10. ...  
  11. }  
  12. function resolver(bindingName) {  
  13. var binding = cares[bindingName];  
  14. return function query(name, callback) {  
  15. ...  
  16. callback = makeAsync(callback);  
  17. var req = new QueryReqWrap();  
  18. req.callback = callback;  
  19. var err = binding(req, name);  
  20. ...  
  21. return req;  
  22. }  
  23. }  
  24. var resolveMap = Object.create(null);  
  25. exports.resolve4 = resolveMap.A = resolver('queryA');  
  26. exports.resolve6 = resolveMap.AAAA = resolver('queryAaaa');  
  27. ...  
  28. exports.resolve = function(hostname, type_, callback_) {  
  29. ...  
  30. resolver = resolveMap[type_];  
  31. return resolver(hostname, callback);  
  32. ... 

上面的源码有几个点需要关注:

  • lookup与resolve存在差异,使用的时候需要注意
  • 不管是lookup还是resolve,均依赖于cares库
  • 域名解析的type很多: resolve4、resolve6、resolveCname、resolveMx、resolveNs、resolveTxt、resolveSrv、resolvePtr、resolveNaptr、resolveSoa、reverse

6. HTTP使用

在WEB开发中,HTTP作为最流行、最重要的应用层,是每个开发人员应该熟知的基础知识,我面试的时候必问的一块内容。同时,大多数同学接触node时,首先使用的恐怕就是http模块。先来一个简单的demo看看:


  1. const http = require('http');  
  2. const server = http.createServer();  
  3. server.on('request', (req, res) => {  
  4. res.setHeader('foo', 'test');  
  5. res.writeHead(200, {  
  6. 'Content-Type': 'text/html',  
  7. });  
  8. res.write('');  
  9. res.end(``);  
  10. });  
  11. server.listen(3000, () => {  
  12. console.log('server is on ', server.address());  
  13. var req = http.request({ host: '127.0.0.1', port: 3000});  
  14. req.on('response', (res) => {  
  15. res.on('data', (chunk) => console.log('data from server ', chunk.toString()) );  
  16. res.on('end', () => server.close() );  
  17. });  
  18. req.end();  
  19. });  
  20. // 输出结果如下:  
  21. // server is on { address: '::', family: 'IPv6', port: 3000 }  
  22. // data from server 头

针对上述demo,有很多值得深究的地方,一不注意服务就挂掉了,下面根据node的 官方文档 ,逐个进行研究。

6.1 http.Agent

因为HTTP协议是无状态协议,每个请求均需通过三次握手建立连接进行通信,众所周知三次握手、慢启动算法、四次挥手等过程很消耗时间,因此HTTP1.1协议引入了keep-alive来避免频繁的连接。那么对于tcp连接该如何管理呢?http.Agent就是做这个工作的。先看看源码中的关键部分:


  1. function Agent(options) {  
  2. ...  
  3. EventEmitter.call(this);  
  4. ...  
  5. self.maxSockets = self.options.maxSockets || Agent.defaultMaxSockets;  
  6. self.maxFreeSockets = self.options.maxFreeSockets || 256;  
  7. ...  
  8. self.requests = {}; // 请求队列  
  9. self.sockets = {}; // 正在使用的tcp连接池  
  10. self.freeSockets = {}; // 空闲的连接池  
  11. self.on('free', function(socket, options) {  
  12. ... 
  13. // requests、sockets、freeSockets的读写操作  
  14. self.requests[name].shift().onSocket(socket);  
  15. freeSockets.push(socket);  
  16. ...  
  17. }  
  18. }  
  19. Agent.defaultMaxSockets = Infinity;  
  20. util.inherits(Agent, EventEmitter);  
  21. // 关于socket的相关增删改查操作  
  22. Agent.prototype.addRequest = function(req, options) {  
  23. ...  
  24. if (freeLen) {  
  25. var socket = this.freeSockets[name].shift();  
  26. ...  
  27. this.sockets[name].push(socket);  
  28. ...  
  29. } else if (sockLen < this.maxSockets) {  
  30. ...  
  31. } else {  
  32. this.requests[name].push(req);  
  33. }  
  34. ...  
  35. }  
  36. Agent.prototype.createSocket = function(req, options, cb) { ... }  
  37. Agent.prototype.removeSocket = function(s, options) { ... }  
  38. exports.globalAgent = new Agent(); 

上述代码有几个点需要注意:

  • maxSockets默认情况下,没有tcp连接数量的上限(Infinity)
  • 连接池管理的核心是对 sockets 、 freeSockets 的增删查
  • globalAgent会作为http.ClientRequest的默认agent

下面可以测试下agent对请求本身的限制:


  1. // req.js  
  2. const http = require('http');  
  3. const server = http.createServer();  
  4. server.on('request', (req, res) => {  
  5. var i=1;  
  6. setTimeout(() => {  
  7. res.end('ok ', i++);  
  8. }, 1000)  
  9. });  
  10. server.listen(3000, () => {  
  11. var max = 20;  
  12. for(var i=0; i  
  13. var req = http.request({ host: '127.0.0.1', port: 3000});  
  14. req.on('response', (res) => {  
  15. res.on('data', (chunk) => console.log('data from server ', chunk.toString()) );  
  16. res.on('end', () => server.close() );
  17. });  
  18. req.end();  
  19. }  
  20. });  
  21. // 在终端中执行time node ./req.js,结果为:  
  22. // real 0m1.123s  
  23. // user 0m0.102s  
  24. // sys 0m0.024s  
  25. // 在req.js中添加下面代码  
  26. http.globalAgent.maxSockets = 5; 
  27. // 然后同样time node ./req.js,结果为:  
  28. real 0m4.141s  
  29. user 0m0.103s  
  30. sys 0m0.024s 

当设置maxSockets为某个值时,tcp的连接就会被限制在某个值,剩余的请求就会进入 requests 队列里面,等有空余的socket连接后,从request队列中出栈,发送请求。

6.2 http.ClientRequest

当执行http.request时,会生成ClientRequest对象,该对象虽然没有直接继承Stream.Writable,但是继承了http.OutgoingMessage,而http.OutgoingMessage实现了write、end方法,因为可以当跟stream.Writable一样的使用。


  1. var req = http.request({ host: '127.0.0.1', port: 3000, method: 'post'});  
  2. req.on('response', (res) => {  
  3. res.on('data', (chunk) => console.log('data from server ', chunk.toString()) );  
  4. res.on('end', () => server.close() );  
  5. });  
  6. // 直接使用pipe,在request请求中添加数据  
  7. fs.createReadStream('./data.json').pipe(req); 

接下来,看看http.ClientRequest的实现, ClientRequest继承了OutgoingMessage:


  1. const OutgoingMessage = require('_http_outgoing').OutgoingMessage;  
  2. function ClientRequest(options, cb) {  
  3. ...  
  4. OutgoingMessage.call(self);  
  5. ...  
  6. }  
  7. util.inherits(ClientRequest, OutgoingMessage); 

6.3 http.Server

http.createServer其实就是创建了一个http.Server对象,关键源码如下:


  1. exports.createServer = function(requestListener) {  
  2. return new Server(requestListener);  
  3. };  
  4. function Server(requestListener) {  
  5. ...  
  6. net.Server.call(this, { allowHalfOpen: true });  
  7. if (requestListener) {  
  8. this.addListener('request', requestListener);  
  9. }  
  10. ...  
  11. this.addListener('connection', connectionListener);  
  12. this.timeout = 2 * 60 * 1000; 
  13. ...  
  14. }  
  15. util.inherits(Server, net.Server);  
  16. function connectionListener(socket) {  
  17. ...  
  18. socket.on('end', socketOnEnd);  
  19. socket.on('data', socketOnData)  
  20. ...  

有几个需要要关注的点:

  • 服务的创建依赖于net.server,通过net.server在底层实现服务的创建
  • 默认情况下,服务的超时时间为2分钟
  • connectionListener处理tcp连接后的行为,跟net保持一致

6.4 http.ServerResponse

看node.org官方是如何介绍server端的response对象的:

This object is created internally by an HTTP server–not by the user. It is passed as the second parameter to the ‘request’ event.

The response implements, but does not inherit from, the Writable Stream interface.

跟http.ClientRequest很像,继承了OutgoingMessage,没有继承Stream.Writable,但是实现了Stream的功能,可以跟Stream.Writable一样灵活使用:


  1. function ServerResponse(req) {  
  2. ...  
  3. OutgoingMessage.call(this);  
  4. ...  
  5. }  
  6. util.inherits(ServerResponse, OutgoingMessage); 

6.5 http.IncomingMessage

An IncomingMessage object is created by http.Server or http.ClientRequest and passed as the first argument to the ‘request’ and ‘response’ event respectively. It may be used to access response status, headers and data.

http.IncomingMessage有两个地方时被内部创建,一个是作为server端的request,另外一个是作为client请求中的response,同时该类显示地继承了Stream.Readable。


  1. function IncomingMessage(socket) {  
  2. Stream.Readable.call(this);  
  3. this.socket = socket;  
  4. this.connection = socket;  
  5. ...  

util.inherits(IncomingMessage, Stream.Readable);

7. 结语

上面是对node中主要的网络通信模块,粗略进行了分析研究,对网络通信的细节有大概的了解。但是这还远远不够的,仍然无法解决node应用中出现的各种网络问题,这边文章只是一个开端,希望后面可以深入了解各个细节、深入到c++层面。

作者:佚名

来源:51CTO

时间: 2024-10-06 08:20:06

初步研究node中的网络通信模块的相关文章

iOS多线程的初步研究(四、五、六)--NSTimer--NSURLConnection子线程中运行 ---- NSOperation

iOS多线程的初步研究(四)-- NSTimer 理解run loop后,才能彻底理解NSTimer的实现原理,也就是说NSTimer实际上依赖run loop实现的. 先看看NSTimer的两个常用方法: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; //生成

工信部部长李毅中: 正在研究实施手机及网络实名制

2月22日上午消息,工信部党组书记.部长李毅中昨日在作经济形势报告报告时指出,我国信息产业迅猛发展的同时,网络信息安全当 前面临严峻挑战,保障安全是第一责任.与此同时,相关部门正研究实施手机.网络实名制.昨日,工业和信息化部昨日在京召开干部大会.会上,部党组书记.部长李毅中传达了中央领导在"省部级主要领导干部深入贯彻落实科学发展观.加快经济发展方式转变专题研讨班"上的讲话精神,并就贯彻落实中央领导的重要讲话精神,结合工业和信息化部实际作了主题为<当前经济形势的几个热点问题>

iOS多线程的初步研究(七、八、九)-- dispatch对象-- dispatch队列-- dispatch源-- dispatch同步

七.iOS多线程的初步研究()-- dispatch对象 谈起iOS的dispatch(正式称谓是Grand Central Dispatch或GCD),不得不说这又是iOS(包括MacOSX)平台的创新,优缺点这里不讨论,只有当你使用时才能真正体会到.我们说dispatch函数的主要目的是实现多任务并发代码,那么要理解dispatch函数,先来了解dispatch对象的定义.   dispatch对象类型的部分定义,主要使用C语言的宏定义: <os/object.h>文件: #define

iOS多线程的初步研究(一、二、三)-- NSThread -- 锁-- NSRunLoop

一)iOS多线程的初步研究(一)-- NSThread 对于多线程的开发,iOS系统提供了多种不同的接口,先谈谈iOS多线程最基础方面的使用.产生线程的方式姑且分两类,一类是显式调用,另一类是隐式调用. 一.显示调用的类为NSThread.一般构造NSThread的线程对象可通过两种方式: 1. 初始化线程主方法: [NSThread detachNewThreadSelector:@selector(run:) toTarget:target withObject:obj];//类方法 或 N

关于Android平台中OpenGL ES应用的初步研究

关于Android平台中OpenGL ES应用的初步研究 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 一.使用android sdk封装的OpenGL ES库:     据说这种效率不高,有

《Python核心编程(第3版)》——2.4 Python中的网络编程

2.4 Python中的网络编程 既然你知道了所有关于客户端/服务器架构.套接字和网络方面的基础知识,接下来就让我们试着将这些概念应用到Python中.本节中将使用的主要模块就是socket模块,在这个模块中可以找到socket()函数,该函数用于创建套接字对象.套接字也有自己的方法集,这些方法可以实现基于套接字的网络通信. 2.4.1 socket()模块函数 要创建套接字,必须使用socket.socket()函数,它一般的语法如下. socket(socket_family, socket

云管理平台中虚拟网络设计与实现

云管理平台中虚拟网络设计与实现 大连理工大学   王鑫涛 伴随着网络技术的日益成熟和电子商务的飞速发展,在3G移动互联网和信息化硬性的需求带动下,IaaS云管理平台是将云计算概念运用于运用于互联网数据中心(IDC)的一种新型的云管理平台.IaaS云管理平台中虚拟网络管理系统的采用J2EE体系结构MVC设计模式.数据库服务器采用Oracle DataBase数据库产品,它的高可靠性.高可伸缩性特点将为系统的稳定运行提供坚实的基础.应用服务器选用IBM公司的WebSphere Application

中国正在研究实行手机和网络实名制

中新社北京2月22日电(记者 刘育英)工业和信息化部官方网站22日透露,中国相关部门正在研究实施手机.网络实名制. 工信部部长李毅中在主题为<当前经济形势的几个热点问题>的经济形势报告上指出,网络信息安全面临严峻挑战,保障安全是第一责任,他还说,"网络安全要标本兼治,重在治本". 中国手机用户接近6.6亿,据估算未进行实名登记的约为2亿.中国网民数超过3.8亿.有关专家曾表示,由于实名制涉及个人隐私及通信自由等问题,涉及实名制的措施将通过法律层面推进. 有媒体报道,中国正在

云计算中的网络新技术

自2006年Google公司提出云计算的概念以来,作为一种新的技术和商业模式,其概念众说纷纭.相关领域的各方机构和专家分别从不同的角度对云计算进行了定义,比如有的从应用场景划分,有的从资源角度划分等. 其中,2009年9月美国国家标准技术研究院(NIST)提出的云计算定义,很具有代表性,目前已经被业界广泛接受:"云计算是一种可以通过网络方便的接入共享资源池,按需获取计算资源(这些资源包括网络.服务器.存储.应用.服务等等)的服务模型.共享资源池中的资源应该可以通过较少的管理代价和简单业务交互过程