Route Optimization in IP Network
Route Optimization in IP Network
Jennifer Rexford
Abstract
The performance and reliability of the Internet depend, in large part, on the operation of the underlying routing protocols. Todays IP routing protocols compute paths based on the network topology and
configuration parameters, without regard to the current traffic load on the routers and links. The responsibility for adapting the paths to the prevailing traffic falls to the network operators and management
systems. This chapter discusses the modeling and computational challenges of optimizing the tunable
parameters, starting with conventional intradomain routing protocols that compute shortest paths as the
sum of configurable link weights. Then, we consider the problem of optimizing the interdomain routing
policies that control the flow of traffic from one network to another. Optimization based on local search
has proven quite effective in grappling with the complexity of the routing protocols and the diversity of
the performance objectives, and tools based on local search are in wide use in todays large IP networks.
1 Introduction
Over the past fifteen years, the Internet has become a critical part of the worlds communications infrastructure. The Internet consists of tens of thousands of domains or Autonomous Systems (ASes)portions of the
infrastructure that are each administered by an single institution such as a university, corporation, or Internet
Service Provider (ISP). A message sent by one computer typically traverses multiple ASes before reaching
its destination, making communication performance depend on the flow of traffic within and between the
ASes along the path. In this chapter, we consider the role of optimization in controlling the routing of traffic
through the Internet. We explain how the complexity of both the performance objectives and the network
routing protocols lead to optimization problems that are not analytically tractable, forcing the use of efficient
search techniques to explore a large space of tunable parameters.
switching acknowledges that data communication is often bursty, with users and applications alternating
between periods of high network activity and relative silence. Packet switching has the allure of allowing
the links in the network to multiplex traffic across multiple pairs of senders and receivers. While one
sender-receiver pair is inactive, another can capitalize on the unclaimed bandwidth by exchanging traffic
at a higher rate. However, this flexibility comes at a cost. If too many hosts exchange packets at the same
time, the aggregate traffic may overwhelm the link bandwidth, leading to delays in transmitting the data and,
ultimately, to lost packets when the buffer feeding the link overflows.
The Internet, then, has a relatively simple best effort service model with no guarantee that a data packet
reaches its ultimate destination in a timely fashion. Although many applications (such as electronic mail)
can tolerate delay in receiving the data, missing information is often unacceptable. Rather than building
reliable, in-order data delivery into IP, the end hosts bear the responsibility of retransmitting lost packets and
reconstructing the ordered stream of data at the receiver. These functions are performed by the Transmission
Control Protocol (TCP), implemented in the operating system on the end-host computers [3]. In addition,
the TCP sender determines the rate of data transmission by monitoring the success (or failure) of sending
packets to the receiver. When packets are lost, the sending host decreases the transmission rate to help
alleviate the apparent congestion; when packets are successfully delivered, the sending host optimistically
increases the sending rate to capitalize on the available bandwidth along the path to the receiver. This
decentralized congestion control scheme ensures a form of fair sharing of the bandwidth of the links amongst
the competing pairs of senders and receivers.
However, transport protocols like TCP do not ensure that the network operates efficiently. For example,
one link may be heavily congested while other links in the network remain lightly loaded. Or, a voice-overIP (VoIP) call may traverse a long path with high propagation delay when a low-latency path is available.
The responsibility of selecting the path a packet follows through the network falls to the routing protocols
implemented by the individual routers in the network. Rather than using hard-wired tables to forward the
packets, the routers exchange control messages with each other to compute the paths through the network
in a distributed fashion. The distributed approach allows a collection of routers to adapt automatically to
changes in the network topology. This makes IP networks robust in the presence of link and router failures,
and easily accommodates the deployment of new equipment as the network grows. However, the routing
protocols deployed in most IP networks do not incorporate information about network load and performance
into the selection of the paths. Left to their own devices, the routers continue to forward packets over heavily2
2
3
1
3
5
4
optimization
Routing model
Topology &
configuration
Traffic
demands
measurement
Setting
parameters
control
Operational network
used in many operational IP networks [9, 11, 12]. Next, we describe how to extend the routing model to
accurately capture the operation of large backbone networks that have multiple egress points for directing
traffic toward each destination. Then, we explore the role of optimization in tuning the interdomain routing
policies that control how traffic flows between ASes. In the conclusion, we briefly discuss recent research
work on designing distributed routing protocols that are easier to tune as well as centralized approaches for
directly computing routes on behalf of the operational routers.
f(link utilization)
1.0
link utilization
i,j
Mi,j Pi,j,` the proportion of traffic that traverses link ` summed over all pairs of routers. An
objective function can quantify the goodness of a particular setting of the link weights. For example,
minimizing the simple objective function max ` (u` /c` ) would result in a set of link weights that minimizes
the worst-case utilization over all links in the network. Although minimizing the maximum utilization is
a natural and intuitive objective, this metric is sensitive to individual bottleneck links that may be difficult
to avoid under any routing solution. Instead, the optimization could consider a network-wide objective of
minimizing
` f (u` /c` )
for a convex function f () that penalizes solutions that have heavily-loaded links,
as shown in Figure 3.
Even for these simple objective functions, the problem of optimizing the link weights {w ` } is NPhard [1820]. The computational challenge arises because of the limited control over the splitting of traffic
over multiple shortest path routes. If a router could split traffic over multiple outgoing links in arbitrary
proportions, the optimization problem would be much simplerallowing the use of multicommodity-flow
7
solutions [21]. However, the routers themselves do not compute paths based on any information about the
traffic matrix or the link loads, leaving them no basis for determining the appropriate splits of traffic
over the shortest paths. In addition to the NP-hard optimization problem, the limitations on path splitting
make it difficult for an optimal setting of the link weights (if known) to approximate the efficiency of a
multicommodity-flow solution with the same topology and traffic matrix. In fact, the performance gap, as
measured by the objective function, between an optimal setting of the link weights and a multicommodityflow solution can be arbitrarily high in the worst case [8, 18]. Fortunately, real network topologies and
traffic matrices have much smaller performance gaps between the two kinds of routing [8]; in practice, the
performance differences are nearly indistinguishable.
i,j
Mi,j Pi,j,` on each link `, and evaluating the objective function. For a large network with |R|
nodes and |L| edges, the computational overhead can be quite high. Fortunately, the local-search algorithm
does not need to compute these quantities from scratch in each iteration. For example, if each iteration of
the local search considers a change to a single link weight, incremental graph algorithms can be used to
quickly determine the changes in the paths, link loads, and objective function. The search can often start
8
with a reasonable setting of the link weights taken from the existing network; often, changing one or two
link weights is sufficient to achieve near-optimal performance. In addition, selecting link weights from a
small number of distinct values is an effective way to substantially reduce the search space without much
reduction in the quality of the solution.
Studies of various search techniques have shown that it is possible to find near-optimal settings of the
link weights on graphs with hundreds of nodes in a reasonable amount of time [8, 23, 24]. In addition, a
good setting of the link weights performs almost as well as the theoretical upper bound from solving the
multi-commodity flow problem, which assumes greater flexibility in routing the traffic than the shortest-path
routing algorithms permit. In practice, the performance gap between a good weight setting and the multicommodity flow solution is especially small for real network topologies, which typically have a relatively
low diameter and a narrow range of link capacities. Although performing the local search is computationally
inexpensive for small graphs, identifying good weight settings in larger graphs may argue for an alternate
approach. A promising alternative is a two-phase algorithm where the first phase allocates each traffic matrix
element to a single path and the second phase tries to find a setting of the link weights that can achieve these
paths [25].
More generally, the local search algorithm could evaluate a candidate setting of the link weights over a set
of traffic matrices, favoring a solution that performs well for each traffic matrix over one that performs best
for one at the expense of the others. This approach is extremely effective for selecting link weights that
accommodate diurnal cycles in the traffic, allowing network operators to have a single assignment of link
weights for both daytime and nighttime traffic [10]. In fact, recent work [27] shows that it is possible to find
routing solutions that perform well independently of the traffic matrix, or across an extremely wide range of
traffic demands.
Surviving equipment failures and planned maintenance: Ideally, the assignment of the link weights
would be robust to common network disruptions, such as single-link failures. When a link fails, the information is flooded throughout the network and the routers compute new shortest paths over the remaining edges.
Preventing congestion after a failure could require the local search algorithm to evaluate a candidate setting
of the link weights under each failure scenario [28]. However, evaluating the weights under all failures is
computationally prohibitive in large network settings. Fortunately, it is possible to identify and evaluate a
much smaller set of critical scenarios [29]. In practice, link weights that perform well on the original network topology continue to perform well after most single-link failures. However, for a few failure scenarios,
the link weights may need to change to avoid congestion. Fortunately, changing one or two link weights is
typically sufficient to alleviate the congestion. As a proactive measure, the necessary weight changes could
be computed in advance of any link failure and stored by the network management system. These same
precomputed weight changes are extremely useful when network operators must intentionally fail a link
in order to fix or upgrade the equipment; in this case, the weight changes can be made in advance, before
disabling the equipment for maintenance.
Supporting diverse constraints on path preferences: When there are multiple shortest paths between
two routers, the routers along the paths split the traffic over multiple outgoing linksa practice known
as equal-cost multi-path routing. Rather than alternating between these links at the packet level, routers
typically attempt to forward packets for the same source-destination pair along a single path; this reduces the
likelihood that packets from the same TCP connection arrive out-of-order at the receiver. Load-balancing is
typically achieved by performing a hash function on the source and destination IP addresses of each packet;
the value of the hash function determines which outgoing link should carry the packet. As a result, ties
introduce uncertainty in the exact distribution of the traffic over the links; with two outgoing links, the traffic
does not necessarily divide exactly in half. The local search can easily account for the effects of uncertainty
10
by penalizing solutions that have ties (e.g., by setting P i,j,` to 0.6 rather than 0.5, implicitly assuming that
both links must carry 60% of the original traffic load). On the other hand, having multiple shortest paths
is advantageous in some settings. In particular, if one of the two links fails, the other shortest path still
remainsallowing the network to converge more quickly, causing fewer packet losses and delays [30]. The
local search algorithm can easily bias toward solutions with a larger number of ties by including the number
of ties in the objective function.
More generally, the use of local search allows the objective function itself to change over time as different metrics reign in importance. For example, for best-effort Internet traffic, minimizing the maximum
link utilization (or the sum of f () over all links) is a very effective way to maximize TCP throughput. Yet,
the situation is completely different when interactive applications such as Voice-over-IP (VoIP) and video
games enter the picture. For these applications, keeping propagation delay low (e.g., below 100 msec) is
crucial, and disruptions during routing protocol convergence must be avoided by reducing the frequency
of routing changes and by picking solutions that have multiple shortest paths. The underlying machinery
of local search is extremely flexible for incorporating complex metrics and changing their importance in
evaluating candidate settings to the link weights.
11
AS B
dB
earlyexit
routing
AS A
AS C
10
6
5
10
i
dC
Customer
12
13
of its peering links, resulting in a single egress set for of these destinations. In essence, the optimization
process can treat the group of related destinations as a single destination d with one larger traffic demand
vi,d per ingress point. This reduces the complexity of evaluating a candidate setting of the link weights. In
addition, as in Section 2, the size of the search space can be reduced substantially by exploring incremental
changes to the link weights, a small set of unique weight values, and so forth.
14
15
Provider
localpref 90
secondary path
Transit AS
pr
localpref 100
ar
im
y
pa
th
Customer
d
Figure 5: Transit AS assigning higher local preference to the route through a customer
operators may reconfigure the adjacent router to assign a lower local preference value to some of the BGP
routes learned at this location. This ensures that the routers in the AS direct the traffic for these destinations
through the other, lightly-loaded links to the same AS.
16
Model of BGP path selection: Computing the egress set requires applying the policies to the BGP
routes learned from neighboring demands, and then selecting the best of the modified paths. In
particular, the model should select routes with the highest local preference and, among those, the
routes with the shortest AS path length. Ultimately, each router would select the route with the
closest egress point.
Offered traffic from ingress points to destination: As in Section 3, estimating the flow of traffic
requires overlaying the traffic demands v i,d on top of the paths through the AS to reach the chosen
egress point for each ingress point and destination prefix.
With an accurate view of the BGP-learned routes and the traffic demands, an optimization tool can conduct
a local search over possible changes to the routing policies and evaluate the influence on the flow of traffic
through the network.
AS C
AS B
AS A
after
other ISP
before
after
downstream
neighbor
before
to assign a lower local preference to routes originating from AS C. After this change, some routers might
switch from a route via the leftmost link to AS B to a route via the rightmost link to AS A. These routers
would advertise the new best path to downstream neighbors. Depending on the neighbors routing policies,
the new advertisement might cause the neighbor to select a different next-hop AS (i.e., another ISP) for
reaching this prefix. This could result in an unpredictable decrease in the volume of traffic entering the
domain at this router. Similarly, the routing change could trigger an increase in traffic if other neighbors
preferred the (A, C) route over the (B, C) route. These kinds of side effects make it difficult to predict how
the change in routing policy would affect the volume of traffic on the network links.
To prevent the effects of routing changes from propagating to neighboring domains, the optimization tool
should, whenever possible, achieve the load-balancing goals by adjusting routing policies for destinations
for which every potential best route has the same AS path. In practice, an AS would have many such
destinations. For example, a destination residing in AS B would be reachable through three egress points to
AS B that offer the same one-hop AS path. Changing the routing policy for one (or more) of those destination
prefixes would move traffic away from the dotted link to one of the other links to AS B, without changing
the AS path seen by the downstream neighbor. Depending on the BGP implementation, the downstream
AS might not even receive a new BGP advertisement, since the AS path has not changed. This allows the
network to alleviate congestion on a link by moving traffic to other, lightly-loaded links, without changing
the BGP routing information sent to neighboring domains.
5 Conclusion
IP routing protocols have tunable parameters that operators can set to control the flow of traffic through their
networks. Optimization based on local-search techniques plays an important role in adapting these parameters to the prevailing network conditions. In this chapter, we considered three variants of the optimization
problem, with increasing complexity:
1. When each destination connects to the network at a single location, the optimization problem consists
of setting the link weights that drive how the routers direct traffic on shortest paths. The inputs to the
optimization problem are the traffic matrix and the capacitated network topology.
2. When some destinations are reachable via multiple egress points, the optimization problem becomes
more complicated. Instead of the traffic matrix, the offered load is represented as a set of traffic
19
demandsthe volume of traffic entering at a certain router and traveling to a particular destination.
The optimization problem must also consider the set of egress points for each destination prefix.
3. In addition to selecting the link weights, the optimization problem can consider changes to the BGP
policies that determine the set of egress points for each destination prefix. To determine the egress
set, the optimization must consider how the configurable routing policies assign the local-preference
attribute of the BGP routes learned from neighboring domains.
For each optimization problem, local-search techniques are effective in finding good solutions that support
diverse performance objectives and operational constraints.
Still, the optimization problems are computationally challenging, often requiring heuristics for limiting
the size of the search space. Arguably, the underlying routing protocols were not designed with optimization
in mind. Just as an understanding of the routing protocols leads to interesting optimization problems, a
deeper understanding of optimization techniques could lead to better routing architectures. Initial forays
into redesigning IP routing with optimization in mind include:
Routing protocols with simpler optimization problems: Optimizing the link weights in a shortestpath routing protocol is an NP-hard problem, as discussed in Section 2. The work in [42] considers
a simple variant of OSPF and IS-IS routing, where the routers forward traffic on paths in inverse
proportion to the sum of the weights, rather than sending all traffic on shortest paths. This small
change leads to an optimization problem that can be solved in polynomial time for simple objective
functions, as well as a protocol that has smaller reactions to small changes in the path costs.
Explicit negotiation between neighboring domains: When a configuration change causes a router
to direct traffic to a different egress point, the neighboring domain starts receiving traffic at a different ingress point. Rather than make configuration changes independently, neighboring ASes could
coordinate their activities to find mutually beneficial ways to direct the traffic that traverses both domains [43, 44]. However, this approach depends on having an effective way to satisfy the objectives
of both ASes, while ensuring that neither domain has an incentive to provide misleading information
to the other.
Logically-centralized control over path selection: The routing protocols in todays IP networks
were designed, first and foremost, to be implemented in a distributed fashion. More recently, the in20
creasing capabilities of computers makes it possible to select the paths for a large collection of routers
in a separate platform with a network-wide view of the topology and traffic [4547]. Rather than
emulating todays distributed protocols, these platforms could define new frameworks for computing
paths in a logically-centralized fashion to satisfy network engineering goals directly.
Designing new IP routing architectures that are more amenable to optimization is a promising avenue for
future research.
References
[1] B. M. Leiner, V. G. Cerf, D. D. Clark, R. E. Kahn, L. Kleinrock, D. C. Lynch, J. Postel, L. G. Roberts,
and S. S. Wolff, The Past and Future History of the Internet, Communications of the ACM, vol. 40,
pp. 102108, February 1997.
[2] D. D. Clark, The design philosophy of the DARPA Internet protocols, in Proc. ACM SIGCOMM,
pp. 106114, August 1988.
[3] W. R. Stevens, TCP/IP Illustrated, Volume 1: The Protocols. Addison-Wesley, January 1994. ISBN
0201633469.
[4] A. Khanna and J. Zinky, The revised ARPANET routing metric, in Proc. ACM SIGCOMM, pp. 45
56, September 1989.
[5] S. Chen and K. Nahrstedt, An overview of quality of service routing for next-generation high-speed
networks: Problems and solutions, IEEE Network Magazine, pp. 6479, November/December 1998.
[6] E. Crawley, R. Nair, B. Rajagopalan, and H. Sandick, A framework for QoS-based routing in the
Internet, Request For Comments 2386, IETF, August 1998.
[7] B. Fortz, J. Rexford, and M. Thorup, Traffic engineering with traditional IP routing protocols, IEEE
Communication Magazine, October 2002.
[8] B. Fortz and M. Thorup, Internet traffic engineering by optimizing OSPF weights, in Proc. IEEE
INFOCOM, March 2000.
[9] A. Feldmann, A. Greenberg, C. Lund, N. Reingold, and J. Rexford, NetScope: Traffic engineering
for IP networks, IEEE Network Magazine, pp. 1119, March 2000.
[10] B. Fortz and M. Thorup, Optimizing OSPF/IS-IS weights in a changing world, IEEE Journal on
Selected Areas in Communications, vol. 20, pp. 756767, May 2002.
[11] Cariden MATE Framework. http://www.cariden.com/products/.
[12] OpNet SP Guru. http://www.opnet.com/products/spguru/home.html.
[13] J. Moy, OSPF Version 2, Request For Comments 2328, IETF, April 1998.
[14] R. Callon, Use of OSI IS-IS for Routing in TCP/IP and Dual Environments, Request For Comments
1195, IETF, December 1990.
21
[15] A. Feldmann, A. Greenberg, C. Lund, N. Reingold, J. Rexford, and F. True, Deriving traffic demands
for operational IP networks: Methodology and experience, IEEE/ACM Trans. Networking, vol. 9,
June 2001.
[16] A. Medina, N. Taft, K. Salamatian, S. Bhattacharyya, and C. Diot, Traffic matrix estimation: Existing
techniques compared and new directions, in Proc. ACM SIGCOMM, August 2002.
[17] Y. Zhang, M. Roughan, N. Duffield, and A. Greenberg, Fast, accurate computation of large-scale IP
traffic matrices from link loads, in Proc. ACM SIGMETRICS, June 2003.
[18] D. H. Lorenz, A. Orda, D. Raz, and Y. Shavitt, How good can IP routing be?, Tech. Rep. 2001-17,
DIMACS, May 2001.
[19] B. Fortz and M. Thorup, Increasing Internet capacity using local search, Computational Optimization
and Applications, vol. 29, no. 1, pp. 1348, 2004.
[20] A. Juttner, A. Szentesi, J. Harmatos, M. Pioro, and P. Gajowniczek, On solvability of an OSPF routing
problem, in Proc. Nordic Teletraffic Seminar, 2000.
[21] Z. Wang, Y. Wang, and L. Zhang, Internet traffic engineering without full mesh overlaying, in Proc.
IEEE INFOCOM, April 2001.
[22] E. Aarts and J. Lenstra, Local Search in Combinatorial Optimization. Wiley-Interscience, 1997.
[23] M. Ericsson, M. Resende, and P. Pardalos, A genetic algorithm for the weight setting problem in
OSPF routing, J. Combinatorial Optimization, vol. 6, no. 3, pp. 299333, 2002.
[24] L. S. Buriol, M. G. C. Resende, C. C. Ribeiro, and M. Thorup, A memetic algorithm for OSPF
routing, in Proc. INFORMS Telecom, pp. 187188, 2002.
[25] M. Pioro, A. Szentesi, J. Harmatos, A. Juttner, P. Gajowniczek, and S. Kozdrowski, On OSPF related
network optimisation problems, in Proc. IFIP ATM IP, July 2000.
[26] C. Alaettinoglu, V. Jacobson, and H. Yu, Towards milli-second IGP convergence. Expired Internet Draft, draft-alaettinoglu-isis-convergence-00.txt. http://www.packetdesign.com/
Documents/convergence.pdf.
[27] D. Applegate and E. Cohen, Making intra-domain routing robust to changing and uncertain traffic
demands: Understanding fundamental tradeoffs, in Proc. ACM SIGCOMM, August 2003.
[28] A. Nucci, B. Schroeder, S. Bhattacharyya, N. Taft, and C. Diot, IGP link weight assignment for
transient link failures, in Proc. International Teletraffic Congress, August 2003.
[29] B. Fortz and M. Thorup, Robust optimization of OSPF/IS-IS weights, in Proc. International Network
Optimization Conference, pp. 225230, October 2003.
[30] A. Sridharan, S. B. Moon, and C. Diot, On the correlation between route dynamics and routing loops,
in Proc. Internet Measurement Conference, October 2003.
[31] R. Teixeira, A. Shaikh, T. Griffin, and G. Voelker, Network sensitivity to hot-potato disruptions, in
Proc. ACM SIGCOMM, September 2004.
22
[32] N. Feamster, J. Borkenhagen, and J. Rexford, Guidelines for interdomain traffic engineering, ACM
SIGCOMM Computer Communication Review, vol. 33, October 2003.
[33] R. Teixeira, A. Shaikh, T. Griffin, and J. Rexford, Dynamics of hot-potato routing in IP networks, in
Proc. ACM SIGMETRICS, June 2004.
[34] G. Huston, Interconnection, peering, and settlements, in Proc. INET, June 1999.
[35] L. Gao and J. Rexford, Stable Internet routing without global coordination, IEEE/ACM Trans. Networking, vol. 9, pp. 681692, December 2001.
[36] L. Gao, T. G. Griffin, and J. Rexford, Inherently safe backup routing with BGP, in Proc. IEEE
INFOCOM, April 2001.
[37] B. Quoitin, S. Uhlig, C. Pelsser, L. Swinnen, and O. Bonaventure, Interdomain traffic engineering
with BGP, IEEE Communication Magazine, May 2004.
[38] T. Ye and S. Kalyanaraman, A recursive random search algorithm for large-scale network parameter
configuration, in Proc. ACM SIGMETRICS, June 2003.
[39] N. Feamster, J. Winick, and J. Rexford, A model of BGP routing for network engineering, in Proc.
ACM SIGMETRICS, June 2004.
[40] W. Fang and L. Peterson, Inter-AS traffic patterns and their implications, in Proc. IEEE Global
Internet, December 1999.
[41] J. Rexford, J. Wang, Z. Xiao, and Y. Zhang, BGP routing stability of popular destinations, in Proc.
Internet Measurement Workshop, 2002.
[42] J. Fong, A. Gilbert, S. Kannan, and M. Strauss, Better alternatives to OSPF routing, in Proc. Workshop on Approximation and Randomized Algorithms in Communication Networks, 2001.
[43] R. Mahajan, D. Wetherall, and T. Anderson, Negotiation-based routing between neighboring ISPs,
in Proc. USENIX Symposium on Networked Systems Design and Implementation, May 2005.
[44] J. Winick, S. Jamin, and J. Rexford, Traffic engineering between neighboring domains. http:
//www.cs.princeton.edu/jrex/papers/interAS.pdf, July 2002.
[45] N. Feamster, H. Balakrishnan, J. Rexford, A. Shaikh, and J. van der Merwe, The case for separating
routing from routers, in Proc. ACM SIGCOMM Workshop on Future Directions in Network Architecture, August 2004.
[46] O. Bonaventure, S. Uhlig, and B. Quoitin, The Case for More Versatile BGP Route Reflectors.
Internet Draft draft-bonaventure-bgp-route-reflectors-00.txt, July 2004.
[47] A. Farrel, J.-P. Vasseur, and J. Ash, Path computation element (PCE) architecture. Internet Draft
draft-ietf-pce-architecture-00.txt, March 2005.
23