计算机网络,就是网络上一些主机,以及这些主机之间的连接的集合。这些主机应当是可以独立运行使用的,而相互连接指的是主机之间能够进行数据通信或信息交换。
事实上,网络是非常复杂的,需要在无法估计数量的主机之间进行数据交换,同时还要保证一定的性能和扩展性。因此主机之间需要有一些明确规定好的规则,这就是网络协议。网络协议主要有三个要素,语法、语义和同步。语法的含义是数据和控制信息的格式,语义则代表着发出不同的信息需要进行如何操作以及响应,同步则是事件实现顺序的说明。
为了让网络能够完成复杂的工作,经验表明进行分层设计是非常有效的方法。不同层次之间相互独立,共同完成工作,这样也有利于扩展和修改。我们把计算机网络的各层及其协议的集合,称为网络的体系结构。
OSI将网络划分为七层,而实质上得到广泛应用的是TCP/IP的四层结构,为了方便讲解,使用下图中c的五层协议。
在网络中,数据流动是如下图所示的,其中R路由器,H是主机,可以看到,路由器不处理运输层和应用层的内容,仅仅对最高到网络层的数据进行转发、控制等,后面会详细介绍。
这部分的目的在于综合介绍,因此不会涉及到过多细节。下面介绍一下五层协议的体系结构中每一层的作用:
性能指标从不同的方面衡量计算机网络的性能。
我们从下往上介绍网络中的层,首先是物理层。物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流,而不是具体的传输媒体。物理层的主要任务为确定与传输媒体的接口有关的一些特性:
实现传输方式的转换,从并行传输转换为串行传输。
在数据链路层进行数据传送的单位是协议数据单元——帧,数据链路层协议通常规定了数据帧的数据字段最大长度,称为最大传送单元MTU。数据链路层将网络层的数据封装成帧并发送到链路上,以及把接受到的帧中的数据进行校验后取出并上交给网络层。数据链路层具有三个基本的问题:
数据链路层使用的信道主要有点对点信道和广播信道,下面分别介绍。
PPP协议包含以下三个组成部分:
上图是PPP协议的帧格式,PPP帧的首部第一个字节和尾部的第二个字节是标志字段,规定为0x7E(十六进制),标志字段就是帧的定界符。地址字段A和控制字段C实际上没有携带PPP帧的信息。首部的第4个字段是两个字节的协议信息,用来代表信息部分是什么类型的数据。尾部的第一个字段帧校验序列FCS用来存放CRC的结果。
当信息部分中出现了和标志字段一样的比特(0x7E)时,需要对其进行采取一定的措施,使得不出现歧义。在异步传输时,转义符被定义为0x7D,填充方法为字节填充,将信息字段中的每个0x7E的字节转变为(0x7D, 0x5E),每个0x7D的字节转变为(0x7D, 0x5D),如果在信息字段中出现ASCII的控制字符(数值小于0x20),则在字符前面加入0x7D字节。
在同步传输时,使用的方法是零比特填充,对整个信息字段,如果发现有5个连续的1,则立即填入一个0,而在读取时,读到5个连续的1时,则将后面的0删除。
PPP协议在没有物理层连接时,处于链路静止状态,当建立了物理层连接后,就进入了链路建立状态。此时,PPP协议开始协商配置选项,发送配置请求帧,而链路的另一端可以返回配置确认帧、配置否认帧(理解选项但不接受)或配置拒绝帧(有的选项无法识别或需要协商)作为响应。
协商结束后,就进入鉴别状态,此时需要鉴别用户身份,若鉴别成功就进入网络层协议,并进行网络层的配置,配置完毕进入链路打开状态,可以进行通信。
广播信道与点对点信道有一定的不同,广播信道可以进行一对多的通信,因此需要相应的控制。
在同一个总线上,由于连接了多台计算机,当两台及以上的计算机同时发送数据时,数据就容易有干扰,在以太网中使用的解决协调的协议就是CSMA/CD,意思是载波监听多点接入/碰撞检测。要点是:
因此,CSMA/CD协议只能用于双向交替通信,即半双工通信。截断二进制指数退避算法是在发送碰撞并停止发送后不立即重传数据,而是推迟随机的时间再发送数据,确定推迟的时间的方法如下:
另外,还存在一个强化碰撞的概念,也就是在发现发生了碰撞时,不仅仅要停止发送数据,还要再继续发送32比特或48比特的认为干扰信号。以太网中还规定了最小的帧间最小间隔为9.6us,相当于96比特的时间,是为了使得接收到数据帧的站能够来得及处理、清理缓存。
局域网中的硬件地址又称为物理地址或MAC地址,是一个用来确认网络设备位置的位址。
MAC地址的长度为48位(6个字节),通常表示为12个16进制数。MAC地址的前三个字节由IEEE的注册管理机构RA进行分配,这个号是组织唯一标识符OUI。最高字节(MSB)的低第二位(LSb)表示这个MAC地址是全局的还是本地的,即U/L(Universal/Local)位,如果为0,表示是全局地址,由全区进行管理,所有的OUI这一位都是0。
第一字节的最低位为I/G位(Individual/Group),为0时表示单个站的地址,为1时表示组地址,用于多播。
Mac帧的前两个字段是标志地址的字段,第三个字段是两个字节的类型字段,用来标识上一层使用的是什么协议。最后一个字段同样是使用CRC校验的帧校验序列FCS。
因特网中网络层的设计思路是:网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。网络层不建立连接、不提供服务质量的承诺。
IP协议指的是一种将不同组织、结构的主机及网络连接起来的协议,目的是忽略主机、网络之间的差异,使得互连的计算机网络在网络层上好像是一个统一的网络,这就是虚拟互连网络。
首先是IP协议的格式:
IP协议由首部和数据两部分组成,首部包含固定为20字节的固定长度部分,和长度可变的可选字段和填充。IP数据报通常将首部填充为4个字节为单位的长度。首部字段的含义如下:
IP地址的编址方式进过了三个阶段:1. 分类的IP地址;2. 划分子网;3. 构成超网,这里只讨论分类的IP地址,这样的IP地址是两集的,可以记为:{<网络号>,<主机号>}。通常划分为以下几类:
其中,A、B、C的网络号字段分别为1、2、3字节长度,并且在网络号的最前面有1~3位的类别位,分别为0、10、110,因此对应的主机号字段分别为3、2、1个字节长度。D类地址是用于多播的。
在IP地址中,全0表示的是本网络,是保留地址。而网络号为127的地址保留作为本地环回测试使用的地址。因此A类地址的可以指派的网络号是126个( 2 7 − 1 2^7-1 27−1)。A类地址的主机号占3字节,因此每一个A类网络中的最大主机数是 2 24 − 2 2^{24}-2 224−2,因为全0表示的是本主机连接到的单个网络地址,全1表示的是所有的主机。
尽管B类地址的网络号不可能全0或全1,但B类地址依旧保留了128.0.0.0,因此可以指派的最小网络地址是128.1.0.0,数量为 2 14 − 1 2^{14}-1 214−1,一个网络号对应的最大主机数为 2 16 − 2 2^{16}-2 216−2。
C类网络地址的192.0.0.0也是不指派的,因此可以指派的最小网络地址是192.0.1.0,因此可以指派的网络总数是 2 21 − 2 2^{21}-2 221−2,每个地址对应的最大主机数是 2 8 − 1 2^8-1 28−1。
硬件地址(物理地址)是数据链路层和物理层使用的地址,而IP地址是网络层和以上各层使用的逻辑地址。在将数据传送到远端主机时,通常IP地址是不变的,变化的是局部的硬件地址,这里的变化指的是数据中的目的地址字段。在IP层抽象的互联网上只能看到数据报,在局域网的链路层只能看到MAC帧。因此也存在一定的问题,即知道了主机的IP地址,需要找到相应的硬件地址。通常使用的方法是地址解析协议ARP。
下面介绍一下在计算机网络中是如何转发分组的。
IP地址的设计存在一定的不合理的地方,首先是IP地址空间的利用率有时很低,其次为每一个物理网络分配一个网络号会使得路由表变得太大,最后是两级IP地址不够灵活。因此,后来又在IP地址中增加了一个子网号字段,变成三级IP地址。
划分子网的基本思路是,由拥有许多物理网络的单位对所属的物理网络划分为若干个子网,对外仍然表现为一个网络。划分的方法是从网络的主机号中借用若干位作为子网号,因此可以记为{<网络号>, <子网号>, <主机号>}。
凡是从其他网络发送给本单位某个主机的IP数据报,仍然是根据IP数据报的目的网络号找到连接在本单位网络上的路由器,此路由器根据目的网络号和子网号找到目的子网,把IP数据报交付目的主机。而如何找到子网并转发数据报呢,使用的方法就是子网掩码。
通常使用默认子网掩码,A类的默认子网掩码为255.0.0.0,B类为255.255.0.0,C类为255.255.255.0。使用子网掩码进行数据报转发时,需要将数据报中的IP地址与各网络的子网掩码进行“与”操作,看是否匹配,如果匹配则进行交付。
而使用CIDR划分超网,则不再使用A类、B类和C类以及划分子网的概念,而使用无分类的两级编址:{<网络前缀>,<主机号>}。此时使用最长前缀匹配的方法进行路由表中项目的对比。
上图是ICMP协议的格式。ICMP报文有两种,分别是ICMP差错报告报文和ICMP询问报文,如下图。
使用ICMP协议的应用有PING,即分组网间探测,用来测试主机之间的连通性,PING使用了ICMP回送请求与会送回答报文,PING是应用层直接使用网络层ICMP的,没有通过运输层的TCP或UDP。
另一个广泛应用是traceroute,用来跟踪分组从源点到终点的路径。ICMP向目的主机发送报文,其中封装了不可用的UDP用户数据报,第一个数据报的生存时间TTL设置为1,这样路径上第一个路由器接收到时,把TTL减1后TTL为0,因此返回ICMP时间超过差错报文。不断增加TTL的大小,当到达目的主机时,目的主机由于无法理解UDP数据报内容,会向源主机发送ICMP终点不可达差错报告报文。
本节讲解一下路由选择协议,路由选择协议就是得出路由表中的路由,核心就是路由算法,算法需要正确、完整、高效、简单、鲁棒、稳定、公平、最佳等。这样听起来路由算法是很难得到的,但实际上并没有想的那么困难。首先由于因特网的规模非常大,并且许多单位不希望外界了解单位内部的网络信息。因此因特网使用的是分层网络协议,并且因特网将路由选择协议划分为两类:内部网关协议IGP和外部网关协议EGP。
RIP(Routing Information Protocol,路由信息协议)是一种分布式的基于距离向量的路由选择协议,要求网络中的每一个路由器都要维护从它自己到达其他每一个目的网络的距离。RIP协议中定义的距离就是跳数,其允许一条路径最多只能包含15个路由器,距离等于16时不可达,因此RIP只适用于小型互联网。
RIP协议的特点是:
路由表中的信息就是到某个网络的最短距离,以及应经过的下一跳地址。更新的原则是找出到每个网络的最短距离。因此是距离向量算法:对于相邻路由器X发过来的RIP报文,先修改报文中的所有项目,把下一跳地址修改为X,并把所有的距离字段加1,因此每个项目包含三个数据:到达目的网络N,距离为d,下一跳路由器是X。对修改后的RIP报文,如果原来的路由表中没有目的网络N,则加入到路由表中。如果下一跳地址是X或距离更小,则进行更新。
这么做的原因是为了便于进行路由表的更新,使用最新的数据。
RIP协议最大的优点是实现简单,开销较小,但也存在坏消息传播得慢的问题。因为只有当距离到达16时才会知道不可达,而此时不会将更新信息立即发送给其他路由器,这样其他路由器在发送其路由表时,容易误以为其他路由器可达某个实际上已经不可达的主机。
OSPF协议的名称是开放最短路径优先,最主要的特征是使用了分布式的链路状态协议。主要的要点是:
因此所有的路由器最终都能建立一个全网的拓扑结构图,另外,OSPF还将一个自治系统划分为若干个更小的区域,使用层次结构的区域划分,在上层的区域叫做主干区域,主干区域的作用是用来联通其他在下层的区域,从其他区域来的信息由区域边界路由器进行概括,在主干区域内的路由器叫做主干路由器。
OSPF直接用IP数据报进行传送。共有以下五种分组类型:
在整个因特网上,因特网的规模较大,不同的自治系统之间有自身的规定,因此需要一个外部网关协议,外部网关协议主要关注可达性,而并非要寻找一条最佳路由。
边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议。 BGP 是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的多路连接的协议。 BGP 构建在 EGP 的经验之上。 BGP 系统的主要功能是和其他的 BGP 系统交换网络可达信息。网络可达信息包括列出的自治系统(AS)的信息。
运输层向它上面的应用层提供通信服务,属于面向通信部分的最高层,用户功能中的最底层。从运输层的角度来看,通信的真正端点不是主机,而是主机中的进程。也就是说,端到端的通信是应用进程之间的通信。因此网络层和运输层有明显的区别,网络层是为主机之间提供逻辑通信,而运输层是为应用程序之间提供端到端的逻辑通信。
运输层包含两个协议,一个是无连接的用户数据报协议UDP,另一个是有连接的传输控制协议TCP。按照OSI的属于,两个对等运输实体在通信时传送的数据单位叫做运输协议数据单元,而在TCP/IP中,分别称为TCP报文段或UDP用户数据报。下图是使用UDP和TCP协议的各种应用及应用层协议:
运输层使用协议端口号即端口来实现复用和分用。端口号又分为服务器端使用的端口号和客户端使用的端口号,服务器端使用的端口号还分为熟知端口号和登记端口号。客户端使用的端口号是在客户进程运行时动态选择的短暂端口号。
UDP的主要特点是:1. 无连接;2. 尽最大努力交付;3. 面向报文;4. 没有拥塞控制;5. 支持一对一、一对多、多对一和多对多的交互通信;6. 首部开销小。首部格式如下图:
其中伪首部是在计算校验和时使用的,不是UDP数据报真正的首部。
TCP最主要的特点是1. 面向连接的传输层协议;2. 每一条连接只能有两个端点;3. 提供可靠交付的服务;4. 提供全双工通信;5. 面向字节流。首部格式如下图:
这里只对部分字段进行讲解:
首先定义一下可靠传输,可靠传输指的就是采用一系列技术来保障信息在发送方和接收方准确、精确的传输。最理想的传输有以下两个特点:
下面介绍一下TCP如何实现可靠传输的。首先是停止等待协议,停止等待协议就是每发送一个分组就停止发送,等待确认,确认后再发送下一个分组。因此在发送了分组时,使用一个超时计时器来计时,如果超时计时器到期前收到了确认,就撤销已设置的超时计时器,否则重传。如果收到了重复的分组时,要丢弃并发送确认。如果收到了重复的确认,则丢弃。
从上面介绍的停止等待协议的过程可以看出,停止等待协议的效率是比较低,要想提高效率,在发送分组时就不应该等待收到确认后再发送下一个分组,而应该连续发送分组,提高发送的效率。因此,发送方需要维护一个发送窗口,在发送窗口内存在多个分组,是允许发送的分组,当发送并接收到窗口中的分组的确认时,将滑动窗口向未发送的分组方向进行滑动。一般采用的是累积确认的方式,即接收方不需要对收到的每个分组进行确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,表示到这个分组为止的所有分组都接收到了。这就是连续ARQ协议。
用一张图表示连续ARQ协议及协议中的滑动窗口:
发送窗口的后沿可能不动(没有收到确认)和前移(收到了新的确认),不可能向后移动,因为不能撤销已收到的确认。前沿则通常不断的向前移动或不动,一般不可能向后收缩。
在开始时由小到大逐渐增大发送窗口,一开始时cwnd=1,发送第一个报文段并接收到确认,将cwnd从1增大到2,每接收到一个对新报文段的确认后,把拥塞窗口增加多一个MSS的数值。因此使用慢开始算法,每经过一个传输轮次,拥塞窗口cwnd就加倍。由于这样的加倍是指数级的,因此还需要设置一个慢开始门限ssthresh,当cwnd
cwnd=sshresh
时,可以使用慢开始算法也可以使用拥塞避免算法,当cwnd>sshresh
时,使用拥塞避免算法。拥塞避免算法的思路是让cwnd缓慢增大,每经过一个往返时间就把拥塞窗口加1,而不是加倍。
无论在慢开始阶段开始拥塞避免阶段,只要判断网络出现拥塞,就把慢开始门限设置为拥塞时发送方窗口值的一半(大于等于2),并把拥塞窗口重新设置为1。以上两种算法合称AIMD算法(加法增大乘法减小)。
在正常情况下,只有超时时才重传。在使用快重传时,每收到一个失序的报文段立即发出重复确认,发送方一连收到三个重复确认就立即重传对方尚未收到的报文段。并且同时执行快恢复算法,将慢开始门限减半,把cwnd设置为慢开始门限减半后的数值,并开始执行拥塞避免算法。
本节讲解一下TCP是如何建立连接和释放连接的,这是TCP进行运输连接管理的重要内容。
上图假设A运行的是TCP客户程序,主动打开连接,B运行的是TCP服务器程序,被动打开连接。
B的TCP服务器进程先创建传输控制块TCB,服务器进程处于LISTEN状态,等待客户的连接请求。A的TCP客户进程也是首先创建传输控制模块TCB,然后向B发出连接请求报文段,此时首部中的同部位SYN=1,同时选择并消耗掉一个序号seq=x,此时不携带数据。此时A进入SYN-SENT(同步已发送)状态
B收到连接请求报文段后,如同意建立连接,就向A发送确认,在确认报文段中把SYN和ACK都置1,确认号ack=x+1,同时也为自己选择一个初始序号seq=y,这个报文段不携带数据,但同时消耗一个序号。此时B进入SYN-RCVD(同步收到)状态。
TCP客户进程收到确认后,还要给出对确认的确认,确认报文段的ACK=1,确认号ack=y+1,而自己的序号seq=x+1.ACK报文段可以携带数据,如果不携带数据不消耗序号。这时TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。当B收到A的确认后,也进入ESTABLISHED状态。
当数据传输结束后,通信双方都可释放连接,此时A和B都处于ESTABLISHED状态,A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接,连接释放报文段终止控制位FIN置1,序号seq=u,等于前面传送的数据的最后一个字节的序号加1。此时A进入FIN-WAIT-1状态,等待确认。FIN报文段即使不携带数据,也消耗序号。
B收到连接释放报文段后发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于前面传送过的数据的最后一个字节的序号加1。这时B进入CLOSE-WAIT(关闭等待状态),此时TCP连接处于半关闭状态,此时A已经不再发送数据了,但B若发送数据A仍会接收。此时A收到确认后,进入FIN-WAIT-2状态,等待连接释放报文段。
若B的数据已发送完毕,准备释放连接,此时B发出连接释放报文段,FIN=1,重复上次发送的确认号ack=u+1,此时B进入LAST-ACK(最后确认)状态,等待A的确认。A必须对B的连接释放报文段进行确认,确认报文段中置ACK为1,确认号ack=w+1,而自己的序号是seq=u+1,并进入TIME-WAIT(时间等待)状态,此时TCP连接还没有释放掉,必须等待时间等待计时器设置的时间后,才进入CLOSED状态。
本节简单介绍几个应用层的实例,还有一些没有介绍的如:HTTP协议、电子邮件、动态主机配置协议DHCP等读者可以在网上搜寻资料进行学习。
用户在与互联网上的主机通信时,必须知道对方的 IP 地址。但是每个 IP 地址都是由 32 位的二进制组成,对于用户记忆是非常不方便的。因此实际上互联网中的主机通常不仅仅只有 IP 地址,还有对应的便于用户记忆的主机名字https://www.csdn.net/,也就是域名。其IP地址就是47.95.164.112,对于用户而言域名更容易记忆。
域名同样是有结构的,图如下:
每个互联网上的主机域名都对应一个 IP 地址,并且这个域名在互联网中是唯一的。
在使用域名时,要如何知道域名对应的IP地址呢,这就是DNS协议的功能了,DNS通常是向域名服务器进行请求,域名服务器内有登记的域名和对应的IP地址。通过向域名服务器查询,可以获得域名对应的IP地址。域名服务器分为以下几种类型:
根据域名服务器作用划分:
在进行域名解析时,查询的顺序通常是本地域名服务器、根域名服务器、顶级域名服务器,最后是权限域名服务器。查询的方式有迭代查询和递归查询。
FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。
默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。
FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。
Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。
使用Telnet协议进行远程登录时需要满足以下条件:在本地计算机上必须装有包含Telnet协议的客户程序;必须知道远程主机的Ip地址或域名;必须知道登录标识与口令。
Telnet远程登录服务分为以下4个过程:
虽然Telnet较为简单实用也很方便,但是在格外注重安全的现代网络技术中,Telnet并不被重用。原因在于Telnet是一个明文传送协议,它将用户的所有内容,包括用户名和密码都明文在互联网上传送,具有一定的安全隐患。