后端自学之路《基础知识》第三篇:netstat -ano 各属性含义 (转!)

通信协议,本地外部地址,状态转移和PID

 

通过观察发现下面几个问题:

  1.协议自然不用说,是网络传输协议,类型属于http或者https。那么本地地址,外部地址,状态以及PID的意思是什么呢?

  2.这几者之间的相关联系又是什么呢?

  3.0.0.0.0和127.0.0.1的区别是什么?

  4.同一本地地址不同端口对应相同外部地址?

  5.同一本地地址相同端口对饮不同外部地址?

  6.不同行相同PID?

 

1、本地地址,外部地址,状态以及PID的意思是什么?

网络连接是有2方参与,自己就是“内部地址”,别人就是“外部地址”,就这么简洁。

  再举个例子,你用浏览器打开百度时,自己的 IP 地址就是内部地址了,也叫“本地地址”,百度服务器的IP就是外部地址,也就“远程地址”。

  状态:TCP状态转移

  TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。

①LISTENING状态

  FTP服务启动后首先处于侦听(LISTENING)状态。

②ESTABLISHED状态

  ESTABLISHED的意思是建立连接。表示两台机器正在通信。

③CLOSE_WAIT

 对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭

④TIME_WAIT

  我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。

  目前有一种避免TIME_WAIT资源浪费的方法,就是关闭socket的LINGER选项。但这种做法是TCP协议不推荐使用的,在某些情况下这个操作可能会带来错误。

  Process Identifier(进程控制符)简称PID,PID后面的数字就是各进程的身份标识编号,程序一运行系统就会自动分配给进程一个独一无二的PID。进程中止后PID被系统回收,可能会被继续分配给新运行的程序。PID一列代表了各进程的进程ID,也就是说,PID就是各进程的身份标识。

2、协议,本地地址,外部地址,状态以及PID之间的联系

举个通俗的例子来说,当你手机上的王者荣耀程序和腾讯的游戏服务器进行网络传输时,手机开放192.168.230.123本机地址,腾讯的游戏服务器开放192.168.231.123外部地址,比如在查看游戏战绩时,192.168.230.123:666和192.168.231.123:666进行通信,此时这个活动有唯一PID,状态可能是ESTABLISHED,协议可能是TCP或者UDP。

3、0.0.0.0和127.0.0.1的区别是什么

严格说来,0.0.0.0已经不是一个真正意义上的IP地址了。它表示的是这样一个集合:所有不清楚的主机和目的网络。这里的“不清楚”是指在本机的路由表里没有特定条目指明如何到达。对本机来说,它就是一个“收容所”,所有不认识的“三无”人员,一律送进去。如果你在网络设置中设置了缺省网关,那么Windows系统会自动产生一个目的地址为0.0.0.0的缺省路由。

  本机地址,主要用于测试。用汉语表示,就是“我自己”。在Windows系统中,这个地址有一个别名“Localhost”。寻址这样一个地址,是不能把它发到网络接口的。除非出错,否则在传输介质上永远不应该出现目的地址为“127.0.0.1”的数据包。

  127.0.0.1 是一个环回地址。并不表示“本机”。0.0.0.0才是真正表示“本网络中的本机”。

在实际应用中,一般我们在服务端绑定端口的时候可以选择绑定到0.0.0.0,这样我的服务访问方就可以通过我的多个ip地址访问我的服务。

  比如我有一台服务器,一个外放地址A,一个内网地址B,如果我绑定的端口指定了0.0.0.0,那么通过内网地址或外网地址都可以访问我的应用。但是如果我之绑定了内网地址,那么通过外网地址就不能访问。 所以如果绑定0.0.0.0,也有一定安全隐患,对于只需要内网访问的服务,可以只绑定内网地址。

4.同一本地地址不同端口对应相同外部地址?

这种多对一的关系,代表着本地的多个服务和一个外部的单个服务进行通信。

5.同一本地地址相同端口对饮不同外部地址?

这种一对多的关系,代表着本地的单个服务和多个外部地址的的服务进行通信。

6.不同行相同PID?

其实第1个问题中就包含了答案:进程中止后PID被系统回收,可能会被继续分配给新运行的程序。老的网络通信终结,回收PID,当新的网络通信建立时, 重新分配PID。所以会出现不用记录,不同PID的情况。

7.为什么有的时候两个地址的ip都是一样的呢(比如:127.0.0.1)?

这个连接是自己连接到自己的,我们的程序是可以自己机器连接到自己的机器的,比如你开了代理服务器然后自己浏览器连接到代理服务器上,另一个例子就是 vscode 启动一种程序来调试,vscode虚拟环境会开一个端口,然后vscode会连接上去,这时候本地地址和外部地址都是你的机器的 IP 。

 

转自地址:https://www.jianshu.com/p/42af752082ab

如有侵权望告知!!!


 

你可能感兴趣的:(NodeJS)