网络层功能:组网和多跳路由。网络层关注的是如何将分组从源端沿着网络路径送达目标端.为了将分组送到目标端,有可能沿路要经过许多跳中间路由器。这种功能显然与数据链路层的功能不同,数据链路层只是单跳地将分组从一端发送到另一端。
DSDV路由协议的实现采用以下定时器:
(1)计数定时器,网络层当前时间采用计数器定时器的超时次数标识。
(2)HelloTimer定时器,周期发送HELLO广播报文,以建立邻居表。
(3)邻居管理定时器NeighborTimer,删除邻居表中已经超时的邻居项,并设置下次被调用的时间,同时处理因邻居节点被删除而引起的路由变化。
(4)完全转存路由广播定时器,将路由表中的所有信息进行通告。
(5)递增更新路由广播定时器,仅通告更新消息。
(6)路由缓存定时器,用来删除过期的路由选项。
/****************************************************
计数定时器
*****************************************************/
TIMER_ID CountTimer;
/*****************************************************
周期发送Hello 广播报文
*****************************************************/
TIMER_ID HelloTimer;
/*****************************************************
邻居管理定时器, 删除邻居表中已经
超时的邻居项, 并设置下次被调用的
时间, 同时处理因邻居节点被删除而
引起的路由变化
*****************************************************/
TIMER_ID NeighborTimer;
/**********************************************************
路由广播定时器, 定时广播路由广播表
的路由信息, 完全转存& 递增更新
***********************************************************/
TIMER_ID FullRouteBroadcastTimer; /*完全转存: 将路由表项中的所有信息进行通告*/
TIMER_ID IncRouteBroadcastTimer; /*递增更新: 仅通告更新消息*/
/*************************************************************
路由缓存定时器, 用来删除过期的路由表项
*************************************************************/
TIMER_ID RouteBufferTimer;
#define METRIC_INFINITY 60
/*邻居数以及路由表项的最大值*/
#define MAX_NEIGHBOR_NUM 32
#define MAX_ROUTEENTRY_NUM 32
/*路由广播表项的大小*/
#define ADT_ROUTE_TABLE_ENTRY_SIZE 4
/******************************************************
DSDV路由广播报文格式:
路由广播报文数目-- 路由广播报文序列
*******************************************************/
/***********************************************
m_PayLoad指明了哪个定时器超时
************************************************/
/*计数器定时器超时, 计数器增加*/
#define NET_TIMEOUT_CNT 0x00000001
/*周期Hello报文广播定时器, 超时则广播Hello报文*/
#define NET_TIMEOUT_HELLO 0x00000002
/********************************************************
邻居管理定时器超时, 清除邻居表中超
时的邻居项, 同时处理因邻居表项的删
除而引起的路由变化
*********************************************************/
#define NET_TIMEOUT_NEIGHBOR 0x00000003
/********************************************************
路由广播完全转存定时器超时, 将路由
表中的所有信息进行通告
*********************************************************/
#define NET_TIMEOUT_RBCT_FULL 0x00000004
/*********************************************************
路由广播递增更新定时器超时, 仅通告
上一次完全转存后递增更新的路由信息
**********************************************************/
#define NET_TIMEOUT_RBCT_INC 0x00000005
/*********************************************************
路由缓存定时器超时, 删除路由表中
过期的路由选项
**********************************************************/
#define NET_TIMEOUT_RBUFF 0x00000006
/***************************************************
定时器超时时间间隔设置(Seconds)
****************************************************/
#define NET_INTERVAL_CNT 2
#define NET_INTERVAL_HELLO 3
#define NET_INTERVAL_NEIGHBOR 9
#define NET_INTERVAL_RBCT_FULL 30
#define NET_INTERVAL_RBCT_INC 10
#define NET_INTERVAL_RBUFF 90
/*****************************************************
处理各时间的超时时间设置,
以计数器定时器超时间隔计算
******************************************************/
#define NET_TMUNIT_DEL_NEIGHBOR 6 /*邻居表项有效且flesh>=4, 则删除该邻居表项*/
#define NET_TMUNIT_DEL_ROUTEENTRY 90 /*删除路由表项*/
/***************************************************
ServiceType 域的~4 位标识协议包类型
****************************************************/
#define NET_STYPE_HELLO 1 /*Hello广播消息, 用于定期更新邻居表*/
#define NET_STYPE_ROUTE 2 /*路由更新协议包*/
#define NET_STYPE_TEST 3 /*网络层路由测试包*/
/**************************************************
邻居表项以及邻居表
***************************************************/
typedef struct _NeighborTableElemt
{
bool valid; /*邻居表项是否有效*/
U32 install_time; /*创建时间*/
U16 flesh; /*记录未更新持续时间*/
}NeighborTableElemt;
typedef struct _NeighborTable
{
NeighborTableElemt neighbors[MAX_NEIGHBOR_NUM];
U32 version;
}NEIGHBOR_TABLE;
/*******************************************************
路由转发表以及路由广播表
********************************************************/
typedef struct _StableDataElemt
{
U16 last_settling_time;
U16 avg_settling_time;
}StableDataElemt;
typedef struct _FWDRouteTableElemt
{
U8 Destination; /*目的站点*/
U8 NextHop; /*下一跳站点*/
U16 SeqNum; /*序列号, 跟目的站点相关*/
U32 InstallTime;
U8 Metric;
bool Flag; /*标识递增更新的包*/
StableDataElemt StableData; /*缓解路由波动*/
}FWDRouteTableElemt;
/*路由转发表*/
typedef struct _FWDRouteTable
{
FWDRouteTableElemt RouteTable[MAX_ROUTEENTRY_NUM];
U32 version;
}FWD_ROUTE_TABLE;
typedef struct _ADTRouteTableElemt
{
U8 Destination;
U8 Metirc;
U16 SeqNum;
}ADTRouteTableElemt;
/*路由广播表*/
typedef struct _ADTRouteTable
{
ADTRouteTableElemt RouteTable[MAX_ROUTEENTRY_NUM];
U32 version;
}ADT_ROUTE_TABLE;
参考文献:
【1】Charles E. Pekins, Pravin Bhagwat. Highly Dynamic Destination-Sequenced Distance-Vector Routing (DSDV) for Mobile Computers, 1994.