关于主机多IP和服务端口绑定IP的研究

标签: 主机 ip 服务 | 发表时间:2013-11-29 00:45 | 作者:MINEZHANGHAO
出处:http://blog.csdn.net

      在网络编程中,经常需要在服务器里开一个端口,这里有一个问题,这个端口是开到哪个IP上面了,因为对于服务器来说经常是不止一个IP的,一个是127.0.0.1,一个是内网IP,比如192.168.1.3,一个是外网IP,比如211.19.56.39。对于开发着来说,经常会忽略绑定到具体某个IP上面,类似于下面的代码

		ServerSocket serverSocket = new ServerSocket(8888);
		//serverSocket.bind(new InetSocketAddress(8888));
		

在这种情况下,一般服务器会把此端口绑定到0.0.0.0上面,即在所有IP上面都绑定,即能在每个ip上面收到请求。

      但是对于一般服务器来说,都会有定制服务器IP的功能,比如对内网IP的访问会宽松些,放些公司内部的资料,而对于外网IP来说,访问会相对的严格,限制较多。基于这样的需求,我做了一些实验,如下。

      首先 获得我电脑的所有ip和mac地址

	@Test
	public void testNetwork2() throws Exception{
		Enumeration<NetworkInterface> interfaces=NetworkInterface.getNetworkInterfaces();
		while(interfaces.hasMoreElements()){
			NetworkInterface in= interfaces.nextElement();
			System.out.println("mac:"+bytesToHexString(in.getHardwareAddress()));
			Enumeration<InetAddress> addrs=in.getInetAddresses();
			while(addrs.hasMoreElements()){
				InetAddress ia= addrs.nextElement();
				if(ia instanceof Inet4Address){
					System.out.println(ia.getHostAddress());
					System.out.println("islookback:"+ia.isLoopbackAddress());
				
				}
			}
		}
				
	}
	public static String bytesToHexString(byte[] src){  
	    StringBuilder stringBuilder = new StringBuilder("");  
	    if (src == null || src.length <= 0) {  
	        return null;  
	    }  
	    for (int i = 0; i < src.length; i++) {  
	        int v = src[i] & 0xFF;  
	        String hv = Integer.toHexString(v);  
	        if (hv.length() < 2) {  
	            stringBuilder.append(0);  
	        }  
	        stringBuilder.append(hv);  
	    }  
	    return stringBuilder.toString();  
	}


输出:

mac:null
127.0.0.1
islookback:true
mac:null
mac:null
mac:null
mac:null
mac:null
mac:null
mac:null
mac:null
mac:null
mac:00000000000000e0
mac:001aa027b7b6
10.11.2.63
islookback:false
mac:005056c00001
192.168.20.1
islookback:false
mac:null
mac:null
mac:null
mac:null
mac:null
mac:null
看到总共有3个ip 127.0.0.1 、10.11.2.63、192.168.20.1

实验一(在全网侦听):

ServerSocket serverSocket = new ServerSocket();
		serverSocket.bind(new InetSocketAddress(8888));
		serverSocket.accept();


在cmd里面输入netstat -ano -p TCP,输出如下:

  协议  本地地址          外部地址        状态           PID
  TCP    0.0.0.0:23             0.0.0.0:0              LISTENING       1936
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       936
  TCP    0.0.0.0:8888          0.0.0.0:0              LISTENING       484
  TCP    0.0.0.0:49163          0.0.0.0:0              LISTENING       1264
  TCP    0.0.0.0:55571          0.0.0.0:0              LISTENING       2768
  TCP    10.11.2.63:139         0.0.0.0:0              LISTENING       4
  TCP    127.0.0.1:8307         0.0.0.0:0              LISTENING       2596
  TCP    192.168.20.1:139       0.0.0.0:0              LISTENING       4

此次可以用所有ip进行访问此端口

 

实验二(在127.0.0.1侦听):

ServerSocket serverSocket = new ServerSocket();
		serverSocket.bind(new InetSocketAddress("127.0.0.1",8888));
		serverSocket.accept();


