网络编程概念介绍

1. 前言

我们知道计算机网络就是将各种设备通过有线或无线连接在一起,这些设备有终端设备,比如 PC、手机、打印机等;还有各种网络核心设备,比如路由器、交换机、网关等。通常把网络设备叫做节点,这些节点都工作在计算机网络的 TCP/IP 参考模型之上。

链路层实现节点之间的数据转发。比如以太网协议,包含独立的以太网帧头,帧头中包含了源 MAC 地址、目标 MAC 地址,通过 MAC 地址实现节点之间的数据帧转发。

网络层也叫 Internet 协议层,主要职责就是提供端到端的网络传输,比如主机到主机的通信。网络层最重要的一个设备就是路由器路由器的主要职责是提供路由选择转发,将分组从源主机转发到目的主机。每台主机和路由器的每个端口都配有 IP 地址,路由器是通过 IP 地址实现分组转发的。分组在路由器之间的转发是一个逐跳转发的过程。网络层不保证分组传输的可靠性。

传输层包含两个非常重要的协议:TCP 和 UDP。TCP 是可靠传输协议,面向连接的,可以保证数据段(Segment)顺序。UDP 是不可靠传输协议,无连接的,不保证数据报(Datagram)的顺序。一台主机可以同时运行多个 TCP 或 UDP 应用程序,不同应用程序之间是通过端口号(Port)来识别。

2. IP 地址

IP 地址有 IPv4 和 IPv6 两个版本。IPv4 地址长度是 32 bit,4 个字节,每个字节是独立取值,通常用点分十进制的形式表示。例如,192.168.0.100。IPv4 地址范围是 0.0.0.0 ~ 255.255.255.255,最多包含 4294967296(2^32) 个 IP 地址。而 IPv6 的地址格式是八元组形式,比如 2001:0DB8::1428:57ab。

本节只讨论 IPv4 地址。IPv4 地址通常划分成网络 ID主机 ID两部分。比如:

图片描述

IP 地址分类划分如下:

分类 起始地址 结束地址
A 0.0.0.0 127.255.255.255
B 128.0.0.0 191.255.255.255
C 192.0.0.0 223.225.255.255
D 224.0.0.0 239.255.255.255

IP 地址分类划分缺乏灵活性,对于 A 类地址来说,网络 ID 只有 2^7 = 128 个,但是主机 ID 多达 2^24 = 16777216 个,主机 ID 浪费很大。对于 C 类地址来说,网络 ID 可以有 2^21 = 2097152 个,但是主机 ID 只有 2^8 = 256 个,对于有些组织来说主机 ID 不够划分。于是 1993 年出现了 CIDR(Classless Inter-Domain Routing)的编址策略,叫做无类别域间路路由选择

CIDR 编址是一种 IP 地址的压缩表示方式,将 IP 地址分为网络前缀主机标识两部分,形如 A.B.C.D/L 的表示方式,L 是一个小于 32 的十进制数字,代表网络前缀占用 L 个比特,主机标识占用 32 - L 个比特。比如,200.101.80.0/20 表示网络前缀占用 20 个比特,主机标识占用 12 个比特。

在 CIDR 编址方式下,如何通过 IP 地址快速确定网络 ID 呢?是通过子网掩码来确定的。对于形如 A.B.C.D/L 的子网,子网掩码是由 L 个 bit 1 和 32 - L 个 bit 0 组成的二进制数。只要把 A.B.C.D 和子网掩码做一个按位与(&)运算,就可以得到网络 ID。可以说,形如 A.B.C.D/L 的表示,可以唯一确定一个网络 ID,我们通常把 A.B.C.D/L 表示叫做网段。你可以说 A.B.C.D/L 表示了一个网段,网段就是形如 A.B.C.D/L 的表示形式。

比如,200.101.80.0/20 网段的子网掩码的二进制形式是 11111111 11111111 11110000 00000000,十进制形式是 255.255.240.0。将 200.101.80.0 和 255.255.240.0 做按位与(&)运算,得到的网络 ID 是 200.101.80.0。

