常用网络命令及原理

非 Y 不嫁゛ 提交于 2019-12-05 20:36:12

、文章摘要

POSIX标准对操作系统的系统接口API和Shell脚本语言及命令工具给出了规格定义,但是其中似乎并不包含网络相关的命令工具,但实际上网络功能在操作系统基础服务中占有着突出的地位,各种版本的操作系统也都提供了网络相关的命令工具,已经形成了某种程度的事实上的标准,请您调研网络相关的命令工具,有选择有重点地做一个网络相关的命令工具研究报告。

二、查看以及修改网络配置信息

ifconfig以及其衍生

ifconfig对应参数信息可以采用ifconfi-help进行查看

ifconfig [网络设备][down up -allmulti -arp -promisc][add<地址>][del<地址>][<hw<网络设备类型><硬件地址>][io_addr<I/O地址>][irq<IRQ地址>][media<网络媒介类型>][mem_start<内存地址>][metric<数目>][mtu<字节>][netmask<子网掩码>][tunnel<地址>][-broadcast<地址>][-pointopoint<地址>][IP地址]

 

 

 

 1、查看网络配置信息命令:ifconfig

 

 

 

 

2、使用场景与意义

Ens33表示的是网卡名称,

显示其ip地址为192.168.150.12

是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。

子网掩码为255.255.255.0。

设定子网掩码是为了将其划分成子网,这样就能将不够使用的IP地址分段进行使用。 

在第二行中inet6 fe80::20c:29ff:fe5f:bd8显示的是ipv6地址。

这个被称为MAC地址,是一个网卡的物理地址,用十六进制,6个byte表示。

第三行显示的是00:0c:29:5f:0b:d8表是的是其MAC地址。

 

直译为媒体存取控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。

其中虚拟机在设置MAC地址时,桥接的工作机制是将物理网络段(也就是常说的冲突域)进行分隔,根据MAC地址来判断连接两个物理网段的计算机的数据包发送。根据工作原理,在桥接模式中,虚拟机和主机的MAC应该不同的,这样,主机在发送或者接收信息时就能够区分虚拟机与主机的地址。

 

2、修改网络配置信息命令

(1)方法一:可以直接在ubutu中选择对应的配置文件直接进行修改,不用每次输入一个指令,仅以ubuntu18.04为例,其配置网卡信息为eth33。

Vi /etc/netplan/50-cloud-init.yaml

(2)方法二:可以每次进行输入一条指令修改网络信息

ifconfig 为网卡指定IP地址,这只是用来调试网络用的,并不会更改系统关于网卡的配置文件,当重新启动时,其ip地址与网卡信息均会发生改变。

 

设置ip和掩码,

[root@localhost ~]# ifconfig ens33 192.168.150.128
[root@localhost ~]# ifconfig ens33 192.168.150.128 netmask 255.255.255.0
[root@localhost ~]# ifconfig ens33 192.168.150.129 netmask 255.255.255.0 broadcast 192.168.150.255

  

在IP地址的上一行是link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff。

设置网关:

route add default ge 192.168.150.1

 

激活或终止网络接口的连接:

ifconfig eth33 down/up

 

 

3、命令原理

命令原理:ifconfig命令是一个脚本文件,选取其中较为典型的函数进行介绍

1、

static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa)

{

    int err = 0;

 

    memcpy((char *) &ifr->ifr_netmask, (char *) sa,

       sizeof(struct sockaddr));

    if (ioctl(skfd, SIOCSIFNETMASK, ifr) < 0) {

    fprintf(stderr, "SIOCSIFNETMASK: %s\n",

       strerror(errno));

    err = 1;

    }

    return err;

}

    if (!strcmp(*spp, "netmask")) {

        if (*++spp == NULL || didnetmask)

       usage();

        safe_strncpy(host, *spp, (sizeof host));

        if (ap->input(0, host, &sa) < 0) {

           if (ap->herror)

              ap->herror(host);

           else

              fprintf(stderr, _("ifconfig: Error resolving '%s' for netmask\n"), host);

       goterr = 1;

       spp++;

       continue;

        }

        didnetmask++;

        goterr |= set_netmask(ap->fd, &ifr, &sa);

        spp++;

        continue;

    }

