The vast number of smart cloud applications that communicate with the "things" over a variety of physical networks and communication protocols contribute to the rise of complexity in Internet of Things (IoT) systems. The diversity of end-user requirements related to the volume of generated data, its variety, and the velocity of its transmission makes quality of service (QoS) provisioning even more crucial and challenging in IoT. This paper provides a comprehensive and up-to-date survey of QoS support in IoT networks and communication protocols. An analysis of the QoS-aware IoT architectures, layer-dependent QoS metrics, and network resource optimization methods utilized in IoT systems are given. The limitations of the current state-of-the-art studies for efficient delivery of QoS metrics are discussed. The paper concludes with future research directions on end-to-end QoS provisioning in IoT.