Communication stacks addressing the Connectivity space are some reduced-size & complexity networking models, addressing small, cheap, low-power intelligent devices, covering the edge tier of IoT (Internet of Things) – the ubiquitous connectivity, the “anytime, anywhere” paradigm of wireless connectivity.
The basic functionalities that provide a reliable and coherent communication of the Internet model must be addressed by the composing layers – ensuring (from lowest to highest level):
- the physical and logical link connection, addressing of destination stations, data protection against errors and its integrity assurance
- flow control and end-to-end data transmission, hiding the underlying topologies
- host-to-host communication needs – graceful management of establishment, control and termination of connection
- and the user scope within which applications create data and communicate it to other applications on another or the same host, making use of the layers below.
Designing a software that copes with this purpose is a really engaging and, at the same time, laborious effort. Structured approach, system decomposition, multi-faceted perspective (static, dynamic, functional views) ease this effort and permits a sequential creation process with manageable products.
Each protocol layer is strictly defined, it carries out specific functionalities, conveying data and interacting specifically with different modules, imposing operational states in the whole system.
It is important to make sure that for each layer all functions are properly addressed, they work robustly and they do not produce hazardous artefacts (behaviors or results). Also, the correct and coherent communication with the adjacent system components (like horizontal layer components or lower and upper communication layers) must be ensured.
With a layered approach in the system design one can focus on specific functionalities, with progressive and palpable outcomes, with controllable inputs and outputs. In this way, the results are modular, completely defined and the functional coverage is much easier to be achieved. The functional verification of developed items can be performed easily, initially with unit tests and, subsequently, with integration tests.
Gluing together the resulting modules can be easily performed if one respects a coherent interface.
Keeping the layered separated in a communication stack brings value in terms of portability – one can re-use the same implementation product in a different stack – the functionalities are there, they are atomic relative to the protocol that they implement. One can isolate them with ease and have the certitude of reliability, and adapt them to the new product.
Modularity is the key to scalability, and this one can be achieved with little effort when layers are separated – multiple presence of the stack on the same media, multiple protocols sharing a lower single one or any other scalar system – modules are self-contained contexts, transparent to the external system, they define a well-structured interface and usually can be safely multiplied and integrated into more complex systems.
As opposed, in a monolithic design, duplication of functionalities, extensions in stack, replacement of protocols, advancement to new specification revisions for a protocol comes along with direct impact on the adjacent layers.
Furthermore, various hardware acceleration implementations implement well defined functions and algorithms in the communication protocols, which usually respect layer specifications in terms of interface – this makes it really easy to be integrated with a software component that is modular designed.