在解释NAT之前不妨介绍与其相关的VPN:这两者都是为了解决本地网相关的问题提出的技术。
首先我们知道,ABC类地址都有相当一部分被留给了本地自用。这部分地址,可以被每个公司用来随意划分,以进行公司内部组网的设计;而如果每个公司都购买一块很大的IP(比如,一个C类地址),这是很不划算的;再加上现在互联网已经不再安排新的IPv4地址了,本地自用地址的转化俨然成了一个亟待解决的问题。
假如,一个公司的两个部门位于地理上比较遥远的位置,但是两个公司想要虚拟地共享一个局域网,这个时候就要用到VPN技术。由于这部分内容不在大纲中,我们只需要知道,VPN技术采用了IP in IP的隧道思想,将局域网内部的IP报文包装在VPN协议的IP报文中,通过一个实际的链路(当然,在VPN协议和两个部门看来是一条逻辑链路,两个部门当然什么都不知道,以为它们处于了同一个局域网中),实现了逻辑上的局域网互联。当前的远程办公技术,即,公司员工在家中登陆VPN的账号和口令后获取一个公司的内网IP并进行那些只能在公司接入网中才能进行的操作,就是VPN技术的一个目前很大的应用。
在有了VPN的基础上解释NAT就很简单了。NAT实际上解决的就是一个内网接入到互联网的IP分配问题。NAT分为三种:
这种方式中,n个路由条目最多可以保证n台计算机同时接入互联网。更多的接入需求需要路由器进行轮流指派——毕竟,两台计算机不可能(在这个多对多的语境下)同时共享一个IP地址访问互联网。
多对多方式的弊端,如我们刚才讨论的,它不能满足大量接入主机的同时访问需求。这时一对多的协议出现了:它将接入的许多主机的数据包封装到不同的IP端口中,也即,每一台主机对应到路由器的一个IP端口中,每个主机就相当于是路由器的一个应用进程了。
这种方式,让互联网的本就耦合(为什么耦合,我们下一节叙述)的层次结构更加模糊了。
在静态NAT中,路由器指定某一个公网IP和内网中的某一个IP固定配对。这样,外网就可以通过这个IP地址唯一地访问内网计算机了。
软件定义网络是近些年新兴的一个网络概念。SDN的一个成功的例子是Google的B4网,这个网络是谷歌的内容分发网络,可想而知其流量应该是巨大的。通过软件定义网络的改造,结果表明,B4网络的稳定性、流量控制都是极为成功的。
SDN网络致力于对网络进行以下三种改造:解耦、抽象、可编程。我们在解释这三个词语前现在看一下SDN网络的结构。
在一个SDN网络中,网络被分为了大体的两部分:控制层面和数据层面。
数据层面,在SDN网络中只包括路由器和它的转发功能。
与数据层面透过OpenFlow协议相连接,也即通过OpenFlow控制“转发表”的是,控制层面的控制逻辑。这部分连接,被称作南桥。
而控制层面的控制逻辑,被设计为一个个可编程的API接口。用户可以接入各种排序函数等等,来对这些路由数据进行操作。这些接口叫做北桥。
下一个问题就是,这些路由数据是什么?在OpenFlow协议中,路由数据被组织成所谓"流"的结构。这里的流用来代指那些原地址、目的地址都相同的一簇数据报。
一个流的例子是,流被分为三部分:报头、计数器和下一跳。
报头整合了过去网络各种协议的首部。
计数器用于负载均衡,它会根据某个流向的网络情况动态地从不同端口分发数据报。
下一跳不再是传统的IP地址,而是它的数据端口号。
需要指出以下几点:SDN不等同于OpenFlow,SDN更像是一个体系结构,它开始把计算机网络过去的、软件和硬件强相关的状况转换成像是计算机目前体系结构的开源的、共享的软件生态,互联网不再是那些传统厂家的一言堂。而OpenFlow则是SDN实现过程中的一个协议,就好比TCP/IP架构是目前计算机网络的一个架构而已,如果你未来的公司想要更好的保密性,那么完全可能让你的公司运行在一个异构网络上,但是想要接入互联网就需要功能更强大的路由器了。
再解释一下什么叫解耦,可编程和抽象相信读者已经不陌生了,就是把以前的各种功能抽象成一个个可编程的API接口,如同Intel/Linux这些计算机体系结构中推波助澜的厂家/个体所做的那样。
而解耦,就是解除耦合,想要尽可能地改造当前计算机网络中的耦合性。在当前的互联网中,控制层面和数据层面是搅在一团、“耦合在一起”的。这种强耦合性、低模块化的做法,从小的层面来说不利于开发人员的代码复用、从大的层面来说为互联网的维护,甚至于发展都设置了障碍。
移动IP指的是移动接入设备在空间中移动的过程中如何保持TCP/IP连接的问题。
先介绍几个概念。我们设,一个移动的接入端A,在它在郊外移动的过程中,第一次有效地接入的互联网,叫做永久代理站。在这个接入网中,移动端获得了一个有效的IP地址,我们称作永久IP地址;这个接入网的网关我们设为默认路由。
下面这个接入端跑到了另外一个网络中。我们设这个网络叫做代理网络,这个网络的默认网关叫做代理路由。
移动IP讨论的是其他设备将如何去寻找这个已经离开的移动设备。为了简化叙述,我们把移动的设备称作A,固定的设备称作B。
最初版本的移动IP是这样的定义的,当设备B想要发起和A的数据通信时:
其中的通信IP是A在抵达这个代理网络后和这个网络的代理路由通信后、代理路由和永久路由进行交涉后获得的IP地址。
后来的移动IP地址为了解决移动IP地址引发的在网络中转发跳数太多的问题,出现了通信者代理的技术,也就是,由默认路由进行的转发交给了通信代理执行。
我们通过以下的例子解释在通信者代理技术出现后,转发过程的改变,以及多跳转发是如何实现的。
对于之前定义的名词这里进行一些改动:
默认路由和永久地址仍不改变;
第一个接入网络的路由器设为锚(anchor)外地代理
由锚接入网络转入的下一个网络我们设为P网络。
和A进行通信的通信者依然是B,但是此时进行通信的操作的是通信者代理了。
在使用了通信者代理服务之后,只不过是把默认路由的转发移交给了通信者代理进行执行;后面的每一跳转发还是依旧。
最后我们指出,移动IP技术必须增加以下部分:
分别对应两个部分:移动IP的来去登记、数据报文的结构定义以及转发规则。
移动IP的实现是在过于复杂。并且上述讨论假定了移动设备A含有一个永久地址。但是实践中这个问题依然没有得到解决。
下一个问题是移动IP对于上层协议的影响。
TCP的拥塞控制并不知道是网络拥塞了、还是数据链路信噪比高了、甚至是移动站更换网络了。这个时候减少拥塞窗口对于整个网络来说没有什么意义。以下三种实践中的方法有利于改善情况:
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!
我正在尝试使用Ruby中的SeleniumWebDriver2.4模拟鼠标移动如果我运行测试,是否应该看到鼠标在我的屏幕上移动?我很困惑。我试过很多不同的方法示例代码:require'selenium-webdriver'driver=Selenium::WebDriver.for:firefoxdriver.navigate.to'http://www.google.com'element=driver.find_element(:id,'gbqfba')那我试过了driver.action.move_to(element).performdriver.mouse.move_to(e
Nginx在生产中的重要性通常基于它为慢速客户端提供服务的能力;在RESTfulAPI的设置中,它似乎是生产堆栈的一个不必要的层,尤其是Puma(不像广泛使用的unicorn可以处理nginx工作)。Pumacanallowmultipleslowclientstoconnectwithoutrequiringaworkertobeblockedontherequesttransaction.Becauseofthis,Pumahandlesslowclientsgracefully.HerokurecommendsPumaforuseinscenarioswhereyouexpect
一、离线方式1.1.下载ip2region.xdbGitHub项目地址:https://github.com/lionsoul2014/ip2region我们首先需要下载一个ip2region.xdb的文件下载地址:https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb打开后点击如图的Download图标即可下载。下载完成后,需要将该文件放到我们的项目中。ps:我是直接放到服务器的,因为放在项目的资源文件夹下,当我们调试的时候使用JavaSpring自带的工具去获取该文件的绝对路径时,没有任何问题,能够正
1、报文格式前几篇总结过较多网络层的知识,ARP,ip地址、子网掩码等等。这次总结一下IP数据报的报文格式IP数据报的格式能够说明IP协议都具有什么功能。在TCP/IP的标准中,各种数据格式常常以32位(4字节)为单位来描述的。wireshark中IP数据报文呈现一个IP数据报文由首部和数据两部分组成。首部的前一部分是固定长度,共20字节。是所有IP数据报文必须具有的。在首部的固定部分的后面是一些可选字段,其长度可变。2、首部个字段意义 1、版本占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。版本号为6(即IPv6) 2、首部
在控制台中,您可以像这样打印"\b"来删除光标左侧的字符(退格键)print"thelastcharisgoingtobeerased\b"#thelastcharisgoingtobeerased如何只向左移动一个位置而不是删除(向左箭头)? 最佳答案 这取决于终端类型和连接,但通常可以假定ANSI光标移动,因此光标向左是ESC+'['+'D':print"Thecursorshouldbebetweenthearrows:->参见http://ascii-table.com/ansi-escape-sequences.php获取