IPv 背景介绍
目前我们使用的是第二代互联网 IPv 技术 它的最大问题是网络地址资源有限 从理论上讲 可以编址 万个网络 亿台主机 但采用 A B C 三类编址方式后 可用的网络地址和主机地址的数目大打折扣 以至目前的 IP 地址近乎枯竭 网络地址不足 严重地制约了全球互联网的应用和发展
一方面是地址资源数量的限制 另一方面是随着电子技术及网络技术的发展 计算机网络将进入人们的日常生活 可能身边的每一样东西都需要连入全球因特网 在这种网络空间匮乏的环境下 IPv 应运而生 它的产生不但解决了网络地址资源数量的问题 同时也为除电脑外的设备连入互联网在数量限制上扫清了障碍
如果说 IPv 实现的只是人机对话 那么 IPv 则扩展到任意事物之间的对话 它不仅可以为人类服务 还将服务于众多硬件设备 如家用电器 传感器 远程照相机 汽车等 它将是无时不在 无处不在的深入社会每个角落的真正的宽带网 它所带来的经济效益也将非常巨大
当然 IPv 并非十全十美 一劳永逸 不可能解决所有问题 IPv 只能在发展中不断完善 也不可能在一夜之间发生 过渡需要时间和成本 但从长远看 IPv 有利于互联网的持续和长久发展 目前 国际互联网组织已经决定成立两个专门工作组 制定相应的国际标准
Java 对 IPv 的支持
随着 IPv 越来越受到业界的重视 Java 从 版开始支持 Linux 和 Solaris 平台上的 IPv 版起又加入了 Windows 平台上的支持 相对于 C++ Java 很好得封装了 IPv 和 IPv 的变化部分 遗留代码都可以原生支持 IPv 而不用随底层具体实现的变化而变化
那么 Java 是如何来支持 IPv 的呢 Java 网络栈会优先检查底层系统是否支持 IPv 以及采用的何种 IP 栈系统 如果是双栈系统 那它直接创建一个 IPv 套接字(如图 )
图 双栈结构
对于分隔栈系统 Java 则创建 IPv /v 两个套接字(如图 ) 如果是 TCP 客户端程序 一旦其中某个套接字连接成功 另一个套接字就会被关闭 这个套接字连接使用的 IP 协议类型也就此被固定下来 如果是 TCP 服务器端程序 因为无法预期客户端使用的 IP 协议 所以 IPv /v 两个套接字会被一直保留 对于 UDP 应用程序 无论是客户端还是服务器端程序 两个套接字都会保留来完成通信
图 分隔栈结构
如何验证 IPv 地址
IPv 地址表示
从 IPv 到 IPv 最显著的变化就是网络地址的长度 IPv 地址为 位长度 一般采用 个十六进制数 但通常写做 组每组 个十六进制的形式 例如
: db : a : d : : a e: : 是一个合法的 IPv 地址 如果四个数字都是零 则可以被省略
: db : a : : : a e: : 等同于 : db : a :: : a e: :
遵从这些规则 如果因为省略而出现了两个以上的冒号的话 可以压缩为一个 但这种零压缩在地址中只能出现一次 因此
: DB : : : : : : ab
: DB : : : :: : ab
: DB : : : : : : ab
: DB : :: : : ab
: DB :: : ab
都是合法的地址 并且他们是等价的 但 :: de::cade 是非法的 (因为这样会使得搞不清楚每个压缩中有几个全零的分组) 同时前导的零可以省略 因此 : DB : de:: e 等于 :DB : de::e
IPv 地址校验
IPv 地址可以很容易的转化为 IPv 格式 举例来说 如果 IPv 的一个地址为 (十六进制为 x B B ) 它可以被转化为 : : : : : : B: B 或者 : B: B 同时 还可以使用混合符号(IPv patible address) 则地址可以为 :
在 IPv 的环境下开发 Java 应用 或者移植已有的 IPv 环境下开发的 Java 应用到 IPv 环境中来 对于 IPv 网络地址的验证是必须的步骤 尤其是对那些提供了 UI(用户接口)的 Java 应用
所幸的是 从 Java 开始 Sun 就增加了对 IPv 网络地址校验的 Java 支持 程序员可以通过简单地调用方法 util IPAddressUtil isIPv LiteralAddress() 来验证一个 String 类型的输入是否是一个合法的 IPv 网络地址
为了更深入一步地了解 IPv 的网络地址规范 及其验证算法 笔者参阅了一些材料 包括上文所述的方法 util IPAddressUtil isIPv LiteralAddress() 的源代码 以及目前网络上流传的一些 IPv 网络地址的正则表达式 发现
由于 IPv 协议所允许的网络地址格式较多 规范较宽松(例如零压缩地址 IPv 映射地址等) 所以导致了 IPv 网络地址的格式变化很大
Java 对于 IPv 网络地址的验证是通过对输入字符的循环匹配做到的 并没有采取正则表达式的做法 其匹配过程中还依赖于其它的 Java 方法
目前网络上流传的 IPv 网络地址验证的正则表达式通常都只能涵盖部分地址格式 而且表达式冗长难读 非常不易于理解
基于通用性考虑 以及为了使验证方法尽量简单易读 笔者尝试将 IPv 网络地址的格式简单分类以后 使用多个正则表达式进行验证
这种做法兼顾了通用性(基于正则表达式 所以方便用各种不同的编程语言进行实现) 以及易读性(每个独立的正则表达式相对简短);并且根据测试 支持目前所有的 IPv 网络地址格式类型 尚未发现例外
以下是笔者用 Java 编写的对于 IPv 网络地址的验证方法 此算法可被简单地用其它编程语言仿照重写
清单 验证地址
//IPv address validator matches these IPv formats //::ffff: : | : db : a : d : : a e: : //| :: a e: : : | : db : a : d : : a e: //| : db :: a e: | :: | ffff:: //And such addresses are invalid //:: a e: : : | :idb :: : | :: a //| : :: public static boolean isIPV Format(String ip) { ip = ip trim(); //in many cases such as URLs IPv addresses are wrapped by [] if(ip substring( ) equals( [ ) && ip substring(ip length() ) equals( ] )) ip = ip substring( ip length() ); return ( < pile( : ) split(ip) length) //a valid IPv address should contains no less than //and no more than : as separators && (pile( : ) split(ip) length <= ) //the address can be pressed but :: can appear only once && (pile( :: ) split(ip) length <= ) //if a pressed address && (pile( :: ) split(ip) length == ) //if starts with :: – leading zeros are pressed (((ip substring( ) equals( :: )) Pattern matches( ^::([\\da f]{ }(:)){ }(([\\da f]{ }(:)[\\da f]{ }) |([\\da f]{ })|((\\d{ } ){ }\\d{ })) ip) : Pattern matches( ^([\\da f]{ }(:|::)){ } (([\\da f]{ }(:|::)[\\da f]{ })|([\\da f]{ }) |((\\d{ } ){ }\\d{ })) ip))) //if ends with :: ending zeros are pressed : ((ip substring(ip length() ) equals( :: )) Pattern matches( ^([\\da f]{ }(:|::)){ } ip) : Pattern matches( ^([\\da f]{ }:){ }(([\\da f]{ } :[\\da f]{ })|((\\d{ } ){ }\\d{ })) ip)); }}
如何正规化 IPv 地址
在网络程序开发中 经常使用 IP 地址来标识一个主机 例如记录终端用户的访问记录等 由于 IPv 具有有零压缩地址等多种表示形式 因此直接使用 IPv 地址作为标示符 可能会带来一些问题 为了避免这些问题 在使用 IPv 地址之前 有必要将其正规化 除了通过我们熟知的正则表达式 笔者在开发过程中发现使用一个简单的 Java API 也可以达到相同的效果
清单 正规化地址
InetAddress inetAddr = InetAddress getByName(ipAddr); ipAddr = inetAddr getHostAddress(); System out println(ipAddr);
InetAddress getByName(String) 方法接受的参数既可以是一个主机名 也可以是一个 IP 地址字符串 我们输入任一信息的合法 IPv 地址 再通过 getHostAddress() 方法取出主机 IP 时 地址字符串 ipAddr 已经被转换为完整形式 例如输入 : b:e aa:: b:e aa 上述代码执行过后 零压缩部分将被还原 ipAddr 变为 : b:e aa: : : : b:e aa
如何获取本机 IPv 地址
有时为了能够注册 listener 开发人员需要使用本机的 IPv 地址 这一地址不能简单得通过 InetAddress getLocalhost() 获得 因为这样有可能获得诸如 : : : : : : : 这样的特殊地址 使用这样的地址 其他服务器将无法把通知发送到本机上 因此必须先进行过滤 选出确实可用的地址 以下代码实现了这一功能 思路是遍历网络接口的各个地址 直至找到符合要求的地址
清单 获取本机 IP 地址
public static String getLocalIPv Address() throws IOException { InetAddress inetAddress = null; Enumeration neorkInterfaces = NeorkInterface getNeorkInterfaces(); outer: while (neorkInterfaces hasMoreElements()) { Enumeration inetAds = neorkInterfaces nextElement() getInetAddresses(); while (inetAds hasMoreElements()) { inetAddress = inetAds nextElement(); //Check if it s ipv address and reserved address if (inetAddress instanceof Inet Address && !isReservedAddr(inetAddress)) { break outer; } } } String ipAddr = inetAddress getHostAddress(); // Filter neork card No int index = ipAddr indexOf( % ); if (index > ) { ipAddr = ipAddr substring( index); } return ipAddr; } / Check if it s local address or link local address or loopbackaddress @param ip address @return result / private static boolean isReservedAddr(InetAddress inetAddr) { if (inetAddr isAnyLocalAddress() || inetAddr isLinkLocalAddress() || inetAddr isLoopbackAddress()) { return true; } return false; }
为了支持 IPv Java 中增加了两个 InetAddress 的子类 Inet Address 和 Inet Address 一般情况下这两个子类并不会被使用到 但是当我们需要分别处理不同的 IP 协议时就非常有用 在这我们根据 Inet Address 来筛选地址
isReservedAddr() 方法过滤了本机特殊 IP 地址 包括 LocalAddress LinkLocalAddress 和 LoopbackAddress 读者可根据自己的需要修改过滤标准
另一个需要注意的地方是 在 windows 平台上 取得的 IPv 地址后面可能跟了一个百分号加数字 这里的数字是本机网络适配器的编号 这个后缀并不是 IPv 标准地址的一部分 可以去除
IPv /IPv 双环境下 网络的选择和测试
我们先看一下笔者所在的 IPv /IPv 开发测试环境及其配置方法
笔者所处的 IPv /IPv 双环境是一个典型的 to 双栈网络 其中存在着一个 IPv 到 IPv 的映射机制 即任意一个 IPv 地址 : a: f a: :a:b:c:d 在路由时会被默认映射为 IPv 地址 a b c d 所以路由表只有一套
在此环境内 IPv 地址与 IPv 地址的一一对应是人工保证的 如果一台客户机使用不匹配的 IPv 和 IPv 双地址 或者同时使用 DHCPv 和 DHCPv (可能会导致 IPv 地址和 IPv 地址不匹配) 会导致 IPv 的路由寻址失败
正因为如此 为了配置双地址环境 我们一般使用 DHCPv 来自动获取 IPv 地址 然后人工配置相对应的 IPv 地址
Windows 系统
Windows 及以下 不支持 IPv
Windows 和 Windows XP 使用 Windows 自带的 netsh 命令行方式添加 IPv 地址以及 DNS 例如 C:\>netsh interface ipv add address Local Area Connection : a: f a: : : : : 和 C:\>netsh interface ipv add dns Local Area Connection : a: f a: : ::
Windows 和 Windows Vista 既可以使用 Windows 网络属性页面进行配置 也可以使用类似 Windows 和 Windows XP 的 netsh 命令行来配置
Linux 系统 (以下是 IPv 的临时配置方法 即不修改配置文件 计算机重启后配置失效)
Redhat Linux 最简单的方法是使用 ifconfig 命令行添加 IPv 地址 例如 ifconfig eth inet add : a: f a: : : : : /
SUSE Linux 同上
从实践上讲 由于 Java 的面向对象特性 以及 包对于 IP 地址的良好封装 从而使得将 Java 应用从 IPv 环境移植到 IPv /IPv 双环境 或者纯 IPv 环境变得异常简单 通常我们需要做的仅是检查代码并移除明码编写的 IPv 地址 用主机名来替代则可
除此以外 对于一些特殊的需求 Java 还提供了 InetAddress 的两个扩展类以供使用 Inet Address 和 Inet Address 其中封装了对于 IPv 和 IPv 的特殊属性和行为 然而由于 Java 的多态特性 使得程序员一般只需要使用父类 InetAddress Java 虚拟机可以根据所封装的 IP 地址类型的不同 在运行时选择正确的行为逻辑 所以在多数情况下 程序员并不需要精确控制所使用的类型及其行为 一切交给 Java 虚拟机即可
具体的新增类型及其新增方法 请具体参阅 Sun 公司的 JavaDoc
另外 在 IPv /IPv 双环境中 对于使用 Java 开发的网络应用 比较值得注意的是以下两个 IPv 相关的 Java 虚拟机系统属性
preferIPv Stack=<true|false> preferIPv Addresses=<true|false>
preferIPv Stack(默认 false)表示如果存在 IPv 和 IPv 双栈 Java 程序是否优先使用 IPv 套接字 默认值是优先使用 IPv 套接字 因为 IPv 套接字可以与对应的 IPv 或 IPv 主机进行对话;相反如果优先使用 IPv 则只不能与 IPv 主机进行通信
preferIPv Addresses(默认 false)表示在查询本地或远端 IP 地址时 如果存在 IPv 和 IPv 双地址 Java 程序是否优先返回 IPv 地址 Java 默认返回 IPv 地址主要是为了向后兼容 以支持旧有的 IPv 验证逻辑 以及旧有的仅支持 IPv 地址的服务
总结
lishixinzhi/Article/program/Java/hx/201311/26767我建议检查3个地方:
1、请检查hypixel服务器地址是否正确(百度知道发不了地址(⊙o⊙))
2、检查是否连接至网络,如果无效请重启MC
3、检查你是否是正版MC(需前往minecraft官方网站花费165元购买)一、网络设置的问题
这种原因比较多出现在需要手动指定IP、网关、DNS服务器联网方式下,及使用代理服务器上网的。仔细检查计算机的网络设置。
二、DNS服务器的问题
当IE无法浏览网页时,可先尝试用IP地址来访问,如果可以访问,那么应该是DNS的问题,造成DNS的问题可能是连网时获取DNS出错或DNS服务器本身问题,这时你可以手动指定DNS服务(地址可以是你当地ISP提供的DNS服务器地址,也可以用其它地方可正常使用DNS服务器地址。)在网络的属性里进行,(控制面板—网络和拔号连接—本地连接—右键属性—TCP/IP协议—属性—使用下面的DNS服务器地址)。不同的ISP有不同的DNS地址。有时候则是路由器或网卡的问题,无法与ISP的DNS服务连接,这种情况的话,可把路由器关一会再开,或者重新设置路由器。
还有一种可能,是本地DNS缓存出现了问题。为了提高网站访问速度,系统会自动将已经访问过并获取IP地址的网站存入本地的DNS缓存里,一旦再对这个网站进行访问,则不再通过DNS服务器而直接从本地DNS缓存取出该网站的IP地址进行访问。所以,如果本地DNS缓存出现了问题,会导致网站无法访问。可以在“运行”中执行ipconfig /flushdns来重建本地DNS缓存。
三、IE浏览器本身的问题
当IE浏览器本身出现故障时,自然会影响到浏览了;或者IE被恶意修改破坏也会导致无法浏览网页。这时可以尝试用“黄山IE修复专家”来修复(建议到安全模式下修复),或者重新IE(如重装IE遇到无法重新的问题,可参考:附一解决无法重装IE)
四、网络防火墙的问题
如果网络防火墙设置不当,如安全等级过高、不小心把IE放进了阻止访问列表、错误的防火墙策略等,可尝试检查策略、降低防火墙安全等级或直接关掉试试是否恢复正常。
五、网络协议和网卡驱动的问题
IE无法浏览,有可能是网络协议(特别是TCP/IP协议)或网卡驱动损坏导致,可尝试重新网卡驱动和网络协议。
六、HOSTS文件的问题
HOSTS文件被修改,也会导致浏览的不正常,解决方法当然是清空HOSTS文件里的内容。
七、系统文件的问题
当与IE有关的系统文件被更换或损坏时,会影响到IE正常的使用,这时可使用SFC命令修复一下,WIN98系统可在“运行”中执行SFC,然后执行扫描;WIN2000/XP/2003则在“运行”中执行sfc /scannow尝试修复。
其中当只有IE无法浏览网页,而QQ可以上时,则往往由于winsockdll、wsock32dll或wsockvxd(VXD只在WIN9X系统下存在)等文件损坏或丢失造成,Winsock是构成TCP/IP协议的重要组成部分,一般要重装TCP/IP协议。但xp开始集成TCP/IP协议,所以不能像98那样简单卸载后重装,可以使用 netsh 命令重置 TCP/IP协议,使其恢复到初次安装 *** 作系统时的状态。具体 *** 作如下:
点击“开始 运行”,在运行对话框中输入“CMD”命令,d出命令提示符窗口,接着输入“netsh int ip reset c:\resetlogtxt”命令后会回车即可,其中“resetlogtxt”文件是用来记录命令执行结果的日志文件,该参数选项必须指定,这里指定的日志文件的完整路径是“c:\resetlogtxt”。执行此命令后的结果与删除并重新安装 TCP/IP 协议的效果相同。
小提示:netsh命令是一个基于命令行的脚本编写工具,你可以使用此命令配置和监视Windows 系统,此外它还提供了交互式网络外壳程序接口,netsh命令的使用格式请参看帮助文件(在令提示符窗口中输入“netsh/”即可)。
第二个解决方法是修复以上文件,WIN9X使用SFC重新提取以上文件,WIN2000/XP/2003使用sfc /scannow命令修复文件,当用sfc /scannow无法修复时,可试试网上发布的专门针对这个问题的修复工具WinSockFix,可以在网上搜索下载。
八、杀毒软件的实时监控问题
这倒不是经常见,但有时的确跟实时监控有关,因为现在杀毒软件的实时监控都添加了对网页内容的监控。举一个实例:KV2005就会在个别的机子上会导致IE无法浏览网页(不少朋友遇到过),其具体表现是只要打开网页监控,一开机上网大约20来分钟后,IE就会无法浏览网页了,这时如果把KV2005的网页监控关掉,就一切恢复正常;经过彻底地重装KV2005也无法解决。虽然并不是安装KV2005的每台机子都会出现这种问题,毕竟每台机子的系统有差异,安装的程序也不一样。但如果出现IE无法浏览网页时,也要注意检查一下杀毒软件。
九、感染了病毒所致
这种情况往往表现在打开IE时,在IE界面的左下框里提示:正在打开网页,但老半天没响应。在任务管理器里查看进程,(进入方法,把鼠标放在任务栏上,按右键—任务管理器—进程)看看CPU的占用率如何,如果是100%,可以肯定,是感染了病毒,这时你想运行其他程序简直就是受罪。这就要查查是哪个进程贪婪地占用了CPU资源.找到后,最好把名称记录下来,然后点击结束,如果不能结束,则要启动到安全模式下把该东东删除,还要进入注册表里,(方法:开始—运行,输入regedit)在注册表对话框里,点编辑—查找,输入那个程序名,找到后,点鼠标右键删除,然后再进行几次的搜索,往往能彻底删除干净。
有很多的病毒,杀毒软件无能为力时,唯一的方法就是手动删除。
十一、无法打开二级链接
还有一种现象也需特别留意:就是能打开网站的首页,但不能打开二级链接,如果是这样,处理的方法是重新注册如下的DLL文件:
在开始—运行里输入:
regsvr32 Shdocvwdll
regsvr32 Shell32dll(注意这个命令,先不用输)
regsvr32 Oleaut32dll
regsvr32 Actxprxydll
regsvr32 Mshtmldll
regsvr32 Urlmondll
regsvr32 Msjavadll
regsvr32 Browseuidll
注意:每输入一条,按回车。第二个命令可以先不用输,输完这些命令后重新启动windows,如果发现无效,再重新输入一遍,这次输入第二个命令。影响性能问题也有网络,网络问题时不时的都会发生,如路由器、交换机和DNS服务器失败。更常见的是在一个高度分散的IT环境中定期或间歇性延迟。
间歇或定期的延迟会触发一些重要的性能问题,以不同的方式影响JavaEE应用程序。
因为大量的fetch迭代(网络传入和传出),涉及大数据集的数据查询问题的应用会非常受网络延迟的影响
应用程序在处理外部系统大数据负载(例如XML数据)时也会很受网络延迟的影响,会在发送和接收响应时产生巨大的响应间隔。
JavaEE容器复制过程(集群)也会受到影响,并且会让故障转移功能(如多播或单播数据包损失)处于风险中。
JDBC行数据“预取”、XML数据压缩和数据缓存可以减少网络延迟。在设计一个新的网络拓扑时,应该仔细检查这种网络延迟问题。
web服务器,用来提供网站,也就是我们现在上网看的网站都是web服务器提供的。dns服务器,提供网络dns,域名转换。ftp服务器,和web类似,它提供的是文件服务。数据库服务器,主要装数据资料的,这个没什么好说的。dhcp服务器,提供动态ip转换。主要就这些了。
①Apache
Apache是世界使用排名的Web服务器软件。它几乎可以运行在所有的计算机平台上。由于Apache是开源免费的,因此有很多人参与到新功能的开发设计,不断对其进行完善。 Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。
②IIS
IIS(Internet信息服务)英文Internet Information Server的缩写。它是微软公司主推的服务器。IIS的特点具有:安全性,强大,灵活。
③Nginx
Nginx不仅是一个小巧且高效的>
④Tomcat
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
⑤Lig>
Lig>
⑥Zeus
Zeus是一个运行于Unix下的非常的Web 服务器,据说性能超过Apache,是效率的Web 服务器之一。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)