美文网首页
通信协议,本地外部地址,状态转移和PID的故事

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

作者: 趁你还年轻233 | 来源:发表于2017-07-03 14:25 被阅读395次

      通过观察发现下面几个问题:
      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 。
    参考文章:
    http://www.cppblog.com/prayer/archive/2009/04/01/78592.html
    http://www.cnblogs.com/dwnblogs/archive/2012/09/03/2668492.html
    http://www.cnblogs.com/xuan52rock/p/5403703.html
    https://zhidao.baidu.com/question/71519924.html
    http://blog.onlycatch.com/post/7e371ca28621

    相关文章

      网友评论

          本文标题:通信协议,本地外部地址,状态转移和PID的故事

          本文链接:https://www.haomeiwen.com/subject/xxjacxtx.html