Python网络编程入门

纸上得来终觉浅,绝知此事要躬行。

Python网络编程入门

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

Python网络编程入门

1. TCP/IP 协议

要编写一个计算机之间的网络通讯的程序,首先需要确定双方通信所使用的协议,之后才能够使用这种约定的协议进行数据的传输。

TCP/IP 协议的作用

  • TCP/IP是用于因特网(Internet)的通信协议。它是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信。
Python网络编程入门

TCP/IP 协议的分类

  • IP - 网际协议
  • TCP - 传输控制协议
  • UDP - 用户数据报协议
Python网络编程入门

网络编程重要的模块

协议 功能用处 端口号 对应模块模块
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
Python网络编程入门

TCP 的三次握手

Python网络编程入门

TCP 的四次挥手

Python网络编程入门

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
    • 用户数据报协议,无连接的协议