常用网络通信命令

Posted vector6_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用网络通信命令相关的知识,希望对你有一定的参考价值。

常用网络通信命令

ifconfig

ifconfig 是我们最常用的查看当前系统的网卡和 ip 地址信息的命令。

cfs@cfs:~$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.124.145  netmask 255.255.255.0  broadcast 192.168.124.255
        inet6 fe80::daff:b8ca:de10:da44  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:05:48:3b  txqueuelen 1000  (以太网)
        RX packets 139698  bytes 71573125 (71.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 22682  bytes 1870608 (1.8 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (本地环回)
        RX packets 35721  bytes 2645914 (2.6 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 35721  bytes 2645914 (2.6 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

输出显示了机器当前激活的网卡信息及每个网卡(网络设备)的 ipv4、ipv6 地址、子网掩码、广播地址等信息,这里一共两个网卡,分别是 ens33lo

如果我们想激活或者禁用某个网卡,可以使用 ifconfig upifconfig down 命令

ifconfig 网卡名 up
ifconfig 网卡名 down

将一个 ip 地址绑定到某个网卡上,或将一个 ip 从某个网卡上解绑,使用 ifconfig add ifconfig del 命令

ifconfig 网卡名 add ip地址
ifconfig 网卡名 del ip地址

其他参数命令

io_addr<I/O地址> 设置网络设备的I/O地址。 

irq<IRQ地址> 设置⽹络设备的IRQ。 

media<网络媒介类型> 设置网络设备的媒介类型。 

mem_start<内存地址> 设置网络设备在主内存所占用的起始地址。 

metric<数目> 指定在计算数据包的转送次数时,所要加上的数目。 

mtu<字节> 设置网络设备的MTU。 

netmask<子网掩码> 设置⽹络设备的子网掩码。 

tunnel<地址> 建⽴IPv4与IPv6之间的隧道通信地址。 

up 启动指定的网络设备。 

-broadcast<地址> 将要送往指定地址的数据包当成广播数据包来处理。 

-pointopoint<地址> 与指定地址的⽹络设备建立直接连线,此模式具有保密功能。 

-promisc 关闭或启动指定网络设备的promiscuous模式。 

[IP地址] 指定网络设备的IP地址。 

[网络设备] 指定网络设备的名称。

ping

ping 命令是我们最常用的命令之一,一般用于侦测本机到目标主机的网络是否通畅。其最简单的使用方法是:

ping ip地址
ping [-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-I<⽹络界⾯>][-l<前置载⼊>][-p<范本样式>][-s<数据 包⼤⼩>][-t<存活数值>][主机名称或IP地址]
  • -d 使⽤Socket的SO_DEBUG功能。

  • -c<完成次数> 设置完成要求回应的次数。

  • -f 极限检测。

  • -i<间隔秒数> 指定收发信息的间隔时间。

  • -I<网络界⾯> 使用指定的网络接⼝送出数据包。

  • -l<前置载⼊> 设置在送出要求信息之前,先⾏发出的数据包。

  • -n 只输出数值。

  • -p<范本样式> 设置填满数据包的范本样式。

  • -q 不显示指令执⾏过程,开头和结尾的相关信息除外。

  • -r 忽略普通的Routing Table,直接将数据包送到远端主机上。

  • -R 记录路由过程。

  • -s<数据包大小> 设置数据包的大小。

  • -t<存活数值> 设置存活数值TTL的大小。

  • -v 详细显示指令的执⾏过程。

telnet

telnet是TCP/IP协议族的⼀员,是网络远程登录服务的标准协议,帮助用户在本地计算机上连接远程主机。

如果一个服务程序对外开启了侦听服务,我们都可以使用 telnet 来连接上去,例如:

telnet IP PORT

如果不指定端口号,telnet 会使用默认 23 号端口。

反过来说,可以通过 telnet 命令去检测指定 ip 地址和端口号的侦听服务是否存在。知道这点很重要,我们可以利用这个去检测一个服务是否可以正常连接。举个例子,比如某次从某处得到一个代码下载地址,对于一个 svn 地址:svn://120.55.94.78/mycode/mybook。为了检测这个 svn 服务是否还能正常对外服务,我们可以先用 ping 命令去检测一下到达这个 ip:120.55.94.78 的网络是否畅通,如果网络畅通,我们再用 telnet 去连接上去

telnet和ssh的区别

端⼝区别:telnet是23 ssh是22

本质:telnet是明码传输,ssh是加密传输

nc

ncnetcat 命令,nc 命令常见的用法是验证服务器端口是否开放,模拟一个服务器程序被其他客户端连接,或者模拟一个客户端连接其他服务器,连接之后就可以进行数据收发。

  • -l ⽤于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接。

  • -s 指定发送数据的源IP地址,适⽤于多⽹卡机

  • -u 指定nc使⽤UDP协议,默认为TCP

  • -v 输出交互或出错信息,新⼿调试时尤为有⽤

  • -w 超时秒数,后⾯跟数字

模拟一个服务器程序

使用 -l 选项(单词 listen 的第一个字母)在某个 ip 地址和端口号上开启一个侦听服务,以便让其他客户端连接。通常为了显示更详细的信息,会带上 -v 选项。

cfs@cfs:~$ nc -v -l 127.0.0.1 6000
Listening on [127.0.0.1] (family 0, port 6000)

这样就在 6000 端口开启了一个侦听服务器,我们可以通过 127.0.0.1:6000 去连接上去

模拟一个客户端程序

用 nc 命令模拟一个客户端程序时,我们不需要使用 -l 选项,直接写上 ip 地址(或域名,nc 命令可以自动解析域名)和端口号即可

cfs@cfs:~$ nc -v www.baidu.com 80
Connection to www.baidu.com 80 port [tcp/http] succeeded!

输出提示我们成功连接上百度 Web 服务器。

除此之外,我们使用 nc 命令作为客户端时可以使用 -p 选项指定使用哪个端口号连接服务器(客户端连接服务器一般都是操作系统随机分配一个可用的端口号连接到服务器上去),例如,我们希望通过本地 5555 端口连接百度的 Web 服务器,可以这么输入:

nc -v -p 5555 www.baidu.com 80

再开一个 shell 窗口,我们使用 lsof 命令验证一下,是否确实通过 5555 端口连接上了百度 Web 服务器。

cfs@cfs:~$ lsof -Pni | grep nc

当然,当使用 nc 命令与对端建立连接后,我们可以发送消息。

  1. 使用 nc -v -l 0.0.0.0 6000 模拟一个侦听服务,再新建一个 shell 窗口利用 nc -v 127.0.0.1 6000 模拟一个客户端程序连接刚才的服务器。
  2. 此时在客户端和服务器就可以相互发消息了。我们可以达到一个简化版的 IM 软件聊天效果

nc 命令默认会将 \\n 作为每条消息的结束标志,如果你指定了 -C 选项,将会使用 \\r\\n 作为消息结束标志。

nc 命令不仅可以发消息,同时也能发文件。接收文件的一方是服务器端,发送文件的一方是客户端。例如:

服务器端命令:

nc -l ip地址 端口号 > 接收的文件名

客户端命令:

nc ip地址 端口号 < 发送的文件名

服务器端文件名指保存接收的文件名,不一定要使用客户端发送的文件名。

netstat

无论是 Windows 和 Linux 都提供了 netstat 命令,这个命令是我们使用的较多的查看网络连接状态的命令。这里以 Linux 系统为例,其常见选项有:

-a (all)显示所有选项,netstat 默认不显示 LISTEN 相关。
-t (tcp)仅显示 tcp 相关选项
-u (udp)仅显示 udp 相关选项
-n 不显示别名,能显示数字的全部转化成数字
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计 (重要)
-c 每隔一个固定时间,执行该 netstat 命令。

lsof

lsof 命令是 Linux 系统的扩展工具,它的含义是 list opened filedesciptor (列出已经打开的文件描述符),在 Linux 系统中,所有的与资源句柄相关的东西都可以统一抽象成文件描述符(filedescriptor,简称 fd)。一个文件句柄是一个 fd,一个 socket 对象也可以称之为 fd 等等。

使用 lsof 命令有三点需要注意:

  • 默认情况下,lsof 的输出比较多,我们可以使用 grep 命令过滤我们想要查看的进程打开的 fd 信息,如:

    lsof -i | grep myapp
    

    或者使用 lsof -p pid 也能过滤出指定的进程打开的 fd 信息

  • lsof 命令只能查看到当前用户有权限查看到的进程 fd 信息,对于其没有权限的进程,最右边一列会显示 “Permission denied”。

  • lsof 命令第一栏进程名在显示的时候,默认显示前 n 个字符,这样如果我们需要显示完整的进程名以方便过滤的话,可以使用 +c 选项。当然,如果你设置值太大, lsof 便不会采用你设置的最大值,而是使用默认最大值。

  • socket 也是一种 fd,如果需要仅显示系统的网络连接信息,使用的是 -i 选项即可,这个选项可以形象地显示出系统当前的出入连接情况:

当然,和 netstat 命令一样,lsof -i 默认也会显示 ip 地址和端口号的别名,我们只要使用 -n-P 选项就能相对应地显示 ip 地址和端口号了,综合起来就是 lsof -Pni

curl

curl 命令是 Linux 上可以模拟发送 http 请求的一个非常常用的命令

curl -i "http://www.sina.com" # 打印请求响应头信息 
curl -I "http://www.sina.com" # 仅返回http头 
curl -v "http://www.sina.com" # 打印更多的调试信息 
curl -verbose "http://www.sina.com" # 打印更多的调试信息 
curl -d 'abc=def' "http://www.sina.com" # 使⽤post⽅法提交http请求 
curl -sw '%{http_code}' "http://www.sina.com" # 打印http响应码

curl 最基础的用法是 curl 页面url,例如:

curl http://www.baidu.com

其默认行为是把目标页面内容输出到 shell 窗口:

[root@localhost ~]# curl http://www.baidu.com
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

也可以把页面保存到本地(等价于 -o 选项)

curl http://www.baidu.com > index.html
## 等价于
curl -o index.html http://www.baidu.com

http 常用的请求方式是 GET 和 POST 两种方式,我们可以使用 -X 选项来显式指定请求是 GET 还是 POST 方式(不指定使用默认 GET 方式):

curl -X GET http://www.baidu.com/index.php?s=9

如果使用 GET 方式,curl 提供了另外一个专门的选项 -G (或 –get)来设置。

如果是 POST 方法,除了需要使用 -X 选项(或 –request)指定请求方法,还需要使用 -d (或 –data)指定 POST 的数据内容:

curl -X POST -d 'somepostdata' 'https://www.somesite.com/api/v1/chat'

我们有时候需要在发送 http 请求时设置增加一些头部信息,可以使用 -H(或 –header)指定,如果有多个选项可以使用多次 -H 来逐一设置。例如:

curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' -H 'Accept: application/json' -H 'X-Requested-With: XMLHttpRequest' -d 'somepostdata' 'https://www.somesite.com/api/v1/chat'

如果你需要使用代理去发送 http 请求可以使用 -x 选项(或 –proxy),使用形式如下:

curl -x <[protocol://][user:password@]proxyhost[:port]>

tcpdump

tcpdump是网络状况分析和跟踪⼯具,是可以用来抓包的实用命令,

tcpdump 常用的选项有:

  • -i 指定要捕获的目标网卡名,网卡名可以使用前面章节中介绍的 ifconfig 命令获得;如果要抓所有网卡的上的包,可以使用 any 关键字。

    ## 抓取网卡ens33上的包
    tcpdump -i ens33
    ## 抓取所有网卡上的包
    tcpdump -i any
    
  • -X 以 ASCII 和十六进制的形式输出捕获的数据包内容,减去链路层的包头信息;-XX 以 ASCII 和十六进制的形式输出捕获的数据包内容,包括链路层的包头信息。

  • -c 抓取多少条报文

  • -n 不要将 ip 地址显示成别名的形式;-nn 不要将 ip 地址和端口以别名的形式显示。

  • -S 以绝对值显示包的 ISN 号(包序列号),默认以上一包的偏移量显示。

  • -vv 抓包的信息详细地显示;

  • -w 将抓取的包的原始信息(不解析,也不输出)写入文件中,后跟文件名

  • -r 从利用 -w 选项保存的包文件中读取数据包信息。

以上是关于常用网络通信命令的主要内容,如果未能解决你的问题,请参考以下文章

C#常用代码片段备忘

常用python日期日志获取内容循环的代码片段

swift常用代码片段

# Java 常用代码片段

# Java 常用代码片段

IOS开发-OC学习-常用功能代码片段整理