【问题标题】:Node HTTP resolution节点 HTTP 解析
【发布时间】:2016-07-01 18:42:54
【问题描述】:

所以你可以像这样发出一个节点 HTTP GET 请求:

var http = require('http');
var options = {
  host: 'stackoverflow.com',
};

var req = http.get(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
});

req.on('error', function(e) {
  console.log('ERROR: ' + e.message);
});

我想看看http.get要去哪个IP地址?如果给定的 DNS 解析为多个 IP,节点 HTTP 库如何确定使用哪个 IP 地址?

我所说的多个 IP 是指:

dig +short stackoverflow.com
151.101.129.69
151.101.1.69
151.101.193.69
151.101.65.6

node request 库有什么不同吗?

【问题讨论】:

  • “DNS 解析为多个 IP”是什么意思?

标签: javascript node.js http dns request


【解决方案1】:

您的req 对象上应该有一个connection 对象,其中将包含您连接到的服务器的远程地址。

req.connection.remoteAddress

当然,您需要等到您真正建立了连接,所以我会使用 connect 事件来满足您的需求。未经测试,但试试这个:

req.on('connect', (res, socket, head) => {
  console.log(socket.remoteAddress);
});

https://nodejs.org/api/net.html#net_socket_remoteaddress

【讨论】:

  • 感谢您的帮助。
【解决方案2】:

据我所知,在节点 6.x.x 中它也下降了:

  1. http 模块使用
  2. net 模块使用
  3. dns 模块使用
  4. 原生模块libuv#getaddrinfo (http://docs.libuv.org/en/v1.x/dns.html#c.uv_getaddrinfo)

特别是您对使用哪个 IP 的问题: https://github.com/nodejs/node/blob/cd439465cc8b408eb88822c7695def611acfaaf7/lib/dns.js#L82

非常简单的算法,例如:“如果存在多个 IP 地址,则取第一个”:)

【讨论】:

  • 这并不能解决问题。多次 DNS 查找可能会导致不同的响应。
  • 谢谢!消息来源解释了很多。这是一个糟糕的算法:(
猜你喜欢
  • 1970-01-01
  • 2013-03-28
  • 2014-07-02
  • 1970-01-01
  • 2012-10-17
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多