  Software-Defined Networking (SDN) is an emerging paradigm that promises to
change this state of affairs, by breaking vertical integration, separating the
network's control logic from the underlying routers and switches, promoting
(logical) centralization of network control, and introducing the ability to
program the network. The separation of concerns introduced between the
definition of network policies, their implementation in switching hardware, and
the forwarding of traffic, is key to the desired flexibility: by breaking the
network control problem into tractable pieces, SDN makes it easier to create
and introduce new abstractions in networking, simplifying network management
and facilitating network evolution. In this paper we present a comprehensive
survey on SDN. We start by introducing the motivation for SDN, explain its main
concepts and how it differs from traditional networking, its roots, and the
standardization activities regarding this novel paradigm. Next, we present the
key building blocks of an SDN infrastructure using a bottom-up, layered
approach. We provide an in-depth analysis of the hardware infrastructure,
southbound and northbound APIs, network virtualization layers, network
operating systems (SDN controllers), network programming languages, and network
applications. We also look at cross-layer problems such as debugging and
troubleshooting. In an effort to anticipate the future evolution of this new
paradigm, we discuss the main ongoing research efforts and challenges of SDN.
In particular, we address the design of switches and control platforms -- with
a focus on aspects such as resiliency, scalability, performance, security and
dependability -- as well as new opportunities for carrier transport networks
and cloud providers. Last but not least, we analyze the position of SDN as a
key enabler of a software-defined environment.
