网络编程概念介绍
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.linkdao.cn 来说,.com 是顶级域;.imooc 是二级域;www 是子域。
域名是由美国非营利性机构维护的,它管理着全世界的域名系统。比如,所有的顶级域(TLD)都是由 ICANN 来规定。
域名解析是通过本地域名解析服务 Resolver 或者远程域名解析服务器获取 IP 地址的过程。
5. 小结
IP 地址可以唯一标识一台主机,Port 可以唯一标识某台主机上的某个应用程序。IP 和 Port 的组合经常叫做 Endpoint,可以唯一标识互联网中的一个应用程序。在网络编程过程中是离不开 IP 和 Port 的,所以掌握 IP 地址的划分,以及端口号的基本知识是非常有必要的。
在互联网中,域名可以唯一标识一台主机,理解域名分配、域名解析过程,对解决一些复杂网络问题有很大的帮助。