网络编程概念介绍
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 地址的划分,以及端口号的基本知识是非常有必要的。
在互联网中,域名可以唯一标识一台主机,理解域名分配、域名解析过程,对解决一些复杂网络问题有很大的帮助。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。