ebook img

Foundation of Python Network Programming PDF

3.7 MB·English
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Foundation of Python Network Programming

BOOKS FOR PROFESSIONALS BY PROFESSIONALS® Rhodes Goerzen Foundations of Python Network RELATED Programming Foundations of Python Network Programming, Third Edition, covers all of the classic topics found in the second edition of this book, including network protocols, network data and errors, email, server architecture, and HTTP and web applications, plus updates for Python 3. Some of the new topics in this edition include: • Extensive coverage of the updated SSL support in Python 3 • How to write your own asynchronous I/O loop • An overview of the “asyncio” framework that comes with Python 3.4 • How the Flask web framework connects URLs to your Python code • How cross-site scripting and cross-site request forgery can be used to attack your web site, and how to protect against them • How a full-stack web framework like Django can automate the round trip from your database to the screen and back • Updated coverage of network protocol layers and data encodings If you’re a Python programmer who needs a deep understanding of how to use Python for network-related tasks and applications, this is the book for you. From web application developers, to systems integrators, to system administrators— this book has everything that you need to know. Shelve in ISBN 978-1-4302-5854-4 Programming Languages/General 54999 User level: Intermediate–Advanced THIRD EDITION SOURCE CODE ONLINE 9781430258544 www.apress.com www.it-ebooks.info For your convenience Apress has placed some of the front matter material after the index. Please use the Bookmarks and Contents at a Glance links to access them. www.it-ebooks.info Contents at a Glance About the Authors �������������������������������������������������������������������������������������������������������������xvii About the Technical Reviewers �����������������������������������������������������������������������������������������xix Acknowledgments �������������������������������������������������������������������������������������������������������������xxi Introduction ���������������������������������������������������������������������������������������������������������������������xxiii ■ Chapter 1: Introduction to Client-Server Networking ��������������������������������������������������������1 ■ Chapter 2: UDP ����������������������������������������������������������������������������������������������������������������17 ■ Chapter 3: TCP �����������������������������������������������������������������������������������������������������������������39 ■ Chapter 4: Socket Names and DNS ����������������������������������������������������������������������������������57 ■ Chapter 5: Network Data and Network Errors �����������������������������������������������������������������75 ■ Chapter 6: TLS/SSL ����������������������������������������������������������������������������������������������������������93 ■ Chapter 7: Server Architecture ��������������������������������������������������������������������������������������115 ■ Chapter 8: Caches and Message Queues �����������������������������������������������������������������������137 ■ Chapter 9: HTTP Clients �������������������������������������������������������������������������������������������������151 ■ Chapter 10: HTTP Servers ����������������������������������������������������������������������������������������������169 ■ Chapter 11: The World Wide Web ����������������������������������������������������������������������������������183 ■ Chapter 12: Building and Parsing E-Mail ����������������������������������������������������������������������223 ■ Chapter 13: SMTP ����������������������������������������������������������������������������������������������������������241 ■ Chapter 14: POP ������������������������������������������������������������������������������������������������������������259 ■ Chapter 15: IMAP �����������������������������������������������������������������������������������������������������������267 v www.it-ebooks.info ■ Contents at a GlanCe ■ Chapter 16: Telnet and SSH �������������������������������������������������������������������������������������������289 ■ Chapter 17: FTP �������������������������������������������������������������������������������������������������������������317 ■ Chapter 18: RPC �������������������������������������������������������������������������������������������������������������331 Index ���������������������������������������������������������������������������������������������������������������������������������349 vi www.it-ebooks.info Introduction It is an exciting moment for the Python community. After two decades of careful innovation that saw the language gain features such as context managers, generators, and comprehensions in a careful balance with its focus on remaining simple in both its syntax and its concepts, Python is finally taking off. Instead of being seen as a boutique language that can be risked only by top-notch programming shops such as Google and NASA, Python is now experiencing rapid adoption, both in traditional programming roles, such as web application design, and in the vast world of “reluctant programmers,” such as scientists, data specialists, and engineers—people who learn to program not for its own sake but because they must write programs if they are to make progress in their field. The benefits that a simple programming language offers for the occasional or nonexpert programmer cannot, I think, be overstated. Python 3 After its debut in 2008, Python 3 went through a couple of years of reworking and streamlining before it was ready to step into the role of its predecessor. But as it now enters its second half-decade, it has emerged as the preferred platform for innovation in the Python community. Whether one looks at fundamental improvements, like the fact that true Unicode text is now the default string type in Python 3, or at individual improvements, like correct support for SSL, a built-in asyncio framework for asynchronous programming, and tweaks to Standard Library modules large and small, the platform that Python 3 offers the network programmer is in nearly every way improved. This is a significant achievement. Python 2 was already one of the best languages for making programmers quickly and effectively productive on the modern Internet. This book is not a comprehensive guide to switching from Python 2 to Python 3. It will not tell you how to add parentheses to your old print statements, rename Standard Library module imports to their new names, or debug deeply flawed network code that relied on Python 2’s dangerous automatic conversion between byte strings and Unicode strings—conversions that were always based on rough guesswork. There are already excellent resources to help you with that transition or even to help you write libraries carefully enough so that their code will work under both Python 2 and Python 3, in case you need to support both audiences. Instead, this book focuses on network programming, using Python 3 for every example script and snippet of code at the Python prompt. These examples are intended to build a comprehensive picture of how network clients, network servers, and network tools can best be constructed from the tools provided by the language. Readers can study the transition from Python 2 to Python 3 by comparing the scripts used in each chapter of the second edition of this book with the listings here in the third edition—both of which are available at https://github.com/brandon-rhodes/fopnp/tree/m/ thanks to the excellent Apress policy of making source code available online. The goal in each of the following chapters is simply to show you how Python 3 can best be used to solve modern network programming problems. By focusing squarely on how to accomplish things the right way with Python 3, this book hopes to prepare both the programmer who is getting ready to write a new application from the ground up and the programmer preparing to transition an old code base to the new conventions. Both programmers should come away knowing what correct networking code looks like in Python 3 and therefore knowing the look and flavor of the kind of code that ought to be their goal. xxiii www.it-ebooks.info ■ IntroduCtIon Improvements in This Edition There are several improvements by which this book attempts to update the previous edition, beyond the move to Python 3 as its target language and the many updates to both Standard Library and third-party Python modules that have occurred in the past half-decade. • Every Python program listing is now written as a module. That is, each one performs its imports and defines its functions or classes but then carefully guards any import-time actions inside an if statement that fires only if the module __name__ has the special string value '__main__' indicating that the module is being run as the main program. This is a Python best practice that was almost entirely neglected in the previous edition of this book and whose absence made it more difficult for the sample listings to be pulled into real codebases and used to solve reader problems. By putting their executable logic at the left margin instead of inside an if statement, the older program listings may have saved a line or two of code, but they gave novice Python programmers far less practice in how to lay out real code. • Instead of making ad hoc use of the raw sys.argv list of strings in a bid to interpret the command line, most of the scripts in this book now use the Standard Library argparse module to interpret options and arguments. This not only clarifies and documents the semantics that each script expects during invocation but also lets the user of each script use the –h or --help query option to receive interactive assistance when launching the script from the Windows or Unix command line. • Program listings now make an effort to perform proper resource control by opening files within a controlling with statement that will close the files automatically when it completes. In the previous edition, most listings relied instead on the fact that the C Python runtime from the main Python web site usually assures that files are closed immediately thanks to its aggressive reference counting. • The listings, for the most part, have transitioned to the modern format() method for performing string interpolation and away from the old modulo operator hack string % tuple that made sense in the 1990s, when most programmers knew the C language, but that is less readable today for new programmers entering the field—and less powerful since individual Python classes cannot override percent formatting like they can with the new kind. • The three chapters on HTTP and the World Wide Web (Chapters 9 through 11) have been rewritten from the ground up with an emphasis on better explaining the protocol and on introducing the most modern tools that Python offers the programmer writing for the Web. Explanations of the HTTP protocol now use the Requests library as their go-to API for performing client operations, and Chapter 11 has examples in both Flask and Django. • The material on SSL/TLS (Chapter 6) has been completely rewritten to match the vast improvement in support that Python 3 delivers for secure applications. While the ssl module in Python 2 is a weak half-measure that does not even verify that the server’s certificate matches the hostname to which Python is connecting, the same module in Python 3 presents a much more carefully designed and extensive API that provides generous control over its features. This edition of the book is therefore a better resource for the learning programmer simply in terms of how the listings and examples are constructed, even apart from the improvements that Python 3 has made over previous versions of the language. xxiv www.it-ebooks.info ■ IntroduCtIon The Network Playground The source code to the program listings in this book is available online so that both current owners of this book and potential readers can study them. There is a directory for each chapter of this edition of the book. You can find the chapter directories here: https://github.com/brandon-rhodes/fopnp/tree/m/py3 But program listings can go only so far toward supporting the curious student of network programming. There are many features of network programming that are difficult to explore from a single host machine. Thus, the source code repository for the book provides a sample network of 12 machines, each implemented as a Docker container. A setup script is provided that builds the images, launches them, and networks them. You can find the script and the images in the source code repository here: https://github.com/brandon-rhodes/fopnp/tree/m/playground You can see the 12 machines and their interconnections in Figure 1. The network is designed to resemble a tiny version of the Internet. Figure 1. The network playground’s topology • Representing the typical situation of a client in a home or coffee shop are the client machines behind modemA and modemB that not only offer no services to the Internet but that are in fact not visible on the wider Internet at all. They possess merely local IP addresses, which are meaningful only on the subnet that they share with any other hosts in the same home or coffee shop. When they make connections to the outside world, those connections will appear to originate from the IP addresses of the modems themselves. • Direct connections allow the modems to connect to an isp gateway out on the wider Internet, which is represented by a single backbone router that forwards packets between the networks to which it is connected. xxv www.it-ebooks.info ■ IntroduCtIon • example.com and its associated machines represent the configuration of a simple service-oriented machine room. Here, no network translation or masquerading is taking place. The three servers behind example.com have service ports that are fully exposed to client traffic from the Internet. • Each of the service machines ftp, mail, and www has correctly configured daemons up and running so that Python scripts from this book can be run on the other machines in the playground to connect successfully to representative examples of each service. • All of the service machines have correctly installed TLS certificates (see Chapter 6), and the client machines all have the example.com signing certificate installed as a trusted certificate. This means Python scripts demanding true TLS authentication will be able to achieve it. The network playground will continue to be maintained as both Python and Docker continue to evolve. Instructions will be maintained in the repository for how to download and run the network locally on your own machine, and they will be tweaked based on user reports to make sure that a virtual machine, which offers the playground, can be run by readers on Linux, Mac OS X, and Windows machines. With the ability to connect and run commands within any of the playground machines, you will be able to set up packet tracing at whichever point on the network you want to see traffic passing between clients and servers. The example code demonstrated in its documentation, combined with the examples and instruction in this book, should help you reach a solid and vivid understanding of how networks help clients and servers communicate. xxvi www.it-ebooks.info Chapter 1 Introduction to Client-Server Networking This book explores network programming in the Python language. It covers the basic concepts, modules, and third-party libraries that you are likely to use when communicating with remote machines using the most popular Internet communication protocols. The book lacks the space to teach you how to program in Python if you have never seen the language before or if you have never even written a computer program at all; it presumes that you have already learned something about Python programming from the many excellent tutorials and books on the subject. I hope that the Python examples in the book give you ideas about how to structure and write your own code. But I will be using all sorts of advanced Python features without explanation or apology—though, occasionally, I might point out how I am using a particular technique or construction when I think it is particularly interesting or clever. On the other hand, this book does not start by assuming you know any networking! As long as you have ever used a web browser or sent an e-mail, you should know enough to start reading this book at the beginning and learn about computer networking along the way. I will approach networking from the point of view of an application programmer who is either implementing a network-connected service—such as a web site, an e-mail server, or a networked computer game—or writing a client program that is designed to use such a service. Note that you will not, however, learn how to set up or configure networks from this book. The disciplines of network design, server room management, and automated provisioning are full topics all on their own, which tend not to overlap with the discipline of computer programming as covered in this particular book. While Python is indeed becoming a big part of the provisioning landscape thanks to projects such as OpenStack, SaltStack, and Ansible, you will want to search for books and documentation that are specifically about provisioning and its many technologies if you want to learn more about them. The Building Blocks: Stacks and Libraries As you begin to explore Python network programming, there are two concepts that will appear over and over again. • The idea of a protocol stack, in which simpler network services are used as the foundation on which to build more sophisticated services. • The fact that you will often be using Python libraries of previously written code—whether modules from the built-in standard library that ships with Python or packages from third-party distributions that you download and install—that already know how to speak the network protocol that you want to use. 1 www.it-ebooks.info Chapter 1 ■ IntroduCtIon to ClIent-Server networkIng In many cases, network programming simply involves selecting and using a library that already supports the network operations that you need to perform. The major purposes of this book are to introduce you to several key networking libraries available for Python while also teaching you about the lower-level network services on which those libraries are built. Knowing the lower-level material is useful, both so that you understand how the libraries work and so that you will understand what is happening when something at a lower level goes wrong. Let’s begin with a simple example. Here is a mailing address: 207 N. Defiance St Archbold, OH I am interested in knowing the latitude and longitude of this physical address. It just so happens that Google provides a Geocoding API that can perform such a conversion. What would you have to do to take advantage of this network service from Python? When looking at a new network service that you want to use, it is always worthwhile to start by finding out whether someone has already implemented the protocol—in this case, the Google Geocoding protocol—which your program will need to speak. Start by scrolling through the Python Standard Library documentation, looking for anything having to do with geocoding. http://docs.python.org/3/library/ Do you see anything about geocoding? No, neither do I. But it is important for a Python programmer to look through the Standard Library’s table of contents pretty frequently, even if you usually do not find what you are looking for, because each read-through will make you more familiar with the services that are included with Python. Doug Hellmann’s “Python Module of the Week” blog is another great reference from which you can learn about the capabilities that come with Python thanks to its Standard Library. Since in this case the Standard Library does not have a package to help, you can turn to the Python Package Index, an excellent resource for finding all sorts of general-purpose Python packages contributed by other programmers and organizations from across the world. You can also, of course, check the web site of the vendor whose service you will be using to see whether it provides a Python library to access it. Or, you can do a general Google search for Python plus the name of whatever web service you want to use and see whether any of the first few results link to a package that you might want to try. In this case, I searched the Python Package Index, which lives at this URL: https://pypi.python.org/ There I entered geocoding, and I immediately found a package that is named pygeocoder, which provides a clean interface to Google’s geocoding features (though, you will note from its description, it is not vendor-provided but was instead written by someone besides Google). http://pypi.python.org/pypi/pygeocoder/ This is such a common situation—finding a Python package that sounds like it might already do exactly what you want and that you want to try it on your system—that I should pause for a moment and introduce you to the best Python technology for quickly trying a new library: virtualenv! In the old days, installing a Python package was a gruesome and irreversible act that required administrative privileges on your machine and that left your system Python install permanently altered. After several months of heavy Python development, your system Python install could become a wasteland of dozens of packages, all installed by hand, and you could even find that new packages you tried to install would break because they were incompatible with the old packages sitting on your hard drive from a project that ended months ago. 2 www.it-ebooks.info

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.