It is well-known that TCP performance may degrade over paths that include wireless links, where packet losses are often not related to congestion. We examine this problem in the context of the GSM digital cellular network, where the wireless link is protected by a reliable link layer protocol. We propose the use of multi-layer tracing as a powerful methodology to analyze the complex protocol interactions between the layers. Our measurements show that TCP throughput over GSM is mostly ideal and that spurious timeouts are extremely rare. The multi-layer tracing tool we developed allowed us to identify the primary causes of degraded performance: (1) inefficient interactions with TCP/IP header compression, and (2) excessive queuing caused by overbuffered links. We conclude that link layer solutions alone can solve the problem of TCP over wireless links. We further argue that it is imperative to deploy active queue management and explicit congestion notification mechanisms in wide-area wireless networks; which we expect will be the bottleneck in a future Internet.