计算机网络怎么学?学会这几个工具有助你理解网络协议!

在实际开发过程中,熟悉使用Linux或者Windows中相关网络工具,可以让我更快更准的找到故障,所以今天分享几个必回的网络利器

1 nc

>nc-->“瑞士军刀”。不知大家在渗透过程中,拿了shell有没有使用nc搞点事儿。它用来快速构建网络链接。常用来调试客户端程序。

小贱上案例

2 ping

用来实现对网路连通性探测。我们知道网络上机器有唯一确定的IP地址,给地方发送数据包,根据返回的信息初步判断目标机器是否存在或者目标机器操作系统是啥。另外经常使用的Ping,底层原理是什么,是就TCP/UDP?

再具体实现中其实使用了ICMP协议,它是一种基于IP协议的控制协议,网际控制协议,其报文什么样子呢

下面分别阐述下字段含义

  • 类型: 表示ICMP的类型,如果为0表示请求类型,为8表示应答
  • 代码:用来查找产生错误的原因
  • 校验和:检查错误的数据
  • 标识符:使用标识符确认到底是谁发送的控制协议
  • 序列号:唯一确定的一个报文

ping命令组装成上述的IP报文进行发送,报文目的地之为ping目的地址,原地址为发送ping主机地址,然后按照ICMP的规则填写数据。

随后IP报文通过ARP协议,知道

查看详细参数

常用参数

[-l] :定义所发送数据包的大小,默认为32字节

[-n] :定义所发数据包的次数,默认为3次

[-t] :表示不间断向目标IP发送数据包

TTL

TTL 是 IP 协议包中的一个值,它告诉网络路由器包在网络中的时间是否太长而应被丢弃

  • TTL设置时间越长,那么缓存时间也就越长,更新也就越不容易生效。增大TTL可以节约域名解析时间从而加快网站的访问
  • 减小TTL值,减少更换空间时的不可访问时间

返回值

  • Request timed out

可能出现的情况

对方已经关机或者根本没有这个地址

可能不在同一个网段,即使通过路由也无法找到对方从而出现超时

对方存在但是设置了防火墙过滤

  • Destination host Unreachable

与对方不在同一个网段且没有设置默认路由

网线出毛病

  • Bad IP address

要么是IP地址不存在,要么是没有正确连接DNS服务器从而无法解析

3 ifconfig/ipaddr

查看服务器网卡,IP等信息

上图中被马赛克的位置假设为10.172.100.3,这样就是一个IP地址,凡是都有规则,IP地址按照小数点分割为四部分,每部分占8字节,所以IP地址为32位,那么这样的IP地址一共有多少呢

从而出现IPV6,128位

当时觉得32位很够用了,还将其分为5类,如下图所示

我们再看看各类地址的主机数量是多少

上图中可知道c类地址太少了吧,但是B类地址又太多,怎么中和一下嘞

无类型域间选路

CIDR 地址中包含标准的32位IP地址和有关网络前缀位数的信息。比如10.172.100.3/24,IP地址斜杠后面数字24,代表24位是网络号,后面八位为主机号。

如何得到网络号?

使用IP地址和子网掩码进行AND计算得到网络号。

4 tcpdump

>和它类似的工具在windows中是wireshark,其采用底层库winpcap/libpcap实现。采用了bpf过滤机制。下面我们看看提供的不同参数的含义。

知道了相关参数,下面看几个案例

5 lsof

列出当前系统打开的文件描述符工具。可以得知感兴趣的描述符是被哪些进程使用

同样,我们看看相关参数

老规矩,上几个例子

6 netstat

netstat是一个网络信息统计工具。它可以得到网卡接口上全部了解,路由表信息,网卡接口信息等。通常在网络编程中我们用它来显示TCP连接以及状态信息。

下面列举几个常用例子

7 dpkt

dpkt定义包packet类,它定义了网络报文类型的基础类。其中IP,ICMP等继承于dpkt class,每一个子类有一个 hdr 结构,此结构定义了不同报文的头部,方便取出相应的控制字段。示例如下

#!/usr/bin/python
#coding=utf-8
import dpkt
import socket
import optparse
 
def printPcap(pcap):
    # 遍历[timestamp, packet]记录的数组
    for (ts, buf) in pcap:
        try:
            # 获取以太网部分数据
            eth = dpkt.ethernet.Ethernet(buf)
            # 获取IP层数据
            ip = eth.data
            # 把存储在inet_ntoa中的IP地址转换成一个字符串
            src = socket.inet_ntoa(ip.src)
            dst = socket.inet_ntoa(ip.dst)
            print '[+] 源地址: ' + src + ' --> 目标地址: ' + dst
        except:
            pass
 
def main():
    parser = optparse.OptionParser('[*] Usage : ./pcapTest.py -f <file>')#测试包
    parser.add_option('-f',dest='fileName',type='string',help='specify target filename')
    (options,args) = parser.parse_args()
    fileName = options.fileName# 取得包名
 
    if fileName == None:
        print parser.usage
        exit(0)
    else:
        #f = open('geotest.pcap')
        f = open(fileName)
        pcap = dpkt.pcap.Reader(f)
        printPcap(pcap)
 
if __name__ == '__main__':
    main()

9 scapy

注意哈,这个是嗅探包不是爬虫框架scrapy哈。看看官网怎么说的,如“强大的交互式包操作工具”、“支持大量协议的包解析和包构造”、“轻松取代 hping,85% 的 nmap,arpspoof,tcpdump 等等”。不过归根到底,它说的强大功能,都是基于 Scapy 是一个强大的网络数据包操作工具才能实现得了的。只是大概介绍,具体用法官网非常详细,有助于学习网络协议

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

给俺点个赞呗,可以让更多的人看到这篇文章,顺便激励下我,嘻嘻。

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/dce883e914da77bfc7132cfb9
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券