在cmd里面输入netstat -ano -p TCP,输出如下:

  协议  本地地址          外部地址        状态           PID
  TCP    0.0.0.0:23             0.0.0.0:0              LISTENING       1936
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       936
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       716
  TCP    10.11.2.63:139         0.0.0.0:0              LISTENING       4
  TCP    127.0.0.1:8307         0.0.0.0:0              LISTENING       2596
  TCP    127.0.0.1:8888         0.0.0.0:0              LISTENING       3948 
  TCP    192.168.20.1:139       0.0.0.0:0              LISTENING       4

这个时候只能通过127.0.0.1来访问此端口,别的IP不可访问

 

实验三(在10.11.2.63侦听):

		ServerSocket serverSocket = new ServerSocket();
		serverSocket.bind(new InetSocketAddress("10.11.2.63",8888));
		serverSocket.accept();

在cmd里面输入netstat -ano -p TCP,输出如下:

  协议  本地地址          外部地址        状态           PID
  TCP    0.0.0.0:23             0.0.0.0:0              LISTENING       1936
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       936
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       716
  TCP    10.11.2.63:139         0.0.0.0:0              LISTENING       4
  TCP    10.11.2.63:8888        0.0.0.0:0              LISTENING       4324
  TCP    127.0.0.1:8307         0.0.0.0:0              LISTENING       2596
  TCP    192.168.20.1:139       0.0.0.0:0              LISTENING       4

这个时候只能通过 10.11.2.63来访问此端口,别的IP不可访问

 

 

实验四(在192.168.20.1侦听):

		ServerSocket serverSocket = new ServerSocket();
		serverSocket.bind(new InetSocketAddress("192.168.20.1",8888));
		serverSocket.accept();

 

在cmd里面输入netstat -ano -p TCP,输出如下:

  协议  本地地址          外部地址        状态           PID
  TCP    0.0.0.0:23             0.0.0.0:0              LISTENING       1936
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       936
  TCP    10.11.2.63:139         0.0.0.0:0              LISTENING       4
  TCP    127.0.0.1:8307         0.0.0.0:0              LISTENING       2596 
  TCP    192.168.20.1:139       0.0.0.0:0              LISTENING       4
  TCP    192.168.20.1:8888      0.0.0.0:0              LISTENING       4652

这个时候只能通过 192.168.20.1来访问此端口,别的IP不可访问

 

实验五(在192.168.20.1和127.0.0.1同时侦听):

		new Thread(){
			public void run() {				
				try {
					ServerSocket serverSocket = new ServerSocket();
					serverSocket.bind(new InetSocketAddress("127.0.0.1",8888));
					serverSocket.accept();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}				
			};
		}.start();
		
		ServerSocket serverSocket = new ServerSocket();
		serverSocket.bind(new InetSocketAddress("192.168.20.1",8888));
		serverSocket.accept();

在cmd里面输入netstat -ano -p TCP,输出如下:

  协议  本地地址          外部地址        状态           PID
  TCP    0.0.0.0:23             0.0.0.0:0              LISTENING       1936
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       936
  TCP    10.11.2.63:139         0.0.0.0:0              LISTENING       4
  TCP    127.0.0.1:8307         0.0.0.0:0              LISTENING       2596
  TCP    127.0.0.1:8888         0.0.0.0:0              LISTENING       1804 
  TCP    192.168.20.1:139       0.0.0.0:0              LISTENING       4
  TCP    192.168.20.1:8888      0.0.0.0:0              LISTENING       1804

这个时候只能通过 192.168.20.1和127.0.0.1来访问此端口,别的IP不可访问

 

        至此,大家应该对如何获取主机所有ip和端口在哪个ip上面绑定进一步了解了吧。下面贴上jdk的关于ip和端口的几个类图以及关系。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

作者:MINEZHANGHAO 发表于2013-11-28 16:45:56 原文链接
阅读:62 评论:0 查看评论

相关 [主机 ip 服务] 推荐:

关于主机多IP和服务端口绑定IP的研究

- - CSDN博客研发管理推荐文章
      在网络编程中,经常需要在服务器里开一个端口,这里有一个问题,这个端口是开到哪个IP上面了,因为对于服务器来说经常是不止一个IP的,一个是127.0.0.1,一个是内网IP,比如192.168.1.3,一个是外网IP,比如211.19.56.39. 对于开发着来说,经常会忽略绑定到具体某个IP上面,类似于下面的代码.

