1 Introduction
Ubiquitous access to data is becoming a reality due to the large-scale deployment of wireless communication services and advances in mobile computing devices. However, mobile computing environments exhibit operating conditions that differ greatly from their wired counterparts. In particular, applications must be able to tolerate the highly dynamic channel conditions that arise as users move about an environment. Moreover, computing devices often vary in terms of display characteristics, processor speed, memory size, and battery lifetimes. For mobile applications to operate effectively and optimally in such environments, the communication-related software must be able to adapt to dynamic conditions at runtime [6].