大多数网络模型按层(layer)的方式来组织以减少协议设计的复杂性。在分层网络模型中,每一层都为上一层提供一定的服务,而将如何实现本层服务的细节对上一层加以屏蔽(在初期的学习项目过程中,也不应该拘泥于细节)。上层只知道下层提供了什么功能以及对应功能的接口,而不关心下层是如何实现这些功能。分层的思想也是设计大型软件的一种重要思想,有些操作系统就是基于分层的思想设计和实现的。
为确保使用不同硬件和底层协议构建的网络能够相互通信,ISO(国际标准化组织)制定了一套被称为OSI(开放系统互联)的规范。但由于种种原因,OSI模型始终没有得到广泛应用。当前普遍使用的是TCP/IP模型。几乎所有的互联网设备都支持TCP/IP协议。TCP/IP协议已经成为事实上的国际标准和工业标准。ISO模型和TCP/IP模型的层次划分与对比如图所示。
就像身份证一样,计算机必须要有一个唯一的标识来区分网络上的每台计算机以进行相互通信,也就是网络上的每台计算机都需要唯一的标识。常用的有两种:物理地址(例如网卡地址)和IP地址。
对于以太网,物理地址就是一个48位的位串,且此地址在网卡的生产过程中就已经固定,不可更改,全球唯一。在Shell中输入ifconfig
(Windows Shell:ipconfig
)可以查看本机的物理地址(不带参数的ifconfig
命令可以显示当前启动的网络接口)。
[root@localhost Users]# ifconfig
这里使用的虚拟机网络适配器配置是NAT模式,并没有显示th0信息条目。
eth0 Link encap:Ethernet HWaddr 00:0D:87:9F:47:B8
这里的00:0D:87:9F:47:B8就是以16进制表示的48位(6字节)网卡地址,每个字节用冒号隔开。对于多块网卡,每块网卡代表计算机的一个网络接口,常称为多宿主计算机(Multihomed Computer)。
TCP/IP协议能够使计算机之间进行与底层物理网络无关的通信,两台计算机位于不同的局域网内也能通过TCP/IP进行通信。由于物理地址依赖于底层网络,而不同的底层网络采用不同的物理地址,因此要使用与底层硬件技术无关的通用地址来标识网络上的每台计算机,这就是IP地址。
IP地址由32个bit位构成,分为两部分:网络ID(计算机所在的网络号)和主机ID(计算机所在的网络给该计算机分配的主机号)。
32位(4字节)的IP地址为了表示方便也是每个字节隔开,但是使用的是点号。例如,腾讯网(www.qq.com)的IP地址是202.205.3.195。一个字节能够表示的数的范围是0000000011111111*(即*0255)。所以,在理论上的IP地址范围是:0.0.0.0~255.255.255.255,但实际上有的地址是专有的,并不能用于标识计算机。
IP地址按一定的格式分成5类:A类、B类、C类、D类和E类。
** A类IPv4地址** | B类IPv4地址 | C类IPv4地址 | D类IPv4地址 | E类IPv4地址 | |
---|---|---|---|---|---|
网络标志位 | 0 | 10 | 110 | 1110 | 11110 |
IP地址范围 | 1.0.0.0~127.255.255.255 | 128.0.0.0~191.255.255.255 | 192.0.0.0~223.255.255.255 | 224.0.0.0~239.255.255.255 | 240.0.0.0~247.255.255.255 |
可用IP地址范围 | 1.0.0.1~127.255.255.254 | 128.0.0.1~191.255.255.254 | 192.0.0.1~223.255.255.254 | ||
是否可以分配给主机使用 | 是 | 是 | 是 | 否 | 否 |
网络数量(个) | 126 (27-2) | 16384 (214) | 2097152 (221) | — | — |
每个网络中可容纳主机数(个) | 16777214 (224-2) | 65534 (216-2) | 254 (28-2) | — | — |
适用范围 | 大量主机的大型网络 | 中等规模主机数的网络 | 小型局域网 | 留给Internet体系结构委员会(IAB)使用【组播地址】 | 保留,仅作为搜索、Internet的实验和开发用 |
127.0.0.1是一个特殊的地址,它代指本机,可用于测试本机上的TCP/IP协议是否工作正常。
[root@localhost Users]# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.092 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.093 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.088 ms
^C
--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.048/0.080/0.093/0.019 ms
TCP/IP上的每台主机还有一个32位的子网掩码,用于区分IP地址的网络号和主机号。将IP地址与子网掩码进行按位“与”运算即得到IP地址的网络号(一台主机所处的网络的编号)。例如,一台主机的IP地址为222.197.168.0,对应的子网掩码为255.255.255.0,按位“与”运算后的结果为222.197.168.0,则这台主机所处于的网络的编号为222.197.168.0。
222.197.168.0 # IP地址
255.255.255.0 # 子网掩码
222.197.168.0 # 该主机所处网络的网络编号
本版本的IP地址也称为IPv4。在2019年12月26日,是人类互联网值得纪念的一天,全球43亿个IPv4地址正式耗尽,而新版本的称为IPv6,使用一个128位( 2 128 2^{128} 2128)的IP地址来标识一台计算机,很难被耗尽,在2020年应该会有大规模的实际应用。
网络地址可以唯一地标识每台网络中的计算机。一台计算机能够同时运行多个程序并访问网络是基本的需求。对于多个不同的应用程序,TCP和UDP协议采用16位的端口号来识别。一台主机上的不同进程可以绑定到不同的端口上,使这些进程都可以访问网络而互不干扰。
TCP/IP将端口号(一个16位的无符号整数,02^16,即065535)分为两部分:
无论传输层使用何种协议,都要依靠IP协议来确定到达目的计算机的路由,是网络层最重要的协议。IP协议主要负责确定路由,当到达同一目的地有多条路由时,IP协议会选择一条最短路由来将数据分组传送到目的计算机。同时,IP协议还定义了一组规则,例如,有时目的地不可达或不存在,IP协议规定了在这种情况下何时丢弃传送中的数据分组。IP协议定义了数据单元格式(IP数据报),它由IP首部和数据两部分组成,IP数据报如图所示。
主要字段的含义如下:
在TCP/IP模型中,UDP协议位于网络层之上,应用层之下的传输层。UDP协议向应用程序提供一种面向无连接的服务,通常被用于不需要可靠数据传输的网络环境中。
UDP协议无需建立连接,应用程序采用UDP协议无需建立和维持连接。UDP协议不保证数据报按顺序、正确地到达目的地,这项任务由应用程序完成。UDP数据报首部格式如图所示。
UDP首部的各部分含义如下:
TCP提供一种面向连接的、可靠的数据传输服务。TCP数据包的首部格式如图所示。
主要字段的含义如下:
网络中的实际应用大多都可以归纳为客户机/服务器模型(Clinet/Server模型、C/S模型),其中客户机是指请求服务的一方,服务器是指提供某种服务的一方。某些应用请求服务的同时也提供一定的服务,但拆开研究,这种应用也是基于C/S模型。
C/S模型既可以使用TCP协议也可以使用UDP协议,还可以二者混合使用。在C/S模型中,通常服务器端的IP地址和端口号是固定的,客户端程序连接到服务器IP和端口。通常客户端的程序设计更为简单,而服务端由于要考虑多个客户端同时请求服务的问题,设计上相对复杂。