从以前笔记的四个程序中(http://www.cnblogs.com/take-fetter/p/8278864.html),咱们能够看出分别使用了谷歌地理编码API(对URL表示地理信息查询和如何获取JSON数据都进行的封装)、URL(标识了可经过HTTP获取的文档)、HTTP(支持面向文档的命令,例如GET,使用了原始的TCP/IP套接字,也是在这里遇到了一点麻烦,须要自行处理301错误)、TCP/IP套接字(只处理字符串的发送和接收)。层层深刻,Python对各网络层都提供了很是全面的支持。显然也能看出来,越底层程序的质量也明显随之降低。高层的网络协议一般会将其底层网络细节隐藏(相似于OSI参考模型中下层为上层提供服务的概念)。正确实现网络协议并不是易事(类如咱们遇到的301问题和须要使用代理访问的问题),所以咱们尽量使用标准库和第三方库来实现(造轮子难啊:( )。html
socket()API之下的几层:Transmission Control Protocol (TCP)、Internet Protocol (IP)、最底层的链路层(书上是这么写的,可是按照OSI参考模型应该还有物理层吧)python
书中在第一章中还提到了如下相关知识:git
Python3对字符串和底层字节序列作了明显的区分(字节Byte(8位二进制数)和字符串(包含Unicode字符)),两者的转化使用编码(字符串to字节,encode()方法)和解码(字节to字符串,decode()方法)操做。github
例如书中的程序我作了一点简单的改变网络
#!/usr/bin/env python3 # Foundations of Python Network Programming, Third Edition # https://github.com/brandon-rhodes/fopnp/blob/m/py3/chapter01/stringcodes.py if __name__ == '__main__': # Translating from the outside world of bytes to Unicode characters. input_bytes = b'\xff\xfe4\x001\x003\x00 \x00i\x00s\x00 \x00i\x00n\x00.\x00' input_characters = input_bytes.decode('utf-16') print(repr(input_characters)) # Translating characters back into bytes before sending them. output_characters = 'We copy you down, Eagle.\n' output_bytes = output_characters.encode('utf-8') with open('eagle.txt', 'wb') as f: # wb以二进制形式写入文件eagle.txt f.write(output_bytes) print(output_bytes)
输出结果为socket
'413 is in.' b'We copy you down, Eagle.\n'
而写入文件的结果为ide
We copy you down, Eagle.
将主机名转换为IP地址编码
import socket if __name__ == '__main__': hostname = 'www.qq.com' addr = socket.gethostbyname(hostname) print('The IP address of {} is {}'.format(hostname, addr))
IPv4(32位二进制数)spa
特殊的IP地址段 127.*.*.*(预留地址段) 10.*.*.* 172.16-31.*.* 192.168.*.* (私有子网 private subnet)计算机网络
IPv6(32*4=128位二进制数)
补充下 IP头部20字节,TCP头部20字节,UDP头部8字节,以太网的最大容量(包含头部)共1500B
关于计算机网络部分的知识,仍是不细讲了,回顾一下基础知识。