公共 DNS 服务器 IP 地址 及各省DNS服务器

- - 企业架构 - ITeye博客
公共 DNS 服务器 IP 地址. 名称 DNS 服务器 IP 地址. 全国各地电信 DNS 服务器 IP 地址. 名称 DNS 服务器 IP 地址. 全国各地联通 DNS 服务器 IP 地址. 名称 DNS 服务器 IP 地址. Apple TV DNS 服务器 IP 地址. 名称 DNS 服务器 IP 地址.

全国DNS服务器IP地址【电信、网通、铁通】

- 勇 - HaoRuan.net
今天好软网给大家带来的是全国DNS服务器IP地址【电信、网通、铁通】,相信很多网友都不知道自己当地的DNS服务器是多少,不同的dns解析可以得到不同的访问权限是速度,希望给大家带来更多的互联网体验. 继续阅读《全国DNS服务器IP地址【电信、网通、铁通】 》的全文内容.... 分类: 网络科技 | Tags: DNS   服务器   | 添加评论(9).

Linux 下查看局域网内所有主机IP和MAC

- - 操作系统 - ITeye博客
用nmap对局域网扫描一遍,然后查看arp缓存表就可以知道局域内ip对应的mac了. nmap比较强大也可以直接扫描mac地址和端口. 执行扫描之后就可以 cat /proc/net/arp查看arp缓存表了. 进行ping扫描,打印出对扫描做出响应的主机:  . 仅列出指定网络上的每台主机,不发送任何报文到目标主机: .

tcp/ip调优

- Lucseeker - 在路上
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;.

获取 WAN IP

- 狗尾草 - LinuxTOY
如果你在 router 或者 firewall 后面,你直接查询 interface ,拿到可能不是 WAN 的 IP. 很久很久以前的一个版本,把它们贴到 .bashrc (Bash 专用) 或者 .profile (非 Bash 专用)里面去. .profile 即可生效,输入 myip 就能拿到 WAN IP.

TCP/IP分享——链路层

- Goingmm - 弯曲评论
在张国荣自尽8周年纪念日,也就是愚人节的前几十分钟,终于把第二章弄完了. 首席似乎不是特别有空,我就斗胆在这里自己发了,从前面2期的反响来看,相当热烈,我也是摆出一副要杀要剐,悉听尊便的架势,这可能是受最近流行霸气外露的影响,批评几句又伤不了皮毛,也影响不了我的工作和正常生活,只要给大家带来快乐,我就很开心,似乎历史上很多想法都是在争吵中诞生的.

一些IP查询网站

- 19GHz - iGFW
一些境内服务器的IP查询网站:. 一些境外服务器的IP查询网站:. https://whoer.net/ (支持https). 各网站查询到的IP归属地可能有差异,以apnic.net为准. 本文原始地址:http://igfw.tk/archives/5611.

TCP/IP重传超时--RTO

- dennis - 一个故事@MySQL DBA
Shared by 子非鱼 安知余(褚霸). 概述:本文讨论主机在发送一个TCP数据包后,如果迟迟没有收到ACK,主机多久后会重传这个数据包. 主机从发出数据包到第一次TCP重传开始,RFC中这段时间间隔称为retransmission timeout,缩写做RTO. 本文会先看看RFC中如何定义RTO,然后看看Linux中如何实现.

IP地址库介绍

- Wolf - 淘宝核心系统团队博客
在CDN系统中,IP地址库在流量调度、网络服务质量监测等方面起到重要的作用,本文主要介绍了IP地址库的功能、内容以及IP地址库的生成和评价方法. 所谓IP地址库,指的是提供了IP地址(段)同地理、ISP、结构等信息映射关系的一组数据. IP地址库应用的场合较为广泛,下面举几个常见的例子:. (1)根据客户的IP地址确定客户来源,为后期的客户行为分析提供基础,例如需要统计学生群体的访问特点,这时我们就是通过分析来自教育网的IP地址的那些请求得到的.