具体实施方式
下面结合附图和实施例对本发明的实施作进一步说明。
实施例1:假定有个内网挂接在公网上,其网关地址为202.10.32.1,网关中带有HA模块,因而具有HA的功能。移动设备MN本是该内网中的一个节点,其内网地址为192.168.32.8。现在,MN因旅行来到了无线网中基站a1的覆盖范围中。基站a1就像内网(intranet)中的二层交换机,它的上面有个网关A。网关A,连同若干相当于交换机的基站,以及这些基站覆盖下的诸多移动节点,就构成了一个无线网,结构上等同于一个通过网关A挂接在公网上的内网。假定网关A的公网地址为101.3.22.8。其余的网关B、C、D等等也是一样。这里所谓“基站”并不非得是GPRS或CDMA的基站,也可以是802.11的无线AP(“访问点”),物理层的实现不在本发明的考虑范围内。参见图1所示,其中:
○表示路由器、网关、或固定节点。
●表示基站或无线AP,虚线表示其覆盖范围。
■表示具有无线上网功能的移动节点。
现在MN开启了电源。
首先MN需要向A申请一个当地的内网地址,具体可以通过DHCP解决,这也不在本发明的考虑范围内。假定由DHCP分配的地址为10.3.4.15。
接着,MN应向其“家乡代理(Home Agent)”HA、即网关202.10.32.1登记报告行踪。MN发送的信息中含有其当前在当地的内网地址,以及能表示其身份的信息、例如在“家乡”时的内网地址或MAC地址,还应提供一些用于认证的信息。由于网关A的NAT处理,HA实际上还能知道MN当前所在的子网,因为当相应的IP包离开网关A时其源地址就变成了该网关的公网地址101.3.22.8。只要MN出门在外,就应该每过一段时间或每当改变地址时就向家乡代理报告行踪。不过,这样做是出于管理目的,是为了实施认证、授权、及计费,而与下行流量的路由无关。
然后MN开始要访问地址为123.4.5.36的网站CN,为此MN需要与CN建立起一个TCP连接。每当MN需要穿越公网与某个目标建立TCP连接时,首先需要向HA提出申请,要求HA(实际上是其NAT模块)为其分配一个“家乡”源端口号。
有了由HA分配的源端口号以后,MN就可以发起与CN的TCP连接了。根据TCP规程,MN首先应向CN发送一个SYN报文。按原有的规程,MN应将123.4.5.36作为目标地址,以10.3.4.15为源地址。在报文经过网关A时,其NAT模块将把源地址10.3.4.15更换成网关本身的地址101.3.22.8,并将由MN生成的源端口号更换成由NAT模块分配的端口号,这就是普通的NAT转换。但是,如果仅仅是这样,则所建立的TCP连接是固定以101.3.22.8、即无线网A为一端的,当MN移动到B时这个TCP连接就会断开。现在,按照本发明的方法,MN把HA的地址202.10.32.1和由HA分配的源端口号作为“家乡地址”和“家乡端口号”可选项附加在SYN报文的TCP报头中,而网关A并不会触及这些可选项。这样,只要CN也按本发明的方法处理,所建立的TCP连接在逻辑上就是以MN的家乡网为一端了。不管MN移动到哪一个网中,其家乡网总是固定的,所以建立起来的TCP连接不会因移动而断开。不过,这一对{地址,端口号}只是用来建立和标识TCP连接的,由CN发回MN的流量仍按常规(用上行的源地址和源端口号作为下行的目标地址和目标端口号)发回无线网A的网关,再由网关逆向NAT并转发给MN。也就是说,下行的流量是直接路由到MN、而不是经由其家乡代理HA中转的。
这里之所以需要由家乡代理HA分配一个端口号是为了防止发生冲突。要是光从建立和标识TCP连接的角度看,由MN自己指定一个源端口号SP也未尝不可。但是那样一来TCP连接的一端就是{MN的家乡地址,SP};如果此后恰好从MN的家乡网络也来了一个建立TCP连接的请求,并且源端口号又恰好是SP,那就有冲突了。而由HA分配源端口号就排除了这样的可能。实际上这是在模拟HA的NAT操作,因为如果此时MN还在家乡网中,并且也是要求建立与CN的TCP连接,那么MN将使用其内网地址为源地址,并产生一个端口号,经网关HA的NAT操作就变换成了HA的公网地址和由HA分配的端口号。所以,也可以把MN所建立的TCP连接看作是由其在家乡网中的逻辑镜像所建立的虚拟TCP连接,但是被映射、或者说重定向到了位于外地网中的物理的MN身上。
如果CN不支持本发明的方法,那也不要紧,它会忽略不认识的可选项,仍能建立起以无线网A为一端的TCP连接,后果只是MN不能在保持此TCP连接的条件下移动到另一个网中。
建立了TCP连接后,上行和下行TCP报文中都带有“家乡地址”和“家乡端口号”可选项,双方都以这两个可选项的值(连同CN一端的地址和端口号)为依据找到相应的TCP连接,但是却总是以上行流量的源地址和源端口号作为下行流量的目标地址和目标端口号。
当MN移动进入无线网B时,MN同样先请求分配一个内网地址,并向HA登记更换其临时地址。接着,由于已经有一个TCP连接存在,MN需要在此TCP连接上向对方发送一个ACK报文,或者数据报文(如果正好有数据要发送的话)。同样,无线网B的网关也会实施NAT变换,改变TCP头中的源端口号位段和IP头中的源地址位段。对方(在这里仍是CN)在收到载运着这个TCP报文的IP包时,就根据其源地址和源端口号位段改变该TCP连接的下行目标地址和目标端口号。
载运着TCP报文的UDP包可能会在路上丢失,所以在发出第一个ACK报文或数据报文以后MN应开启一个定时器,以便每隔一会儿(例如10毫秒或20毫秒)就重发一个ACK报文,直到收到由对方发来的第一个报文为止。收到了第一个下行报文,就说明地址的改变已经为对方所认知。
有多个TCP连接存在时的操作可依此类推。
由于每当移动进入新的网络时都要向HA登记更换其临时地址,HA就总是能根据MN在家乡网中的地址发现MN当前所在的子网和内网地址。这样,如果有必要,就可以通过隧道向MN发送信息(例如实时发送通知,VoIP呼叫等等)。
由此可见,采用了本发明的方法以后,移动设备不需要公网地址就能在无线网中漫游,而且对下行流量直接路由、而不需要经由移动设备的家乡代理转发。
在上面的叙述中我们假定家乡代理HA和网关是合为一体的,但是即使二者独立存在也不改变本发明的实质。
另一方面,在上面的叙述中MN使用的是内网地址,但是MN也可以使用其原有的公网地址,具体只要用其公网地址作为家乡地址,并自行生成家乡端口号,再让网关对虽然源地址是公网地址但又带有家乡地址可选项的IP包也实施NAT(传统上对源地址是公网地址的包是不作NAT变换的),将包的源地址改成其自身的地址,就行了。当然,对逆向的包也要作逆向的NAT。所以这只是本发明的方法的一个特例。
为帮助理解,表1给出IP包及其载运的TCP报文的示意图:
表1 IP包及其载运的TCP报文
如果TCP报头长度大于5,即20字节,就说明报头中还有着一个或几个可选项,其格式可因具体的可选项而异。
可选项一共占8个字节。第一个字节为可选项代码,这里选择了128。第二个字节为可选项长度,其数值为8,表示8个字节。接着两个字节保留不用,使32位的家乡地址与长字边界对齐。
现将本发明的实施具体说明如下:
1.在TCP规程的报头可选项中增加两个新的可选项“家乡地址”和“家乡端口号”,格式参照原有的其他可选项。可选项的具体格式属于实施细节,并不影响本发明(作为方法)的实质。
● 也可以把“家乡地址”可选项加在IP包头中,但是考虑到IP包头中最多只有40字节可以用于可选项,而本人的另一项发明已经在IP包头中增加了两个可选项,因此以加在TCP报头中为宜。另一方面,“家乡地址”可选项的作用只与TCP连接有关,从逻辑上讲也应该加在TCP报头中。不果把可选项加在什么地方只是实施细节而并不影响本发明(作为方法)的实质。
2.每一个移动设备均须记住(存储)其家乡代理HA的公网地址。此外还需要记住一些能向HA表明其身份的信息,例如它在家乡(固定)网中的内网地址,或MAC地址等等。前者(HA的公网地址)为本发明所述方法之必须,后者只是出于管理的需要。此外,出于身份认证的需要,可能还须记住更多有关的信息(如口令等等),但是具体细节与本发明的实质无关。
3.当一个移动设备MN新进入一个无线网A时,首先应通过DHCP要求分配一个在当地的内网地址。具体的操作是常规操作,并不属于本发明的范围。
4.MN向其家乡代理(网关)HA登记,登记报文中至少应提供MN在当地分配到的内网地址,还可以附带提供MN在家乡网中的内网地址、MAC地址、以及身份认证所需的信息。登记报文的具体格式及附带信息的多少属于实施细节,并不影响本发明(作为方法)的实质。
5.家乡代理HA在接收到MN的登记请求时,从IP包头的源地址位段可以知道MN当前所在网关的公网地址。HA可以进行一些与身份认证、授权、计费有关的操作,然后加以确认。
6.每当MN需要穿越因特网与某节点CN建立TCP连接时,须先向家乡代理HA发送一个端口号请求(报文)。HA在收到报文后应调用其NAT模块为MN分配一个端口号HP,并通过应答报文将端口号HP发送给MN。分配端口号以后,CN便将MN的家乡地址、回信地址、以及所分配的端口号相绑定。端口号请求报文及其应答报文的具体格式属于实施细节,并不影响本发明(作为方法)的实质。
7.在MN发往CN的SYN报文、即(建立TCP)连接请求报文中,以及相应的IP包中,以CN的公网地址为目标地址,以MN在当地的内网地址为源地址,并以由MN产生的端口号LP为源端口号。同时,MN在TCP报头中加入“家乡地址”和“家乡端口号”两个可选项,其中“家乡地址”为HA的公网地址、“家乡端口号”为由HA分配得到的端口号HP。这里LP和HP分别为“当地端口号”和“家乡端口号”的缩写。
8.当地网关A对报文实施常规的NAT操作,把IP包中的源地址换成它的公网地址、即“回信地址”,把源端口号LP换成由它分配的端口号、即“回信端口号”。这些操作是NAT的基本功能,并不属于本发明的范围。
9.CN在接收到SYN报文后记下IP包头中的源地址和TCP报头中的源端口号,作为逆向流量的目标地址和目标端口号,这就是“回信地址”和“回信端口号”。
10.但是,只要TCP报头中有“家乡地址”和“家乡端口号”可选项存在,CN就用这两个可选项的值作为建立TCP连接的参数。进一步,CN在接收到别的TCP报文时,只要TCP报头中有“家乡地址”和“家乡端口号”可选项存在,也一律以这两个可选项的值,连同目标地址(CN的公网地址)和目标端口号(由CN在建立TCP连接时产生),作为TCP连接的标识,即唯一确定报文所属TCP连接的依据。
● 也可以再定义一个“TCP连接号”可选项,而让CN为新建的TCP连接分配一个“TCP连接号”作为唯一标识。“TCP连接号”可选项的本质只是把“家乡地址”和“家乡端口号”两个可选项合并、压缩成一个,这并不改变本发明将TCP连接与回信地址相分离的实质。
11.如有必要,CN可以在建立TCP连接前通过RADIUS一类的规程向HA核实MN的“家乡地址”、“回信地址”、以及“家乡端口号”的有效性,或获得授权(例如关于付费的承诺)。若得不到HA的确认可以拒绝建立、或予以关闭。
12.由于CN在发往MN的TCP报文中以网关A的公网地址为目标地址,以网关A分配的端口号为目标端口号,并带有(由MN提供的)“家乡地址”和“家乡端口号”可选项。载运着这些TCP报文的IP包将被直接路由到网关A,并在哪里被逆向NAT和转发到MN。这是常规的IP路由和NAT转换,并不属于本发明的范围。
13.建立了TCP连接以后,凡由MN发往CN的TCP报头中均带有“家乡地址”和“家乡端口号”可选项。
14.每当MN移动进入新的网络B时,首先要求分配一个在当地的内网地址。然后向家乡网关HA登记临时地址的变动。HA经过认证以后将TCP连接的“家乡地址”和“家乡端口号”与MN新的地址和端口号相绑定。
15.MN移动进入新的网络B、并取得新的内网地址后,须向CN发送一个ACK报文,或ACK标志为1的数据报文(如果恰好有上行数据的话),报文的TCP报头中同样带有“家乡地址”和“家乡端口号”可选项。
16.同时,MN须设置一个定时器(例如10毫秒或20毫秒),只要尚未收到来自CN(经由网络B)的TCP报文,就需要周期地重发ACK报文或ACK标志为1的数据报文,直到收到来自CN(经由网络B)的第一个TCP报文。
17.CN在接收到来自MN的报文并检测到临时地址的变化时,应向其家乡代理HA核实,看由“家乡地址”和“家乡端口号”所唯一确定的TCP连接是否已跟新的回信地址和端口号绑定。若得到HA的认可即应更改用于逆向流量的目标地址和目标端口号(见第9项)。之所以要核实是为防止TCP连接被“劫持”。
18.MN应定时向HA报告:由HA分配的哪一些端口号还在使用中。HA应回收已不再使用的端口号。
19.作为本方法的一个特例,如果MN原来使用公网地址,也可以继续使用公网地址。具体只要用其公网地址作为家乡地址,并自行生成家乡端口号,再让网关对虽然源地址是公网地址、但又带有家乡地址可选项的IP包也实施NAT,并对逆向的包也作逆向NAT。之所以要让网关对其实施地址转换,是因为网关的地址是静态的,便于对下行流量直接路由;而MN的公网地址,则由于MN在移动而难以实现对下行流量直接路由。
上面的第1项说明了本发明对TCP规程的扩充。第6、7、9、10、13、15、16、17、18诸项为本发明的实质所在。说明了采用本发明所述方法以后移动设备如何发起对目标网站的访问、目标网站如何应对、以及二者如何进行面向连接的通信。其余各项或为帮助读者理解而加的说明(如第8项和第12项),或为一些应有的附加(如第3、4、5项)和可能的补充(如第12项),旨在使采用了本发明所述方法以后在整体上更为完整。第14项则实际上就是第3、4项,第19项则描述了本方法的一个特例,即移动节点使用公网地址时的方法。
需要特别指出的是:作为一种具体的实现,这里的一些细节并不是唯一的,而可以有所变化,但是细节的不同并不影响本发明的实质。
下面进一步给出有关算法的伪代码描述。
MN进入无线网
输入:本节点家乡代理HA的公网地址,本节点在家乡网中的身份信息。
启动条件:
开启电源时若物理层检测到处于某个无线网络(基站或AP的覆盖范围)中时。或者当物理层检测到已移动进入了一个新的网络(基站或AP的覆盖范围)而需要切换时。
算法:
发出DHCP请求,要求分配在当地的内网地址;
等待DHCP响应;
LA=由DHCP服务器分配的内网地址;
根据DHCP返回的信息判断并纪录是否处于家乡网络;
if(不在家乡网络中)
{
向HA发送登记报文,参数包括LA以及本节点在家乡网中的身份信息;
等待HA响应,若超过预定的等待时间就重发登记报文;
}
/*结束*/
MN要求与CN建立TCP连接
输入:本节点家乡代理HA的公网地址,本节点在当地网中的内网地址LA。
“家乡端口号”请求序号,初值为0。
启动条件:
需要经过公网访问某个网站CN,因而需要建立与CN的TCP连接时。
算法:
if(本节点处于家乡网)
{
常规TCP/IP操作;
}
else /*移动到了外地*/
{
递增“家乡端口号”请求序号;
向HA发出家乡端口号请求报文,参数包括LA和请求序号;
等待HA响应,若超过预定的等待时间就重发请求报文;
HP=由HP分配的家乡端口号;
准备SYN报文;
IP包头中的目标地址位段=CN的公网地址;
IP包头中的源地址位段=本节点在当地网中的内网地址LA;
TCP报头中的目标端口号=具体应用的端口号(例如HTTP为);
TCP报头中的源端口号=本地生成的端口号;
TCP报头中的“家乡地址”可选项=家乡代理HA的公网地址;
TCP报头中的“家乡端口号”可选项=HP;
向CN发送SYN包文;
常规的后续TCP/IP操作;
}
/*结束*/
MN收到TCP报文
输入:已经建立的TCP连接。
启动条件:
接收到载有TCP报文的IP包时。
算法:
目标地址DA=IP包头中的源地址;
以{家乡地址,家乡端口号;对方地址;对方端口号}为参数寻找已建立TCP连接的纪录;
if(找到)/*连接已建立*/
{
常规的TCP操作;
if(需要回应)调用“CN发送TCP报文”向对方发送数据或控制报文。
}
else /*连接尚未建立*/
{
if(是SYN报文) /*请求建立TCP连接*/
{
MN在内网中,故不接受外来TCP连接请求;
}
else if(已请求建立TCP连接,但尚未完成建立连接)
{
if(是ACK报文 并且DA==对方地址)
{
/*TCP连接建立成功*/
纪录该TCP连接,包括家乡地址和家乡端口号可选项;
TCP连接的目标端口号=对方返回的源端口号;
常规的后续TCP操作;
}
}
/*结束*/
MN向CN发送TCP报文
输入:本节点家乡代理HA的公网地址,本节点在当地网中的内网地址LA。
已经建立的TCP连接,
包括连接的两个端口号HP(由家乡代理分配)和DP(建立TCP连接时由CN分配)
启动条件:
需要通过已经建立的TCP连接向CN发送数据报文或控制报文时。
算法:
if(本节点处于家乡网)
{
常规TCP/IP操作;
}
else /*移动到了外地*/
{
设置IP包头及TCP报文头;
IP包头中的目标地址位段=CN的公网地址;
IP包头中的源地址位段=本节点在当地网中的内网地址LA;
TCP报头中的目标端口号=建立TCP连接时由CN分配的端口号DP;
TCP报头中的源端口号=建立TCP连接时由本地生成的端口号;
TCP报头中的“家乡地址”可选项=家乡代理HA的公网地址;
TCP报头中的“家乡端口号”可选项=建立TCP连接时使用的HP;
If(有数据要发送) 将数据拷贝到报文中;
发送报文
常规的后续TCP/IP操作;
}
/*结束*/
MN报告家乡端口号的使用情况
输入:本节点家乡代理HA的公网地址,本节点在家乡网中的身份信息。
已由HA分配并尚在使用中的家乡端口号清单。
启动条件:
关闭某个TCP连接时。或者
每过一定的时间(例如5分钟)。
算法:
发出DHCP请求,要求分配在当地的内网地址;
等待DHCP响应;
LA=由DHCP服务器分配的内网地址;
根据DHCP返回的信息判断并纪录是否处于家乡网络;
CN收到TCP报文
输入:已经建立的TCP连接。
启动条件:
接收到载有TCP报文的IP包时。
算法:
if(TCP报头中带有家乡地址和家乡端口号可选项)/*对方是移动节点*/
{
if(是SYN报文) /*请求建立TCP连接*/
{
向MN的家乡代理HA核实(MN的家乡地址、端口号、和回信地址是否已登记);
if(核实无误)
{
为TCP连接生成一个端口号DP
以{MN的家乡地址,MN的家乡端口号;CN的地址,DP}为参数建立TCP连接;
记录该TCP连接的各项参数,包括MN的回信地址和源端口号;
调用“CN发送TCP报文”向对方发送ACK报文;
}
else
{
不予理睬;
}
}
else /*TCP连接已经建立*/
{
以{MN的家乡地址,MN的家乡端口号;CN的地址,DP}为参数
找到已建立TCP连接的各项参数;
if(MN的回信地址和源端口号有变化)
{
向MN的家乡代理HA核实(MN的家乡地址和回信地址是否已登记);
if(核实无误)
{
记录该TCP连接的各项新参数,包括MN新的回信地址和源端口号;
}
else
{
不予理睬并报错;
}
}
常规的TCP操作;
if(需要回应)调用“CN发送TCP报文”向对方发送数据或控制报文。
}}else /*对方是固定节点*/{
常规的TCP操作;}/*结束*/
CN发送TCP报文
输入: 已经建立的TCP连接。
启动条件:
需要通过已经建立的TCP连接向对方发送数据报文或控制报文时。
算法:
if(TCP连接中的家乡地址和家乡端口号空白) /*对方是固定节点*/
{
常规TCP/IP操作;
}
else /*对方是移动节点*/
{
设置IP包头及TCP报文头;
IP包头中的目标地址位段=来自MN的IP包头中的源地址;
IP包头中的源地址位段=本节点(CN)的地址;
TCP报头中的目标端口号=来自MN的TCP报头中的源端口号;
TCP报头中的源端口号=建立TCP连接时由CN生成的端口号;
TCP报头中的“家乡地址”可选项=来自MN的家乡代理可选项;
TCP报头中的“家乡端口号”可选项=来自MN的家乡端口号可选项;
If(有数据要发送) 将数据拷贝到报文中;
发送报文
常规的后续TCP/IP操作;
}
/*结束*/
这些算法可以通过软件实现,也可以通过集成电路芯片(或芯片组)以硬件形式实现。具体的实现形式与手段并不改变本发明在IP网络中按路径寻址的实质。此外,实际实现时还可对这些算法加以优化,这同样也不改变本发明的实质。
实施例2:采用家乡地址和家乡端口号的本质在于使建立的TCP连接有个静态的标识,不致因为节点的移动而失去确定已有TCP连接的能力,其根源在于TCP规程用{源地址,源端口号;目标地址,目标端口号}唯一地确定一个TCP连接。因此,作为上述方法的一个简化版,也可以不要家乡地址和家乡端口号,而改成让CN为建立的TCP连接产生一个“TCP连接标识号”,并将标识号作为TCP报头可选项随同上、下行TCP报文发送即可。也就是说,MN与CN之间的通信仍采用“双地址模式”,但是用“TCP连接标识号”来唯一确定TCP连接,并将“TCP连接标识号”定义为TCP报头可选项。这样也能达到对去向移动节点的下行流量直接路由的目的,但是也有缺点,特别是CN缺少了找MN的家乡代理验证的可能。为了解决这个问题,移动节点MN在请求建立TCP连接时仍应提供其家乡地址,使CN可以向移动节点的家乡代理验证。
前面的表1给出IP包及其载运的TCP报文的示意图:如果用TCP连接标识号可选项的话,其格式同家乡端口号可选项,只是代码改成130,而最后两个字节为16位的连接标识号。
作为本方法的一个简化版本,只在TCP规程的报头可选项中增加一个新的可选项“TCP连接标识号”。凡是移动节点发出的TCP报文和发往移动节点的TCP报文均在TCP报头中带上“TCP连接标识号”可选项,在TCP连接尚未建立前其值为0,建立TCP连接时由CN生成一个(对于CN)唯一的标识号,TCP连接建立以后则以此作为“TCP连接标识号”可选项的值。在通信中,CN以此可选项的值作为唯一确定TCP连接的依据,MN则以对方地址和可选项的值共同作为唯一确定TCP连接的依据。用这个方法也能达到对去向移动节点的下行流量直接路由的目的。
下面是简化版有关算法的伪代码描述。
MN进入无线网(简)
输入:本节点家乡代理HA的公网地址,本节点在家乡网中的身份信息。
启动条件:
开启电源时若物理层检测到处于某个无线网络(基站或AP的覆盖范围)中时。或者当物理层检测到已移动进入了一个新的网络(基站或AP的覆盖范围)而需要切换时。
算法:
发出DHCP请求,要求分配在当地的内网地址;
等待DHCP响应;
LA=由DHCP服务器分配的内网地址;
/*结束*/
MN要求与CN建立TCP连接(简)
输入:本节点在当地网中的内网地址LA。
启动条件:
需要经过公网访问某个网站CN,因而需要建立与CN的TCP连接时。
算法:
if(本节点处于家乡网)
{
常规TCP/IP操作;
}
else /*移动到了外地*/
{
准备SYN报文;
IP包头中的目标地址位段=CN的公网地址;
IP包头中的源地址位段=本节点在当地网中的内网地址LA;
TCP报头中的目标端口号=具体应用的端口号(例如HTTP为);
TCP报头中的源端口号=本地生成的端口号;
TCP报头中的“TCP连接标识号”可选项=0;
向CN发送SYN包文;
常规的后续TCP/IP操作;
}
/*结束*/
MN收到TCP报文(简)
输入:已建立TCP连接的纪录。
启动条件:
接收到载有TCP报文的IP包时。
算法:
对方地址=IP包头中的源地址;
以{对方地址,TCP连接标识号}为参数寻找已建立TCP连接的纪录;
if(找到)/*连接已建立*/
{
常规的TCP操作;
if(需要回应)调用“CN发送TCP报文”向对方发送数据或控制报文。
}
else /*连接尚未建立*/
{
if(是SYN报文) /*请求建立TCP连接*/
{
MN在内网中,故不接受外来TCP连接请求;
}
else if(已请求建立TCP连接,但尚未完成建立连接)
{
if(是ACK报文 并且DA==对方地址)
{
/*TCP连接建立成功*/
纪录该TCP连接,包括TCP连接标识号可选项;
TCP连接的目标端口号=对方返回的源端口号;
常规的后续TCP操作;
}
}
/*结束*/
MN向CN发送TCP报文(简)
输入:本节点在当地网中的内网地址LA。
已经建立的TCP连接,包括“TCP连接标识号”。
启动条件:
需要通过已经建立的TCP连接向CN发送数据报文或控制报文时。
算法:
if(本节点处于家乡网)
{
常规TCP/IP操作;
}
else /*移动到了外地*/
{
设置IP包头及TCP报文头;
IP包头中的目标地址位段=CN的公网地址;
IP包头中的源地址位段=本节点在当地网中的内网地址LA;
TCP报头中的目标端口号=建立TCP连接时由CN分配的端口号DP;
TCP报头中的源端口号=建立TCP连接时由本地生成的端口号;
TCP报头中的“TCP连接标识号”可选项=由CN分配的TCP连接标识号;
If(有数据要发送) 将数据拷贝到报文中;
发送报文
常规的后续TCP/IP操作;
}
/*结束*/
CN收到TCP报文(简)
输入:本节点在当地网中的内网地址LA。
已经建立的TCP连接,包括“TCP连接标识号”。
启动条件:
接收到载有TCP报文的IP包时。
算法:
if(TCP报头中带有TCP连接标识号可选项)/*对方是移动节点*/
{
if(是SYN报文) /*请求建立TCP连接*/
{
为TCP连接生成一个端口号DP;
为TCP连接生成一个连接标识号;
以{报文的源地址,报文的源端口号;CN的地址,DP,连接标识号}
为参数建立TCP连接;
记录该TCP连接的各项参数;
调用“CN发送TCP报文(简)”向对方发送ACK报文;
}
else /*TCP连接已经建立*/
{
以连接标识号为参数找到已建立TCP连接的各项参数;
常规的TCP操作;
if(需要回应)调用“CN发送TCP报文(简)”向对方发送数据或控制报文。
}
}
else /*对方是固定节点*/
{
常规的TCP操作;
}
/*结束*/
CN发送TCP报文(简)
输入:已经建立的TCP连接,包括“TCP连接标识号”。
启动条件:
需要通过已经建立的TCP连接向对方发送数据报文或控制报文时。
算法:
if(TCP连接标识号空白)/*对方是固定节点*/
{
常规TCP/IP操作;
}
else /*对方是移动节点*/
{
设置IP包头及TCP报文头;
IP包头中的目标地址位段=来自MN的IP包头中的源地址;
IP包头中的源地址位段=本节点(CN)的地址;
TCP报头中的目标端口号=来自MN的TCP报头中的源端口号;
TCP报头中的源端口号=建立TCP连接时由CN生成的端口号;
TCP报头中的“TCP连接标识号”可选项=TCP连接的标识号;
If(有数据要发送) 将数据拷贝到报文中;
发送报文
常规的后续TCP/IP操作;
}
/*结束*/
同样,这些算法可以通过软件实现,也可以通过集成电路芯片(或芯片组)以硬件形式实现。具体的实现形式与手段并不改变本发明在IP网络中按路径寻址的实质。