###如果设定的密码与输入的密码相同,则能够获取相关的网关信息。

    if (!strcmp(*spp, "up")) {

        goterr |= set_flag(ifr.ifr_name, (IFF_UP | IFF_RUNNING));

        spp++;

        continue;

    }

    if (!strcmp(*spp, "dynamic")) {

        goterr |= set_flag(ifr.ifr_name, IFF_DYNAMIC);

        spp++;

        continue;

    }

 

其中set_flag函数是对网卡进行控制,对于strcmp是在strcmp比较两个字符串的信息。

 

 

二、ping命令

1、具体参数
ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [-j computer-list] | [-k computer-list] [-w timeout] destination-list
  -t Ping 指定的计算机直到中断。
  -a 将地址解析为计算机名。
  -n count 发送 count 指定的 ECHO 数据包数。默认值为 4。
  -l length 发送包含由 length 指定的数据量的 ECHO 数据包。默认为 32 字节;最大值是65,527。
  -f 在数据包中发送"不要分段"标志。数据包就不会被路由上的网关分段。
  -i ttl 将"生存时间"字段设置为 ttl 指定的值。
  -v tos 将"服务类型"字段设置为 tos 指定的值。
  -r count 在"记录路由"字段中记录传出和返回数据包的路由。count 可以指定最少 1 台,最多 9 台计算机。
  -s count 指定 count 指定的跃点数的时间戳。
  -j computer-list 利用 computer-list 指定的计算机列表路由数据包。连续计算机可以被中间网关分隔(路由稀疏源)IP 允许的最大数量为 9。
  -k computer-list 利用 computer-list 指定的计算机列表路由数据包。连续计算机不能被中间网关分隔(路由严格源)IP 允许的最大数量为 9。
  -w timeout 指定超时间隔,单位为毫秒。
destination-list 指定要 ping 的远程计算机。

 

使用windows主机ping虚拟机,

使用ubuntu开始ping通windows主机。该命令在linux与windows系统下均是通用的。

 

 

 

3、使用场景与工作原理
Ping命令工作在传输层,PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序。Ping发送一个ICMP(Internet Control Messages Protocol)即因特网信报控制协议;回声请求消息给目的地并报告是否收到所希望的ICMP echo (ICMP回声应答)。它是用来检查网络是否通畅或者网络连接速度的命令。
采用的是ICMP,是“Internet Control Message Protocol”(Internet控制消息协议)的缩写,是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
Ping 是个使用频率极高的网络诊断程序, 用于确定本地主机是否能与另一台主机交换 (发 送与接收)数据报。根据返回的信息,你就可以推断 TCP/IP 参数是否设置得正确以及运行 是否正常。 需要注意的是: 成功地与另一台主机进行一次或两次数据报交换并不表示 TCP/IP 配置就是正确的,你必须执行大量的本地主机与远程主机的数据报交换,才能确信 TCP/IP 的正确性。
 
检测命令关键性源码如下所示,获取发送到接受的时间,得到是否可达。
for(int i=0;i{ 
int bwrote; 
((IcmpHeader*)icmp_data)->i_cksum = 0; 
((IcmpHeader*)icmp_data)->timestamp = GetTickCount(); 
((IcmpHeader*)icmp_data)->i_seq = seq_no++; 
((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data,datasize);
 bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest)); 
if (bwrote == SOCKET_ERROR){ 
if (WSAGetLastError() == WSAETIMEDOUT) { 
printf("Request timed out.\n"); 
continue; 
} 
fprintf(stderr,"sendto failed: %d\n",WSAGetLastError()); 
ExitProcess(STATUS_FAILED); 
} 
if (bwrote < datasize ) { 
fprintf(stdout,"Wrote %d bytes\n",bwrote); 
} 
bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen); 
if (bread == SOCKET_ERROR){ 
if (WSAGetLastError() == WSAETIMEDOUT) { 
printf("Request timed out.\n"); 
continue; 
} 
fprintf(stderr,"recvfrom failed: %d\n",WSAGetLastError()); 
ExitProcess(STATUS_FAILED); 
} 
if(!decode_resp(recvbuf,bread,&from))
 statistic++; /* 成功接收的数目++ */
