
新开一个Go编程系列,主要讲Go语言的高级编程技术,希望能像《Go并发编程指南》一样形成一个系列,不要断更。
先前将近二十年的编程开发中,涉及到网络编程,主要还是使用标准库的网络库,无论是C#、Java、Go,编写的都是都UDP或者TCP的网络程序,主要在应用层做一些研发工作,包括微服务框架rpcx,来到百度基础网络部之后,主要负责黑盒的网络监控和告警,接触了很多底层的网络编程的技术,以及为了性能和大规模的探测做了各种的技术探索,从TCP/IP 二层三层通讯到机房内各种架构和层级连通,从vxLan到BGP,从内网、专线到自治系统,从25G网卡到100G网卡,从200G交换机到400G、800G交换机,从光纤劣化到长途链路自检和复用,从lldp到telemetry,很多概念我都是第一次接触到,所以感觉这两年来我虽然基础架构的工作做的少了,但是很好的弥补了我网络知识的确实,反而对我基础架构工作网络相关的知识做了弥补,很多以前不太理解的知识现在豁然开朗了。
我希望把我的知识沉淀下来,所以开一个《Go高级网络编程》系列,对网络编程的知识做一个总结,当然这些是通用的网络知识,不会涉及公司内部的业务逻辑。
虽然大致章节我已经确定,我还是挑一些有深度的章节先分享出来,TCP/UDP/ICMP等编程虽然也有很多细节可挖掘的地方,但是毕竟大部分的知识大家都已经了解了,这些章节放在最后再分享。
这一篇是使用gopacket库编程的一部分,主要是通过手工构造数据链路层、网络层、传输层的包,实现扫描全网(示例中是中国大陆的) ipv4的IP地址,看看对应的网络是否可达。 首先我们需要知道全网的IP地址,其实我们可以使用fping探测这些IP是否连通,然后我们自己基于ICMP快速扫描这些IP,找出全网活跃的IP地址,最后我们使用tcp scan的方式扫描全网的IP,甚至你可以扫描公网上暴露的Redis实例。