那么 IP 地址 200.101.96.1 是 200.101.80.0/20 网段的 IP 吗?我们只需要把 200.101.96.1 和 255.255.240.0 做一个按位与(&)运算,查看结果是否等于 200.101.80.0 即可。

采用 CIDR 编码方式优势如下:

  • 简单灵活
  • 有效利用 IP 地址空间
  • 减小路由表规模。

比如 200.101.80.0/20 网段中的 IP 地址 200.101.80.100,如果按照分类,属于 C 类地址,网络 ID 占用 24 个 bit,主机 ID 占用 8 个 bit;如果采用 CIDR 方式,网络 ID 占用 20 个 bit,主机 ID 占用 12 个 bit。对于主机较多的网络,极大地提高了 IP 地址的利用率。

3. 端口号

端口号是用 16 bit 无符号整数表示的,取值范围是 0~65535,总共可以分配 65536 个端口号。端口号属于稀缺资源,是由 Internet Assigned Numbers Authority (IANA)统一管理和分配的。端口号当前分配状况:

  • 0 ~ 1023
    此区间内的端口号叫做知名端口号,已经被系统或者是一些知名的服务所占用,比如:
端口号 用途
20 , 21 用于 FTP 协议
23 用于 telnet 协议
80 用于著名的 HTTP 服务
443 用于 HTTPS 服务
  • 1023 ~ 65535
    此区间端口号也有很多被知名的应用占有,比如:
端口号 用途
1433 用于 SQL Server 服务等等
1935 用于 RTMP 服务
3306 用于 MySQL 服务
8080 作为 HTTP 服务的另外一个端口号

4. 域名及域名解析

不管是 IPv4 地址,还是 IPv6 地址,都是用一串数字表示的。计算机喜欢处理数字化的 IP 地址,而我们人类并不喜欢数字,因为数字不直观、不便于记忆、不利于使用。试想一下,如果让你去记忆各大网站的 IP 地址,我相信你能记住的 IP 地址不会超过 10 个。

那么该如何化解这个尴尬呢?科学家们又发明了一套字符型的地址方案,即用主机名(Host Name)来唯一标识一台主机,主机名是用我们人类自己的语言来命名,当然目前主要是英语了。这里需要强调的是 Host Name 也可以唯一标识一台主机,是另外一套地址方案。只不过 Host Name 是方便人类使用的,而计算机还是用 IP 地址。

在互联网中,有不计其数的主机,要保证这些主机的唯一性,必须用一套统一的 Host Name 编码方案。目前应用最广泛的就是域名系统(DNS,Domain Name System),DNS 是一套分布式系统,DNS 所包含的两项最主要的工作就是:域名分配域名解析域名分配就是为互联网中的主机分配一个唯一的域名域名解析就是将域名转换为IP 地址的过程。

域名是一颗树形结构,包含了许多层级:

  • 根级域,是指一个无名的树根。
  • 顶级域,顶级域分为 generic TLDs(gTLDs),country-code TLDs(ccTLDs)、internationalized country-code TLDs(IDN,ccTLDs)、infrastructure TLD。我们在图中列举的 net、edu、org、gov、com 是指 gTLDs,即通用顶级域。比如 .com。
  • 二级域,是指顶级域的下一级。比如 .imooc。
  • 子域,是指二级域以下的所有层级。其实也可以叫做三级域、四级域等。比如 www。

比如,拿 www.imooc.com 来说,.com 是顶级域;.imooc 是二级域;www 是子域。

域名是由美国非营利性机构维护的,它管理着全世界的域名系统。比如,所有的顶级域(TLD)都是由 ICANN 来规定。

域名解析是通过本地域名解析服务 Resolver 或者远程域名解析服务器获取 IP 地址的过程。

5. 小结

IP 地址可以唯一标识一台主机,Port 可以唯一标识某台主机上的某个应用程序。IP 和 Port 的组合经常叫做 Endpoint,可以唯一标识互联网中的一个应用程序。在网络编程过程中是离不开 IP 和 Port 的,所以掌握 IP 地址的划分,以及端口号的基本知识是非常有必要的。

在互联网中,域名可以唯一标识一台主机,理解域名分配、域名解析过程,对解决一些复杂网络问题有很大的帮助。