golang 发起 http 请求,获取访问域名的 ip 地址(net, httptrace)

这篇具有很好参考价值的文章主要介绍了golang 发起 http 请求,获取访问域名的 ip 地址(net, httptrace)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

今天碰到了个需求,我要知道程序对外访问的 http 请求域名的 ip 地址。

直接查看 golangnet/http 包,发现 Response 中并没有我想要的 ip 信息。

考虑到在 OSI 七层模型中,ip 是网络层协议,而 http 是应用层协议。去翻了下 net 包,发现了基础用法。

先提一下,域名访问服务器是会通过 dns 服务器去获取服务器的 ip(这块知识不了解的可以先去了解下),我们日常访问域名的过程:域名 -> dns 服务器 -> 需要访问的服务器的 ipdns 服务器有可能回返回多个 ip,一般程序都会使用第一个进行数据交互。

go 中的使用

1. net 包

源码 net/lookup.go 中有相关的获取方式,测试代码如下:

package main

import (
	"fmt"
	"log"
	"net"
)

func main() {
	useNetParse()
}

func useNetParse() {
	host := "www.baidu.com"
	ips, err := net.LookupIP(host)
	if err != nil {
		log.Fatal(err)
	}
	for _, v := range ips {
		fmt.Println("DNS 解析:", v.String())
	}

	ip, err := net.ResolveIPAddr("ip", host)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("服务器 IP 地址:", ip.String())
}

输出

DNS 解析: 180.101.50.188      
DNS 解析: 180.101.50.242      
服务器 IP 地址: 180.101.50.188

2. httptrace

简单介绍下 httptrace,它是 go 1.17 后添加的新方法,用于在客户端请求的整个生命周期中收集细粒度信息的工具。

它提供了许多的钩子,如:

  • 连接创建
  • 连接复用
  • DNS 查询
  • 将请求写入网路
  • 读取响应

获取 DNS 查询使用的是 DNSDone 这个钩子,但是 DNS 解析后可能会解析出多个 IP 地址,而我需要的是访问服务器的 IP 地址,可以使用 GotConn 这个钩子,在连接成功创建后查看其访问的服务器的 IP 地址。

测试代码如下:

package main

import (
	"fmt"
	"log"
	"net/http"
	"net/http/httptrace"
)

func main() {
	req, _ := http.NewRequest("GET", "https://www.baidu.com", nil)
	trace := &httptrace.ClientTrace{
		DNSDone: func(dnsInfo httptrace.DNSDoneInfo) {
			fmt.Printf("DNS Info: %+v\n", dnsInfo)
		},
		GotConn: func(connInfo httptrace.GotConnInfo) {
			fmt.Printf("Got Conn: %+v\n", connInfo.Conn.RemoteAddr().String())
		},
	}
	req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
	_, err := http.DefaultTransport.RoundTrip(req)
	if err != nil {
		log.Fatal(err)
	}
}

输出:

DNS Info: {Addrs:[{IP:180.101.50.188 Zone:} {IP:180.101.50.242 Zone:}] Err:<nil> Coalesced:false}
Got Conn: 180.101.50.188:443

可以看到这里访问的实际服务器的 IP 地址是 DNS 解析出的第一个 IP 地址。

其他查看服务器 ip 的方法

1. 浏览器 F12 调试

可以通过浏览器调试进行查看
golang获取域名,go,golang,http,tcp/ip

2. ping

ping www.baidu.com

输出

正在 Ping www.a.shifen.com [180.101.50.188] 具有 32 字节的数据:
来自 180.101.50.188 的回复: 字节=32 时间=21ms TTL=50
来自 180.101.50.188 的回复: 字节=32 时间=8ms TTL=50
来自 180.101.50.188 的回复: 字节=32 时间=8ms TTL=50
来自 180.101.50.188 的回复: 字节=32 时间=7ms TTL=50

180.101.50.188 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 7ms,最长 = 21ms,平均 = 11ms

3. nslookup

nslookup www.baidu.com

输出

服务器:  public1.alidns.com
Address:  223.5.5.5

非权威应答:
名称:    www.a.shifen.com
Addresses:  240e:e9:6002:15a:0:ff:b05c:1278
          240e:e9:6002:15c:0:ff:b015:146f
          180.101.50.242
          180.101.50.188
Aliases:  www.baidu.com

总结

本篇介绍了在 go 中如何获取访问域名的 ip 地址,通过 go 官方 net 包可获取。

