TCP/IP网络协议入门

互联网是由一个个电脑节点组成的网络,那么两个节点之间是如何进行数据通信的了?先来看一看一个最简单的通信模型:发送者通过一个媒介想一个接收者发送消息,同时接收者也可以向发送者发送消息。

这种通信模型与平时生活中的日常会话很是相似。A想与B交流,首先A与B要讲同样的方言,如果一个人讲湖南方言,而一个人讲粤语,则沟通无法进行, 除非请一个懂两种方言的翻译或者沟通双发统一使用某一种语言。抽象的来看,通信一般涉及到如下几个要素:

  • 两个需要通信的节点(地址);
  • 通信的数据交换协议(协议);
  • 节点之间的物理连接(媒介);

缺乏任何其中一个要素通信都不会发生。比如,身在天津的小明A要给远在北京的小芳B发送一封信,这虽然是最常见的通信方式,也要具备通信的三个要素才能顺利进行:小明与小芳就是两个通信节点,小明需要知道小芳的地址才能向她写信,而小芳如果要回信,也需要知道小明的地址;语言文字就是通信得以进行的信息交换协议了,国家的邮政系统与信纸就是通信的媒介。

同样,对于互联网中的任何两个节点,想要进行通信的话,也需要满足这三个要素。互联网的物理媒介可能是普通的网线,可能是电话线,也可能是光纤。在这篇文章里,我们重点关注通信中节点的寻址与数据交换协议TCP/IP协议族。首先,就来看一看,两个节点之间的通信模式有哪些?

通信模式

这里所谓的通信模式是指节点通信的通道是怎样的。对于网络中节点之间的通信通道,通常有三种模式,分别是单工(simplex),半双工(half duplex)以及全双工(duplex)。这三种通道之间的区别在于节点之间数据传输的方向与时间:

  • 单工: 只存在单向通道,始终只能再一个方向上发送数据,常见的比如电视、音频广播电台;
  • 半双工: 同时存在两个通道,每个通道都可以进行数据传输,但不能同时进行通信;
  • 全双工: 同时存在两个通道,并且两个通道可同时交换数据,最常见的就是电话系统。

对于互联网中的通信一般都是全双工的,即可在上行与下行通道同时传输数据。接下来就来看一看,互联网之间的节点是如何进行寻址的,即节点A如何知道节点B的地址?

寻址

网络中的一个节点可以由两个地址来唯一的标识: 一个是网络接口卡(网卡)的物理地址(也叫MAC地址),一个是IP地址。网卡的物理地址通常是由网卡制造商确定的,而IP地址则是IP(Internet Protocol)协议对应的一个地址,是由一个叫做IANA(Internet Assigned Numbers Authority)的机构管理的。对于IPv4来说,IP地址的长度是32位(4个字节),而IPv6的地址则达到了128位(16个字节)。

IP地址

在互联网协议发展早期,一般将IP地址划分为两个部分:网络号和主机号。同时,为了区分不同用途的IP地址,IP地址的前3位用来区分IP地址的类,共有五类IP地址:

IP地址的分类

由上,A类地址范围为:128.0.0.0 ~ 191.255.255.255;B类地址范围为: 128.0.0.0 ~ 191.255.255.255;C类地址范围为: 192.0.0.0 ~ 223.255.255.255。以此类推。

如果按照接收端主机来看,可以将IP地址分为三类:单播地址(接收者为单个主机)、广播地址(接收端为给定网络上的所有主机)以及多播地址(接收端为同一组内的所有主机)。如果根据IP地址的用途划分, 有可以分成公有地址与私有地址, 私有地址一般用于局域网的通信, 常见的私有地址范围如下表所示(具体可以参考RFC1918):

私有IP地址

对于IPv4主机,由于存在网络号与主机号,因而在寻址与路由时需要作出区分,这就需要用到子网掩码了(subnet mask):通过子网掩码,给定一个IP地址,就可以知道该IP地址的子网号以及主机号了。譬如,在配置网络环境时,就常常会用到子网掩码:

Subnet mask

举个例子,来看一看子网掩码是如何工作的。我们有一个IP地址: 192.168.5.130,同时,我们知道子网掩码为255.255.255.0,转换成对应的二进制:

二进制 十进制
IP地址 11000000.10101000.00000101.10000010 192.168.5.130
子网掩码 11111111.11111111.11111111.00000000 255.255.255.0
子网号 11000000.10101000.00000101.00000000 192.168.5.0
主机号 00000000.00000000.00000000.10000010 0.0.0.130

