这是一个重在实践的计算机网络通信教程,旨在让读者快速写出相关功能的Python代码,因而没有详尽的概念与原理介绍。
假设您是一个邮递员,您需要将包裹送至某个地方。为了完成任务,您需要知道这个地方的地址。计算机之间的通信同样要知道对方的地址,在计算机网络中,IP地址是一种常用的地址,它常常表示为x.x.x.x,其中x是0~255的整数。
实际上,IP地址(这里特指IPv4)是一个32位的无符号整数。我们更常见的IP地址形式是点分十进制的形式,例如192.168.1.1。32位的无符号整数从高位到低位每8位转为十进制数(0~255),并用点分开,即为点分十进制。
通过IP地址,我们标识了设备,使他们有了网络通信的地址。
按照IP地址的逻辑层次来分,IP地址可以分为A,B,C,D,E等5类。A类IP地址用于大型网络,B类IP地址用于中型网络,C类用于小规模网络,最多只能连接256台设备,D类IP地址用于多目的地址发送,E类则保留为今后使用。
A类:由1字节(每个字节是8位)的网络地址和3个字节主机地址组成,网络地址的最高位必须是“0”,即第一段数字范围为1~127。每个A类地址可连接$2^{24}-2$台主机,Internet有$2^7-2=126$个A类地址。
B类:由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,即第一段数字范围为128~191。每个B类地址可连接$2^{16}-2=65534$台主机,Internet有$2^{14}-2=16382$个B类地址。
C类:是由3个字节的网络地址和1个字节的主机地址组成,网络地址的最高位必须是“110”,即第一段数字范围为192~223。每个C类地址可连接$2^8-2=254$台主机,Internet有$2^{21}-2$个C类地址。
D类:不分网络地址和主机地址。第一个字节以“1110”开始,第一个字节的数字范围为224~239,是多点播送地址,用于多目的地信息的传输,和作为备用。
E类:不分网络地址和主机地址。以“11110”开始,即第一段数字范围为240~254。E类地址保留,仅作实验和开发用。
显然,IP地址最多有$255^4$个,再扣除一些特殊地址后,远少于现在的设备数量。因此,IP地址是不够用的。为了解决这个问题,需要区分内网和外网(公网)。公网上的设备IP各不相同。内网中的多台计算机有不同的内网IP,通过网络地址转换(NAT),它们将变成一个公网IP,从而减少对公网IP资源的占用。不同的内网中,会有相同的内网IP存在,这是很正常的。
内网中的设备可以通过NAT访问外网的设备,但是外网上的设备无法直接访问内网的中的设备。
以下IP地址专用于内网IP,公网上没有这些IP:
10.0.0.0~10.255.255.255,默认子网掩码:255.0.0.0172.16.0.0~172.31.255.255,默认子网掩码:255.240.0.0192.168.0.0~192.168.255.255,默认子网掩码:255.255.0.00.0.0.0:任意地址。表示当前子网中的所有主机。
255.255.255.255:广播地址。作为目的地址时,数据会发往当前子网的所有主机。
127.0.0.1:环回地址。作为目的地址时,数据会发给本身。其作用是测试设备自身的软件系统。
169.254.0.0/24:本地链路地址。如果一个网络设备获取IP地址的方式被设置成了自动获取方式,但是该设备在网络上又没有找到可用的DHCP服务器,那么该设备就会使用169.254.0.0/16网段的某个地址来进行临时通信。(通常表明没连上网)
如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口有65536(即:$2^{16}$)个。端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535($=2^{16}-1$)。
子网掩码是一个32位无符号整数(也可以用点分十进制的形式表示),用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。
例如:
| IP地址 | 子网掩码 | |
|---|---|---|
| 十进制 | 192.168.1.1 | 255.255.255.0 |
| 二进制 | 11000000 10100000 00000001 00000001 | 11111111 11111111 11111111 00000000 |
子网掩码为1的部分所对应的IP地址的部分是网络号,子网掩码为0的部分所对应的IP地址的部分是子网中的主机号。
所谓“协议”,是指计算机在通信过程中的共同约定。TCP/IP协议是指能够在多个不同网络间实现信息传输的协议簇,包括FTP、SMTP、TCP、UDP、IP等协议。前面所介绍的就是IP协议。在下一节中,会介绍TCP和UDP协议。