Python网络编程入门
纸上得来终觉浅,绝知此事要躬行。

自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了。计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信。用 Python 进行网络编程,就是在 Python 程序本身这个进程内,连接别的服务器进程的通信端口进行通信。

1. TCP/IP 协议
要编写一个计算机之间的网络通讯的程序,首先需要确定双方通信所使用的协议,之后才能够使用这种约定的协议进行数据的传输。
TCP/IP 协议的作用
- TCP/IP是用于因特网(Internet)的通信协议。它是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信。

TCP/IP 协议的分类
- IP - 网际协议
- TCP - 传输控制协议
- UDP - 用户数据报协议

网络编程重要的模块
协议 | 功能用处 | 端口号 | 对应模块模块 |
---|---|---|---|
HTTP | 网页访问 | 80 | httplib、urllib、xmlrpclib |
NNTP | 阅读和张贴新闻文章 | 119 | nntplib |
FTP | 文件传输 | 20 | ftplib、urllib |
SMTP | 发送邮件 | 25 | smtplib |
POP3 | 接收邮件 | 110 | poplib |
IMAP4 | 获取邮件 | 143 | imaplib |
Telnet | 命令行 | 23 | telnetlib |
Gopher | 信息查找 | 70 | gopherlib、urllib |
TCP 和 UDP 的区别
- TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。
- 通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送。而UDP则不为 IP 提供可靠性、流控或差错恢复功能。一般来说,TCP 对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。
IPv4 地址的分类
- 公有地址
- A 类地址:1-127
- B 类地址:128-191
- C 类地址:192-223
- D 类地址:224-239 组播
- E 类地址:240-254
- 私有地址
- A 类地址:10.0.0.0/8
- B 类地址:172.16.0.0/16 - 172.31.0.0/16
- C 类地址:192.168.0.0/24 - 192.168.255.0/24

TCP 的三次握手

TCP 的四次挥手

2. 套接字
Socket是进程间通信(IPC)的一种实现,允许位于不同主机甚至同一主机上不同进程之间进行通信。socket本质上是对TCP/IP的封装,包含进行网络通信必需的五种信息:连接使用的协议,本地主机的 IP 地址,本地进程的协议端口,对方主机的 IP 地址,对方进程的协议端口。
- 套接字可以简单理解为:套接字 = IP 地址 + 端口号
- 进程间通信的实现不只有socket,还有信号量、共享内存、消息队列等方式
套接字的分类 - 根据传输使用的协议类型
- 流式套接字(SOCK_STREAM)
- TCP通信协议,流式传输
- 建立虚链路、双向通信、可靠地传递、面向连接、无边界
- 数据报套接字(SOCK_DGRAM)
- UDP通信协议,数据报传输
- 不可靠地传递、有边界、无连接
- 裸套接字(SOCK_RAW)
- 不使用传输层协议,直接和底层进行数据传输,如IP
- 在编程工作中,基本不会涉及,后续的三种套接字自行了解
套接字的分类 - 根据套接字地址家族(Address Family)
- IPv4 协议簇(AF_INET)
- 不同主机之间进行通信时使用
- IPv6 协议簇(AF_INET6)
- 不同主机之间进行通信时使用
- UNIX 协议簇(AF_UNIX)
- 同一主机上不同进程之间通信时使用
- 不需要将数据向下传递,不占用TCP/UDP协议栈,提升传输效率
套接字的端口号
- TCP 的端口号
- 0-65535
- 传输控制协议,面向连接的协议
- 通信前需要建立虚拟链路,结束后拆除链路
- UDP 的端口号
- 0-65535
- 用户数据报协议,无连接的协议