网络基础学习
计算机网络的分类
计算机网络可以从不同的角度分类,下面仅列举两种常用的分类方法。
按网络的覆盖范围进行分类
- 局域网:用于连接有限范围内(如一个实验室、一栋楼或一个校园)的各种计算机、终端与外部设备。外部设备和数据库连接起来形成计算机通信的私有网络。局域网又可以分为有线局域网和无线局域网。
- 广域网:又称广域网、外网、公网。是连接不同地区局域网或域域网计算机通信的远程公共网络。覆盖范围通常为几十千米到几千千米,可以覆盖一个国家、地区,甚至横跨几个州,因而广域网有时也称为远程网。
按网络的使用者进行分类
- 公用网:是指电信公司(国家或私有)出资建造的大型网络。“公用”的意思就是所有愿意按电信公司的规定交纳费用的人都可以使用这种网络。因此公用网也可称为公众网。
- 专业网:是某个部门为本单位的特殊业务工作的需要而建造的网络。这种网络不向本单位以外的人提供服务。例如,军队、铁路、电力系统等均有本系统的专用网。
计算机网络体系结构
计算机网络的分层体系结构
在我们的日常生活中不乏分层结构,例如,邮政系统就是一个分层的系统,而且它与计算机网络有很多相似之处。在讨论计算机网络的分层体系结构之前,先来看看我们所熟悉的邮政条统的分层结构。如图所示,我们可以将邮政系统抽象为用户应用层、信件递送层、那包运送层、交通运输层和交通工具层5个层次。发信人与收信人通过邮政系统交换信息,将传递的信息写在纸上并封装在信封里,信封上写上收信人和发信人的姓名与地址等信息,然后将信件投入邮箱或直接交给邮局。邮局工作人员将送往同一地区的信件装入一个邮包,并贴上负责这-地区的邮局的地址,然后交给邮政系统中专门负责运送邮包的部门。该部门要根据邮包的目的地选择运送路线、中转站和交通工具。注意,到目的邮局可能要用到多种交通工具,例如,经火车从北京运送到南京后再经汽车运送到南通。运送邮包的部门要将邮包作为货物交给铁路部门或汽运公司去运送,在中转站,该部门还要负责在不同交通工具间中转,最后将邮包交给目的邮局。目的邮局再将邮包中的信件取出分发给收信人。
邮政系统的最上层是用户应用层,其任务是用户通过信件来传递信息,如写家书、求职或投稿等。通信的双方必须用约定的语言和格式来书写信件内容。为了保密,双方还可以用约定的暗语或密文进行通信。
用户应用层的下层是信件递送层,其任务是将用户投递的信件递送到收信人。为完成该功能,必须对信封的书写格式、邮票、邮减等进行规定。
再下层是邮包运送层,其任务是按运送路线运送邮包,包括在不同交通工具间中转。为把邮包运送到目的地,邮包运送部门需要规定邮包上的地址信息的内容和格式。
再下层是交通运输层,其任务是提供通用的货物运输功能,并不一定仅为邮政系统提供服务。不同类型的交通运输部门是相互独立的,并且有各自的寻址体系。
最下层是具体的交通工具,如火车和汽车,它们是货物运输的载体。
邮政系统是一个很复杂的系统,但通过划分层次,整个通信任务被划分为5个功能相对独立和简单的子任务。每一层任务为其上层任务提供服务,并利用其下层任务提供的服务来完成本层的功能。计算机网络的结构层次与其非常相似。
为了使不同体系结构的计算机网络都能互连,国际标准化组织与1977年成立了专门机构研究该问题。不久,他们就提出了一个试图使各种计算机在世界范围内互连成网的标准框架,即著名的开放系统互连参考模型,简称OSI。该模型是一个七层协议的体系结构。如图所示
在OSI模型之前,TCP/IP协议簇就已经在运行,并逐步演变成TCP/IP参考模型,如图所示。到了20世纪90年代初期,虽然整套的OSI国际标准都已经制定出来了,但这时互联网已经抢先在全世界覆盖了相当大的范围,因此得到最广泛应用的不是法律上的国家标准OSI,而是非国家标准TCP/IP。于是TCP/IP就被称为事实上的国际标准。
不过我们在学习计算机网络原理时往往采取折中的办法,即综合OSI和TCP/IP的优点,采用一种只有五层协议的原理体系结构,如图所示,这样既简洁又能将概念阐述清楚。
现在我将简单的介绍一下这5层体系结构中各个结构表示什么含义,具体的原理将在后面的学习中深入学习。
- 应用层。
应用层是原理体系结构中的最高层。应用层的任务是通过应用进程间的交互来完成特定的网络应用。我们将应用层交互的数据单元称为报文。 - 运输层
运输层的任务就是向两台主机中进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。互联网中主要有以下两个运输层协议。
- 传输控制协议(TCP)——提供面向连接的、可靠的数据传输服务,其数据传输的单位是报文段。
- 用户数据报协议(UDP)——提供无连接的、尽最大努力的数据传输服务(不保证数据传输的可靠性),其数据传输的单位是用户数据报。
- 网络层
网络层负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送。在TCP/IP体系结构中,由于网络层使用IP,因此分组也叫作IP数据报,或直接称为IP分组。 - 数据链路层
简称链路层。数据链路层的任务是将分组从链路的一端传送到另一端。我们将数据链路层传送的数据单元称为帧。因此数据链路层的任务就是在相邻节点之间(主机和路由器之间或两个路由器之间)的链路上传送以帧为单位的数据。 - 物理层
物理层是原理体系结构的最底层,完成计算机网络中最基础的任务,即在传输媒体上传送比特流,将数据链路层帧中的每个比特从一个节点通过传输媒体传送到下一个节点。物理层传送数据的单位是比特。
协议
在教科书上协议的定义是:协议是控制两个对等实体(或多个实体)进行通信的规则的集合。协议的语法方面规定了所交换的信息的格式,而协议的语义方面的规则定义了发送者或者接收者所要完成的操作,例如,在何种条件下数据必须重传或丢弃。
我们用一个例子来解释协议的作用。比如说你现在正在上下午的最后一节课,下课之后你想去打羽毛球,但是场地有限,你需要给坐在门口的同学发送“信息”,让他一下课就飞快的跑出教室去占产地。但是在上课期间,你并不能说话,所以在此之前你和其他同学约定好了暗号,你咳嗽一声,代表下课去打球,并且让同学快速的去占场;咳嗽两声,代表今天有事,没法打球;伸一下腰,代表我先去吃饭,让他先和其他人打,等等暗号。简简单单的几个动作就代表了这么多含义。而协议的作用就是如此,就是规定了只有几个人知道的动作来进行交流,相当于军队之间的密文。其他人并不知道该含义。
在协议的控制下,两个对等实体间的通信使得本层能够向上一层提供服务。要实现本层协议,还需要使用下一层所提供的服务。如图所示概括了相邻2层之间的关系。
TCP/IP体系结构
在互联网所使用的各种协议中,最重要的和最著名的就是TCP和IP两个协议。现在人们经常提到的TCP/IP并不一定是单指TCP和IP这两个具体协议,而往往是表示互联网所使用的整个TCP/IP协议簇,互联网的体系结构也被称为TCP/IP体系结构。下面用一张图来表示TCP/IP协议簇。
它的特点是上下两头大而之间小:应用层和网络接口层都有多种协议,而中间的IP层很小,上层的各种协议都向下汇聚到一个协议中。这种沙漏计时器形状的TCP/IP协议簇表明,TCP/IP可以为各式各样的应用提供服务,同时TCP/IP也允许IP在各式各样的网络构成的互联网上运行。
IP地址和端口号
IP地址
网际协议(IP,又称为互联网协议)是TCP/IP体系中两个最主要的协议之一,也是最重要的互联网标准协议之一。与IP配套使用的主要还有以下三个协议:地址解析协议(ARP);互联网控制报文协议(ICMP);互联网组管理协议(IGMP)。本次先主要了解IP协议,后面再具体讲解其他协议。
在TCP/IP体系中,IP地址是一个最基本的概念。任何连接在互联网上的设备,必须拥有IP地址才能和互联网上的其它设备通信。整个互联网就是一个单一的逻辑网络。IP地址就是给互联网上的每一个主机(或路由器)的每一个接口分配一个在全世界范围内唯一的32位的标识符。
我们平常所熟知的IP地址叫做点分十进制法,就是把32位的IP地址中的每8位用其等效的十进制数字表示,并在这些数字之间加上一个点。如图所示:
IP本质是一个整数,用于表示计算机在网络中的地址。IP协议版本有2个:IPV4和IPV6.
- IPV4:
0.0.0.0
是最小的IP地址,255.255.255.255
是最大的IP地址,按照IPV4的协议算,可以使用的IP地址共有 2 32 2^{32} 232个。 - IPV6
使用一个128位的整数描述一个IP地址,16个字节;也可以使用一个字符串描述这个IP地址,如68E6:8C64:FFFF:FFFF:0:1:1180:960A:FFFF
,分成了8份,每份2个字节,每一部分以16进制的方式表示。按照IPV6的协议计算,可以使用的IP地址共有 2 128 2^{128} 2128个,在想象到达将来,IPV6的地址是不可能用完的。
端口
端口是应用层与运输层之间接口的抽象,如图所示。需要用到运输层协议进行通信的进程,都需要与某个端口关联,端口号标识了应用进程所关联的端口,相当于应用进程的运输层地址。为此,运输协议数据单元(即TCP报文段或UDP报文)的首部必须包含两个字段:源端口号和目的端口号。运输层收到IP层交上来的数据时,要根据其端口号来决定应当通过哪一个端口将其上交给目的应用进程。图中的应用层和运输层之间的小方框就代表端口。
端口的具体实现方法可能有很大的差别,因为这取决于计算机的操作系统。应用层的源进程将数据发送给运输层的某个端口,而应用层的目的进程从端口接收数据。端口用一个16位端口号标识,课分配的端口号范围是0~65535
,但是0~1023
是知名端口,一般分配给特定应用程序。在不同的计算机中,相同的端口号是没有联系的,并且TCP和UDP端口号之间也没有必然联系,例如:如果某TCP套接字使用9190号端口,则其它TCP套接字就无法使用该端口号,但UDP套接字可以使用。
我们知道应用进程间的通信采用的是客户-服务端通信模式,在应用层中的各种不同的服务器进程不断的监听它们的端口,以便发现是否有某个客户进程要和它通信。客户在发起通信请求时,必须先知道对方服务器的IP地址和端口号,而服务器总是可以从接收到的报文中获得客户的IP地址和端口号。
用户数据报协议和传输控制协议
在后面学习套接字编程的时候,我们常用的套接字有2种,一种是面向消息的套接字(SOCK_DGRAM)和面向连接的套接字(SOCK_STREAM)。下面我们将简单介绍这2种套接字的特点,为后面的套接字编程做铺垫,
用户数据报协议(UDP)
面向消息的套接字可以比喻成高速移动的摩托车快递。下图中摩托车快递的包裹(数据)传输方式如下。
- 强调快速传输而非传输顺序。
- 传输的数据可能丢失也可能损坏。
- 传输的数据有数据边界。
- 限制每次传输的数据大小。
众所周知,快递行业的速度就是生命。用摩托车发往同一目的地的2件包裹无需保证顺序,只要以最快速度交给客户即可。这种方法存在损坏或丢失的风险,而且包裹大小有一定限制。因此,若要传递大量包裹,则需分批发送。另外,如果用2辆摩托车分别发送2件包裹,则接收者也需要分2次接收。这种特性就是“传输的数据具有数据边界”。
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且他是将应用程序发出来的数据在收到的那一刻,立即安装原样发送到网络上的一种机制。
即使出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥堵的行为。此外,传输中即使出现丢包,UDP也不负责重发。甚至当出现包的到达顺序乱掉也没有纠正的功能。
面向消息的套接字特性总结如下:不可靠的、不按序传递的、以数据的高速传输为目的的套接字。
传输控制协议(TCP)
下图中的2位工人通过一条传送带传递物品,这与面向连接的数据传输方式类似。
上图的数据(糖果)传输方式特征整理如下。
- 传输过程中数据不会消失。
- 按序传输数据。
- 传输的数据不存在数据边界。
图中通过独立的传送带传输数据(糖果),只要传送带本身没有问题,就能保证数据不会发生丢失。同时,较晚传送的数据不会先到达,因为传送带保证了数据的按序传递。最后,下面这句话说明的确不存在数据边界:100个糖果是分批传递的,但接收者凑齐100个后才装袋。
这种情形可以适用到之前用过的write和read
函数。
传输数据的计算机通过3次调用write函数传递了100字节的数据,但接收数据的计算机仅通过一次read函数调用就接收了全部100个字节。
收发数据的套接字内部有缓冲(buffer),简言之就是字节数组。通过套接字传输的数据将保存到该数组。因此,收到数据并不意味着马上调用read函数。只要不超过数组容量,则有可能在数据填充满缓冲后通过1次read函数调用读取全部,也有可能分成多次read函数调用。也就是说,在面向连接的套接字中,read函数和write函数的调用次数并无太大意义,所以说面向连接的套接字不存在数据边界。
套接字缓冲已满是否意味着数据丢失?
首先调用read函数从缓冲区读取部分数据,因此,缓冲并不总是满的。但是如果read函数读取速度比接收数据的速度慢,则缓冲有可能被填满。此时套接字无法再接收数据,但即使这样也不会发生数据丢失,因为传输端套接字将停止运输。也就是说,面向连接的套接字会根据接收端的状态传输数据,如果传输出错还会提供重传服务。因此,面向连接的套接字除特殊情况外不会发生数据丢失。
上图中传输和接收端各有一名工人,这说明面向连接的套接字还有如下特点:套接字连接必须一一对应。用一句话概括面向连接的套接字就是“可靠的。按序传递的、基于字节的面向连接的数据传输方式的套接字”。
说到字节流,不得不提一下UDP的传输,UDP传输是基于报文的,简单点理解,UDP传输一个消息,需要将整个消息封装成一个数据包,然后进行传输。而TCP不一样,它会把整个消息切割成若干段,然后每一个段再被封装成数据包,逐一传输。总之,TCP不像UDP那样以一个个报文独立地进行传输,而是在不保留报文边界的情况下以字节流方式进行传输。