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 mainimport ("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 mainimport ("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 调试

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

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=50180.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:1278240e:e9:6002:15c:0:ff:b015:146f180.101.50.242180.101.50.188
Aliases:  www.baidu.com

总结

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

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

参考

  • 官博 Introducing HTTP Tracing

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/127476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NSGA-II 遗传多目标算法(python示例)

一、前言 最近在准备毕业论文&#xff0c;研究了一下主流的多目标算法&#xff0c;对于NSGA-II&#xff0c;网上大部分代码是全部是面向过程来实现的&#xff0c;本人更喜欢采用面向对象的方式&#xff0c;故采用python面向对象实现了一个示例&#xff0c;实现了对于二元多目标…

vue el-table-column 修改一整列的背景颜色

目录 修改表头以及一整列数据的背景颜色&#xff0c;效果如下&#xff1a; 总结 修改表头以及一整列数据的背景颜色&#xff0c;效果如下&#xff1a; 修改表头背景颜色&#xff1a;在el-table绑定header-cell-style 修改一整列的数据背景颜色&#xff1a;在el-table绑定:cel…

机器学习---支持向量机的初步理解

1. SVM的经典解释 改编自支持向量机解释得很好 |字节大小生物学 (bytesizebio.net) 话说&#xff0c;在遥远的从前&#xff0c;有一只贪玩爱搞破坏的妖怪阿布劫持了善良美丽的女主小美&#xff0c;智勇双全 的男主大壮挺身而出&#xff0c;大壮跟随阿布来到了妖怪的住处&…

美观且可以很方便自定义的MATLAB绘图颜色

函数介绍 主函数是draw_test&#xff0c;用于测试函数。 draw_h是函数&#xff0c;用于给Matlab提供美观且可以很方便自定义的绘图颜色。 draw_h函数介绍 这是一个带输入输出的函数&#xff0c;输入1/2/3&#xff0c;输出下面三种颜色库的配色&#xff0c;每种库均有五种颜色…

Java学习_day07_类的构造器代码块继承封装多态

文章目录 构造器格式注意点使用 代码块格式注意 继承格式注意点 封装包声明包导包注意点 访问修饰符 多态格式注意点代码演示 构造器 Java中每个类都至少有一个构造器&#xff0c;当程序员没有明确编写构造器时&#xff0c;Java编译器会自动为类添加一个无参的构造器。构造器通…

分享一下在微信小程序怎么发送优惠券

在微信小程序中&#xff0c;发送优惠券是一种常见的营销手段&#xff0c;它能够吸引用户购买商品或服务&#xff0c;提高销售业绩和用户忠诚度。本文将介绍在微信小程序中如何发送优惠券&#xff0c;包括优惠券的种类、发放方式、制作和推广等&#xff0c;帮助您更好地利用优惠…

沉痛悼念科研分公司

今天上班途中&#xff0c;遇到了上家公司的同事王强。他正准备去体检中心体检。几句寒暄之后&#xff0c;得知他是要入职选煤公司了。 我们所在的公司比较大&#xff0c;总公司下设有几十个分、子公司&#xff0c;我和他曾经在一家子公司——科研分公司。现在的科研分公司解散…

利用Vue2实现印章徽章组件

需要实现的组件效果&#xff1a; 该组件有设置颜色、大小、旋转度数和文本内容功能。 一、组件实现代码 <template><divclass"first-ring"v-bind"getBindValue":class"getStampBadgeClass":style"{ transform: rotate(${rotate}…

前端css介绍

CSS介绍 CSS&#xff08;Cascading Style Sheet&#xff0c;层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表&#xff0c;它就会按照这个样式表来对文档进行格式化&#xff08;渲染&#xff09;。 CSS语法 CSS实例 每个CSS样式由两个组成部分&#xff1a;选择器和…

基于springboot实现游戏分享网站系统项目【项目源码+论文说明】

基于springboot实现游戏分享网站演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把游戏分享管理与现在网络相结合&#xff0c;利用java技术建设游戏分享网站&#xff0c;实现游戏分享的信息化。则对于进一步提高游戏分享管理发展&#xff0c;丰富游戏分享管理经验能起到…

超高真空变温台的真空压力和气氛精密控制解决方案

摘要&#xff1a;针对目前国内外显微镜探针冷热台普遍缺乏真空压力和气氛环境精密控制装置这一问题&#xff0c;本文提出了解决方案。解决方案采用了电动针阀快速调节进气和排气流量的动态平衡法实现0.1~1000Torr范围的真空压力精密控制&#xff0c;采用了气体质量流量计实现多…

centos关闭Java进程的脚本

centos关闭Java进程的脚本&#xff0c;有时候服务就是个jar包&#xff0c;关闭程序又要找到进程ID&#xff0c;在kill掉&#xff0c;麻烦&#xff0c;这里就写了个脚本 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.脚本如下 #!/bin/bash ps -ef | grep java | gre…

Midjourney干货篇 - 与AI对话,如何写好prompt

文章目录 1、语法2、单词3、要学习prompt 框架4、善用参数&#xff08;注意版本&#xff09;5、善用模版6、临摹7、垫图 木匠不会因为电动工具的出现而被淘汰&#xff0c;反而善用工具的木匠&#xff0c;收入更高了。 想要驾驭好Midjourney&#xff0c;可以从以下方面出发调整&…

基于springboot实现原创歌曲分享平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现原创歌曲分享平台演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理平台应运而生&am…

保护听力戴什么耳机比较好?开放式耳机能保护听力吗?

如果想要在保护听力的前提下戴耳机&#xff0c;那么我是推荐戴骨传导耳机的&#xff01;&#xff01;&#xff01; 所谓骨传导即是一种声音传递的方式&#xff0c;跟普通耳机不同的是传统耳机是通过空气将声音通过耳膜以此完成传递&#xff0c;而骨传导耳机的原理是将声音以不同…

网站如何改成HTTPS访问

在今天的互联网环境中&#xff0c;将网站更改成HTTPS访问已经成为了一种标准做法。HTTPS不仅有助于提高网站的安全性&#xff0c;还可以提高搜索引擎排名&#xff0c;并增强用户信任。因此&#xff0c;转换为HTTPS是一个重要的举措&#xff0c;无论您拥有个人博客、电子商务网站…

Chatgpt批量改写文章网页版可多开软件-自动登录换号生成word或者TXT

Chatgpt批量改写文章网页版可多开软件介绍&#xff1a; 1、改写后生成docx格式文档和生成txt文档二选一。 2、支持原来docx文档里带图片的改写&#xff0c;改写伪原创后的docx里也带图片。 3、软件可以设置是否开启标题改写&#xff0c;可以自定义标题改写指令。 4、可以设置…

创新驱动发展 国家创新型城市试点名单2006-2018年(已整理DID格式)

数据简介&#xff1a;创新型城市是指在经济、科技和社会方面具有卓越创新能力的城市&#xff0c;这些城市通过提供良好的创新环境和支持系统&#xff0c;吸引和培养创新人才&#xff0c;促进新兴产业发展&#xff0c;推动经济增长和社会进步。创新型城市提供了丰富的就业机会和…

YOLOV8 NANO手势识别

采用YOLOV8 NANO训练&#xff0c;得到pt模型&#xff0c;然后转换成ONNX模型&#xff0c;OPENCV DNN调用&#xff0c;支持C,PYTHON,ANDROID开发。CPU每帧20MS左右&#xff0c;可以达到实时性 YOLOV8NANO手势识别