socket理解(1)

socket理解(1)

事情的起因是这样子的:

今天下午配置一个JDBC,使用的是INFORMIX数据库,按照往常的配置完毕后,无论如何也链接不到INFORMIX-SERVER,导致JAVA一直报错。

一开始我的JDBC是:

jdbc:informix-sqli://127.0.0.1:7776/dbname:informixserver=hdr1
[root@GNPIN1 ~]# netstat -anp | grep oninit
tcp        0      0 10.0.0.1:7776               0.0.0.0:*                   LISTEN      13003/oninit        
tcp        0      0 192.168.81.31:7778          0.0.0.0:*                   LISTEN      13005/oninit        
tcp        0      0 10.0.0.1:7776               10.0.0.2:46523              ESTABLISHED 13003/oninit        
tcp        0      0 10.0.0.1:7776               10.0.0.2:46431              ESTABLISHED 13003/oninit        
tcp        0      0 10.0.0.1:7776               10.0.0.1:41254              ESTABLISHED 13003/oninit        
tcp        0      0 10.0.0.1:34508              10.0.0.2:7777               ESTABLISHED 13003/oninit
[root@GNPIN1 ~]# ifconfig | grep "inet addr"
          inet addr:192.168.81.31  Bcast:192.168.81.255  Mask:255.255.255.0
          inet addr:10.112.17.84  Bcast:10.112.17.95  Mask:255.255.255.240
          inet addr:10.0.0.1  Bcast:10.0.0.3  Mask:255.255.255.252
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0
          inet addr:127.0.0.1  Mask:255.0.0.0

从ifconfig输出可以看到,这台机器有5个IP,也就是说,10.0.0.1与127.0.0.1是在一台机器上的。

而实际上INFORMIX监听的是10.0.0.1或者是192.168.81.131,并没有监听127.0.0.1.

我的第一感觉是,一台机器上有两个IP,一个是10.0.0.1,一个是127.0.0.1,那么往127.0.0.1发数据,不是相当于往10.0.0.1发送数据嘛?

实际上并不是这样子的。

Linux中总是以socket来作为链接的终端,啥叫socket?

socket = IP + PORT

也就是说,

socket1 = 10.0.0.1:7776
socket2 = 127.0.0.1:7776

是两个完全不同的socket(对象),那你说,我JDBC配置成127.0.0.1(socket2)可能链接到INFORMIX-SERVER(socket1)嘛?

很明显是不可以。

最后修改就简单了:

jdbc:informix-sqli://10.0.0.1:7776/dbname:informixserver=hdr1

当然也可以使用:

192.168.81.31:7778

OK。


我们接下来看一组实验:

实际环境:

tcp        0      0 10.0.0.1:7776               0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:12001               0.0.0.0:*                   LISTEN      
tcp        0      0 192.168.81.31:7778          0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
tcp        0      0 :::18081                    :::*                        LISTEN      
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      
tcp        0      0 ::1:25                      :::*                        LISTEN
[root@GNPIN1 ~]# ifconfig | grep  "inet addr"
          inet addr:192.168.81.31  Bcast:192.168.81.255  Mask:255.255.255.0
          inet addr:10.112.17.84  Bcast:10.112.17.95  Mask:255.255.255.240
          inet addr:10.0.0.1  Bcast:10.0.0.3  Mask:255.255.255.252
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0
          inet addr:127.0.0.1  Mask:255.0.0.0

sample 1:

tcp        0      0 10.0.0.1:7776               0.0.0.0:*                   LISTEN      
telnet 10.0.0.1 7776 yes
telnet 127.0.0.1 7776 no
telnet 192.168.81.31 7776 no
telnet 10.112.17.84 7776 no
telnet 192.168.0.100 7776 no

此时有个socket=10.0.0.1:7776,那就仅仅

telnet 10.0.0.1 7776

可以链接成功,其余都不可能链接到服务器(服务进程)上(虽然什么127.0.0.1指代的是localhost,虽然192.168.81.31也是指代本机…)。

sample 2:

tcp        0      0 0.0.0.0:12001               0.0.0.0:*                   LISTEN      
telnet 192.168.81.31 12001 yes
telnet 10.112.17.84 12001 yes
telnet 10.0.0.1 12001 yes
telnet 192.168.0.100 12001 yes
telnet 127.0.0.1 12001 yes

这个0.0.0.0是啥意思?

本来是个保留地址,但是在这里的意思是,任何IP都可以链接过来:

你可以用192.168.81.31 12001来链接;
你可以用10.112.17.84 12001来链接;
你可以用192.168.0.100 12001来链接;
……

sample 3:

tcp        0      0 192.168.81.31:7778          0.0.0.0:*                   LISTEN      
telnet 192.168.81.31 7778 yes
telnet 10.112.17.84 7778 no
telnet 10.0.0.1 7778 no
telnet 192.168.0.100 7778 no
telnet 127.0.0.1 7778 no

同sample 1.

sample 4:

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
telnet 127.0.0.1 25 yes
telnet 192.168.81.31 25 no
telnet 10.112.17.84 25 no
telnet 10.0.0.1 25 no
telnet 192.168.0.100 25 no

同sample1.只不过这次是127.0.0.1,但是并没有什么特别的啊,不要以为在127.0.0.1这个IP上建立监听,就能在别的同台主机的IP上去访问…

sample 5:

tcp        0      0 :::18081                    :::*                        LISTEN      
telnet 192.168.81.31 18081 yes
telnet 10.112.17.84 18081 yes
telnet 10.0.0.1 18081 yes
telnet 192.168.0.100 18081 yes
telnet 127.0.0.1 18081 yes
telnet ::1 18081 yes

这里的:::是一个IPV6地址,其实它的含义在此处等价于0.0.0.0,谁都能链接来。
这里的::1也是一个IPV6地址,它的含义在此处等价于127.0.0.1.

sample 5其实等价于sample 2,只不过协议版本不一样。

这里还需要注意下,我使用ipv4的IP地址,比如10.112.17.84,也是可以链接到IPV6的,IPV6向下兼容IPV4。

sample 6:

tcp        0      0 ::1:25                      :::*                        LISTEN
telnet 192.168.81.31 25 no
telnet 10.112.17.84 25 no
telnet 10.0.0.1 25 no
telnet 192.168.0.100 25 no
telnet 127.0.0.1 25 yes
telnet ::1 25 yes

::1啥意思上面已经解释过了,等价于IPV4的127.0.0.1,这个例子等价于IPV4版本的sample 4.

始终记住,socket是一个二元组,IP+PORT结合的!即使在同一台机器,即使在127.0.0.1上,他们并没有什么不同。

结尾的小问题:

端口占用–:

现在我们有socket:

10.0.0.1:7776

如果我再来个进程监听:

127.0.0.1:7776

会导致端口已被占用的问题吗?

不会!

可以同时存在

10.0.0.1:7776
127.0.0.1:7776

在一台机器上,这台机器有两个IP:10.0.0.1,127.0.0.1。

完全没问题!他们是不同的socket。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值