從以前筆記的四個程序中(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
關於計算機網絡部分的知識,仍是不細講了,回顧一下基礎知識。