就是说,子网号是IP地址二进制与子网掩码二进制位与的结果,而主机号则是IP地址与子网掩码取反后位与的结果。这样就可以通过子网掩码来对子网内的主机进行寻址了。

在上面讲到了网络节点有物理地址与IP地址,那么,是否可能通过节点的物理地址知道它的IP地址了,或者反过来通过IP地址知道它的物理地址?答案是可以的。在TCP/IP协议族中有一个地址解析协议ARP(Address Resolution Protocol)就是用于将IP地址转化成物理地址的,而逆地址解析协议RARP(Reverse Address Resolution Protocol)则是用于将物理地址转化为IP地址。

如今,RARP协议已经被更为灵活易用的DHCP(Dynamic Host Configuration Protocol)协议替代。对于内网或者区域性的网络,DHCP通过管理IP地址池来实现动态的分配IP地址,每当有节点接入网络时,DHCP就会为其动态的分配一个IP地址。

关于DHCP可参考: https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol

域名系统

如果单纯依靠IP地址来识别网络上的节点的话,对于用户上网来说是很麻烦的事情。访问WEB服务器时,用户需要记忆一大堆IP地址,这无疑是件痛苦的事情。因此,人们想到用域名(Domain Name)来查找网络上的节点,比如,要使用Google搜索,只需要在浏览器中输入www.google.com而不是一串IP地址就可以了。但是实际的网络访问还是需要通过IP地址,这就需要将域名转化成相应的IP地址。这就是域名系统(DNS, Domain Name System)需要做的事情。

可以把域名系统看做是一个层次化的分布式数据库,通过域名服务器可以查看到对应域名的IP地址。域名有根域名、顶级域名以及二级域名之分,根域名下面分了很多顶级域名,而顶级域名下面则又分成很多二级域名,这样就组成了一个层级的结构:

Domain Name

比如网络地址www.google.com

  • .com就是一个顶级域名;
  • .google是一个二级域名;
  • www则表示访问的是一个WEB服务器;

那么,在通过域名访问网络时,发送节点究竟是如何通过DNS来查找IP地址的了?这里用一个实际的例子来说明域名解析的过程。比如,现在需要访问www.wikipedia.org这个网站,首先会查找根域名服务器,根域名服务器会返回一个顶级域名服务器.org的IP地址;接着,通过该顶级域名服务器IP地址,继续查询,顶级域名服务器则返回一个二级域名.wikipedia的IP地址,这样根据这个IP地址,就可以顺利访问维基百科这个WEB服务了。

DNS解析过程

还有一个问题,需要访问网络的节点是如何知道根域名服务器的IP地址的?事实上,这些根域名服务器的IP地址是内置在电脑系统中的,这样通过事先预定的“根提示文件”(root hints file)就可以发起域名解析了。目前,在全球,共有13个根域名服务器,可以在 IANA 官网中查看这些根域名服务器的具体信息。

协议分层

TCP/IP协议族是一个不同层次上多个协议的组合,每一个层都负责不一样的通信功能。实际使用的是一个五层的协议族:

TCP IP 协议族

  1. 链路层: 也被称为数据链路层或网络接口层,通常包括操作系统中的设备驱动和计算机中对应的网卡。链路层主要处理与物理接口相关的细节,接受来自网络端的数据或者发送数据到上层;
  2. 网络层: 有时也称为互联网层,处理分组在网络中的活动以及主机的寻址与识别,例如分组的选路。网络层协议主要包括了IP协议(网际协议)、ICMP(Internet Control Message Protocol,互联网控制报文协议)以及IGMP(Internet Group Management Protocol,Internet组管理协议)。
  3. 运输层: 为两台主机上的应用程序提供端到端的通信,有两个不相同的传输协议:TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。TCP为两台主机提供了高可靠性的数据通信,它所做的工作主要有(1)将应用层传过来的数据分成合适的小块发到网络层,确认接收到分组后,设置发送最后确认分组的超时时钟等;UDP则简单的多,它只是把数据报(Datagram)的分组发给另外一台主机,但不能确保数据报能到达另一端。
  4. 应用层处理特定应用程序细节。一般会提供如下几种应用程序:
    • Telnet 远程登录;
    • FTP 文件传输协议;
    • SMTP 简单邮件传送协议;
    • SNMP 简单网络管理系统

参考文献