Sleep(1000); 
} 

三、netstat命令

使用netstat命令可以监控TCP/IP网络配置和工作状况。它可以显示内核路由表、 活动的网络状态以及每个网络接口的有用的统计数字。
  -a 显示所有Internet连接的有关信息,包括那些正在监听的信息
  -i 显示所有网络设备的统计数字
  -c 不断显示网络的更新状态。这个参数使用netstat每秒一次的输出网络状态列表,直到该程序被中断
  -n 以数字/原始形式显示远程地址、本地地址和端口信息,而不是解析主机名和服务器

  -o 显示计数器的终止时间和每个网络连接的回退(back off)情况
  -r 显示内核路由表
  -t 只显示TCP socket信息,包括正在监听的信息
  -u 只显示UDP socket信息
  -v 
 显示netstat版本信息
  -w 显示原始(raw)socket信息
  -x 显示UNIX域socket信息

 

 

2、效果演示

在linux上查看其信息如下所示。

 

 

 

 

Netstat –e查看相关的以太网的连接情况

 

 

 

 

类似的在windows上也有相应的命令,netstat -lnt | grep ssh | wc -l -->只要大于2个,ssh服务就是好的。

 

 

 

 

3、命令应用场景与原理

 

显示网络连接、路由表和网络接口信息,可以让用户得知有哪些网络连接正在运作。

Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

定义结构体数组。

发现其实netstat就是通过遍历/proc目录下的文件来获取对应的信息,下面贴出ipv4命令的信息。

struct option

 

{

 

  const char *name;

 

  /* has_arg can't be an enum because some compilers complain about

 

     type mismatches in all the code that assumes it is an int.  */

 

  int has_arg;

 

  int *flag;

 

  int val;

 

};

 

static void ipv4(const char *filename, const char *label) {

    FILE *fp = fopen(filename, "r");

    if (fp == NULL) {

        return;

    }

    char buf[BUFSIZ];

    fgets(buf, BUFSIZ, fp);

    while (fgets(buf, BUFSIZ, fp)){

        char lip[ADDR_LEN];

        char rip[ADDR_LEN];

        iaddr laddr, raddr;

        unsigned lport, rport, state, txq, rxq, num;

        int n = sscanf(buf, " %d: %x:%x %x:%x %x %x:%x",

                       &num, &laddr.u, &lport, &raddr.u, &rport,

                       &state, &txq, &rxq);

        if (n == 8) {

            addr2str(AF_INET, &laddr, lport, lip);

            addr2str(AF_INET, &raddr, rport, rip);

 

            printf("%4s  %6d %6d %-22s %-22s %s\n",

                   label, txq, rxq, lip, rip,

                   state2str(state));

        }

    }

    fclose(fp);

}

 

int main(int argc, char *argv[])
{
    printf("Proto Recv-Q Send-Q Local Address          Foreign Address        State\n");
    ipv4("/proc/net/tcp",  "tcp");
    ipv4("/proc/net/udp",  "udp");
    ipv6("/proc/net/tcp6", "tcp6");
    ipv6("/proc/net/udp6", "udp6");
    return 0;
}

 

衍生:

查看端口工具:netstat,lsof,ss,nc,telnet

 

下载工具:curl,wget,axel

 

防火墙:iptables,ipset

 

流量相关:iftop,nethogs

 

连通性及响应速度:ping,traceroute,mtr,tracepath

 

域名相关:nslookup,dig,whois

 

web服务器:python,nginx

 

抓包相关:tcpdump

 

网桥相关:IP,brctl,ifconfig,ovs

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!