如果有记录 http 请求的域名 ip 这种需求,可以使用 go 1.17 后添加的 httptrace 包来插入钩子获取请求的 ip 地址。当然了,httptrace 的作用不止于此,它可以搜集 http 客户端请求整个生命周期中的信息,本篇未做详细介绍,感兴趣的可自行探索。文章来源地址https://www.toymoban.com/news/detail-788124.html

参考

  • 官博 Introducing HTTP Tracing

到了这里,关于golang 发起 http 请求,获取访问域名的 ip 地址(net, httptrace)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 全网多种方法分析解决HTTP Status 404资源未找到的错误,TCP的3次握手,dns域名解析,发起http请求以及cookie和session的区别

    正赶上最近 ChatGPT 很火,于是借助 ChatGPT 来解释 HTTP Status 404 ,如下所示: HTTP Status 404: The HTTP Status 404 means that the requested resource was not found on the server. This is commonly used in response to a failed HTTP request and can be caused by mistyping an URL, spelling mistakes, or trying to access a file or resource that

    2023年04月08日
    浏览(45)
  • Golang 获取本地 IP 地址方法

    在 Golang 中,使用 net 包可以很方便地获取到本机IP地址。 简单示例代码如下: 使用 udp 不需要关注是否送达,只需要对应的 ip 和 port 正确,即可获取到 IP 地址。简单示例代码如下:

    2024年02月15日
    浏览(54)
  • 检查网站是HTTP那种协议与获取域名的ipv6地址

    最近在做HTTPS的应用,可能需要使用ipv6的地址做SLB,但是怎么检查配置正确,总不能每次都看日志吧,实际上客户端也很容易查看,总结工作经验。 笔者想到了使用浏览器方式,或者抓包,因为HTTP2的数据根1.1有本质的区别,浏览器的方式很简单,抓包就看有没有stream ID之类

    2024年02月14日
    浏览(42)
  • 使用Golang实现HTTP代理突破IP访问限制

    在当今互联网时代,网站和服务商为了维护安全性和保护用户隐私,常常会对特定的IP地址进行封锁或限制。但是,有时候我们可能需要访问这些被限制的网站或服务。为了突破这种限制,我们可以使用HTTP代理来隐藏真实的客户端IP地址,从而绕过限制。 本文将介绍如何使用

    2024年02月07日
    浏览(42)
  • Java如何获取请求的ip 地址?

    2024年02月12日
    浏览(41)
  • Java获取请求者IP和地址

    在网上一番寻找,希望能找到一个根据IP解析地址的API,终于不负有心人,让我找到了,可是这个API是一个webservice,于是又学会了webservice调用,这个API来自webxml.com.cn,有着丰富的webservice接口,通过soapui调用情况如下图 http://ws.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl

    2024年02月06日
    浏览(35)
  • Chrome 谷歌浏览器获取网址映射 IP 地址 DNS 域名解析过程介绍(详细教程)

    步骤 说明 ① 浏览器输入:http://www.baidu.com ② 查找浏览器自身 DNS 缓存:chrome://net-internals/#dns ③ Windows 系统:查找系统 hosts 文件、Linux 系统:查找 /etc/hosts 文件 ④ 浏览器就会发起一个 DNS 系统调用(向本地域名服务器发起域名解析请求) ⑤ 本地域名服务器 LDNS 替我们的浏

    2024年02月03日
    浏览(67)
  • Java 获取客户端请求IP地址

    2024年02月15日
    浏览(45)
  • java获取真实的请求接口ip地址

    在Java程序中获取请求的真实IP地址可以使用以下方法: 使用javax.servlet.http.HttpServletRequest类中的getRemoteAddr()方法,这个方法可以获取请求的IP地址。 可以检查X-Forwarded-For,如果请求是通过代理服务器发送的,那么X-Forwarded-For将包含被代理客户端的IP地址。可以使用HttpServletReque

    2024年02月11日
    浏览(50)
  • win10能够正常访问网站、ip正常ping通,但是ping域名显示”请求找不到主机......“

    在使用wireshark分析数据包的时候,想要通过ping命令查看域名的ip,从而方便对数据包进行合理的过滤的时候,发现ping域名显示”请求找不到主机…“,nslookup可以正常解析域名,并且解析的域名正确指向百度网址 通过在线查找其它人的解决思路,概括来说,大致如下 (1)一

    2024年02月05日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包