前言

今天碰到了个需求,我要知道程序对外访问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 查询使用的是 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: %+vn", dnsInfo)
		},
		GotConn: func(connInfo httptrace.GotConnInfo) {
			fmt.Printf("Got Conn: %+vn", 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&gt; Coalesced:false}
Got Conn: 180.101.50.188:443

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

其他查看服务器 ip 的方法

1. 浏览器 F12 调试

可以通过浏览器调试进行查看
在这里插入图片描述

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://blog.csdn.net/DisMisPres/article/details/134176876

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_37022.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注