0%

计算机网络笔记

协议的体系结构

OSI七层协议

  • 物理层
  • 数据链路层
  • 网络层
  • 传输层
  • 会话层
  • 表示层
  • 应用层

TCP/IP体系结构

  • 网络接口层
  • 网际层
  • 运输层(TCP/UDP)
  • 应用层

五层协议

  • 物理层
  • 数据链路层
  • 网络层
  • 运输层
  • 应用层

物理层

定义物理设备标准

传输比特

数据链路层

定义了数据如何格式化传输,以及控制对物理介质的访问,通常还提供错误检测和纠正,确保数据的可靠传输

传输帧

使用的信道有两种类型:

  • 点对点信道,使用一对一的点对点通信方式,最常用,PPP协议
  • 广播信道,一对多的广播通信方式,需要共享信道协议来协调数据发送,CSMA/CD协议

数据链路层针对的是一个局域网内的转发,在一个局域网中从一个主机发送到另一个主机(不经过路由器)(从一个网络通过路由器转发到另一个网络是网络层解决的问题)

三个基本问题

封装成帧

以IP数据报作为数据部分,添加头部和尾部成为一个完整的帧

数据报最大长度为MTU个字节

首部和尾部用于帧定界,使用专门指明的控制字符作为SOH(start of head)和EOT(end of tranmission),另外包含部分控制信息

透明传输

任意比特组合的数据都可以正常传输,比如可以传输和帧定界字符相同的比特

解决方法:字节填充,发送端在数据中出现了和SOH或EOT相同的字符时,添加转义字符“ESC”;接收端在取出数据送往网络层之前再删除转移字符

差错检测

可能出现的差错:

  • 比特差错,比特位传输中出错
  • 传输差错,比如帧丢失、帧重复、帧失序

解决比特差错:使用循环冗余检验CRC等算法,在帧中添加冗余码-帧检测序列FCS,可以保证接收端接收的帧无差错(有差错的被丢弃)

解决传输差错:帧编号、确认和重传机制

实践证明:在通信质量良好的有线传输链路,数据链路层不考虑传输差错,可靠传输由传输层保证;在通信质量较差的无线传输链路,数据链路层使用确认和重传机制,向上提供可靠传输的服务,可以提高通信效率

协议

  • 点对点协议PPP,用与广域网,用于用户设备和ISP的理解,协商使用的协议等
  • CSMA/CD协议,用于局域网,解决广播信道的碰撞问题

点对点协议PPP

PPP协议的帧结构

  1. 各个字段

首部四个字段(5个字节)+信息部分(IP数据报,不超过1500字节)+尾部两个字段(3个字节)

首部:

  • 标志字段F(0x7E),表示一个帧的开始
  • 地址字段A(0xFF),暂未使用
  • 控制字段C(0x03),暂未使用
  • 协议字段,区分传输的帧的数据部分是IP数据报、流量控制协议LCP数据或者网络层控制数据

尾部:

  • 帧检验序列FCS
  • 标志字段F(0x7E),表示一个帧的结束
  1. 字节填充

PPP协议使用异步传输时,使用字节填充,使用转义符使得数据可以传输控制字段

  1. 零比特填充

PPP协议使用同步传输时,使用零比特传输,当数据中出现了连续五个1时,在之后插入一个0,保证不会出现连续的六个1(帧开始和结束的标志字段F是0x7E=01111110B,包含连续的六个1)

使用广播信道的数据链路层

广播信道实现一对多通信,局域网使用广播信道

以太网:可认为是局域网的同义词

局域网拓扑:

  • 星形网,都接在一个集线器上
  • 环形网,都接在一个连续的环上
  • 总线网,都直接接在总线上

CSMA/CD协议

多个计算机接到一个总线上,发送消息时所有计算机都可以收到。如果想在这种形式下实现一对一通信,可以在帧中添加适配器的硬件地址

  1. 问题:在同一时间只能允许一台计算机发送数据,不然各个计算机之间就会相互干扰

解决:CSMA/CD协议,即载波监听多点接入/碰撞检测,多点接入说明针对的是总线型网络,协议实质是载波监听、碰撞检测

  1. 问题:受限于电磁波传播速度,发送方检测到碰撞需要的时间至多是两倍的总线端到端的传播时延(电磁波在1km的电缆上传播时间为5us)

应在发生碰撞后等待一段时间,确认无碰撞后再发送下一帧,因此CSMA/CD协议下,站不能同时进行发送和接收,不能全双工通信,只能双向交替通信(半双工通信)

为了减少碰撞,使用截断二进制指数规避,避免检测到信道可用后多个站同时开始发送再次碰撞,大概是:根据碰撞次数,按一定算法让碰撞的数据的发送站等待一段时间后再尝试发送,这一时间会随着重传次数增加而增加

  1. 争用期

争用期:就是两倍的总线端到端传播时延。发生碰撞后,发送方最多等待一个争用期才可以检测到,因此一旦在争用期内没有检测到碰撞,就可以保证本次发送不会有碰撞(因为发送一个帧后,最多经过争用期的时间,所有站都会检测到信道正在使用,不会再进行发送,所以度过争用期本次发送就不会碰撞了)

争用期定义为51.2us,是在10Mb/s的以太网发送512个比特需要的时间,即512比特时间(这一时间和数据率相关)

如果发送的帧太小,即使碰撞了,可能会在发送方检测到碰撞之前接收方就已经接收完成了,所以规定以太网中一个帧最小为64字节(即512比特),不足512比特时进行填充。最小帧的512字节需要的发送时间就是争用期的时间,如此,如果发送完64字节时没有检测到碰撞,那么可以保证这一帧的发送不会发生碰撞;如果检测到了碰撞,一定是在争用期内检测到的,已经发送的数据一定不足64字节,立即停止发送,所以规定小于64字节为无效帧,接收方接收到这样的帧直接丢弃即可

因为电磁波在1km电缆上需要5us的传输时延,所以为了保证在争用期内所以站可以检测到发生的碰撞,可以算出,电缆不能超过5km(往返时间最大51.2us,所以单程最大允许25.6us,25.6/5约等于5km),实际上已经远远超过了以太网需要的覆盖范围

争用期定义为51.2us是考虑了端到端时延、转发器时延、强化碰撞等等因素的结果

  1. 强化碰撞

发送方检测到碰撞后,停止发送数据,继续一段发送人为干扰信号:为了能尽快让所有用户都知道已经发生了碰撞

规定帧之间最小间隔9.6us(9.6us仍然是根据数据率算出的96比特时间),保证可以对接收到的帧完成处理或者准备好缓存

  1. CSMA/CD整体要点
  • 准备发送:将帧放入缓存准备发送,发送前先检测信道
  • 检测信道:不断检测信道,直到检测到信道空闲,然后等待96比特时间以保证帧间最小时间间隔,然后开始发送
  • 发送时预先将要发送的帧放入缓存。发送中仍然继续检测信道,如果在争用期内没有检测到碰撞,那么本次发送不会发送碰撞,发送完毕即可;如果争用期内检测到了碰撞,那么停止发送,发送认为干扰信号以尽快让所有站得知发生了碰撞,然后执行指数退避算法,等待一定时间后继续检测信道等待发送,重新发送时从缓存中读取发送碰撞的帧

集线器

集线器(hub)工作在物理层,简单的收发比特,不进行碰撞检测,一个集线器上所有接口处于一个碰撞域,主要提供信号放大和中转的功能,它把一个端口接收的所有信号向所有端口分发出去,通过对物理电信号放大中继来延伸网络访问距离、扩展终端数量

以太网MAC地址

MAC地址,即硬件地址或物理地址,48位,是固化在适配器的ROM中的地址

每个站接收到的帧有:

  • 单播帧,一对一,收到的帧的MAC地址与本机的MAC地址相同
  • 广播帧,一对全体,目标MAC地址全为1(发送到本局域网的所有站点)
  • 多播帧,一对多,发给本局域网的一部分站点

MAC帧格式

一个五个部分:

  • 目的地址,6字节
  • 源地址,6字节
  • 类型,2字节,标志上一层使用的协议
  • 数据,如果是IP数据报,那么大小为46-1500字节(最小46字节是因为,帧最小64字节,减去固定的18字节的首部尾部,还需要至少46字节,不足时需要填充,而分别填充字段和数据字段,是使用IP中记录的总长度来区分的)
  • FCS,4字节,使用CRC的帧检验序列

所以一个有效的帧大小是64-1518字节

以太网的扩展

物理层扩展以太网

数据链路层扩展以太网

网络层

在主机之间提供连接和路径选择

传输数据报

网络层向上提供简单灵活的、无连接的、尽最大努力交付的数据报服务

协议

  • 网际协议IP
  • 地址解析协议ARP
  • 网际控制报文协议ICMP
  • 网际组管理协议IGMP

其中,IP使用ARP,ICMP和IGMP使用IP

IP协议

分类的IP地址

分类的IP地址:将IP地址分类,每类由两个字段组成:

  • 网络号,标记主机或路由器连接到的网络,必须是在整个因特网唯一的
  • 主机号,标志一个主机或路由器,在网络号所指明的网络内是唯一的

{<网络号>,<主机号>}组成的IP地址也就保证是在整个因特网内唯一的,并且,IP地址不仅可以标志一个主机,还可以得到这个主机连接到的网络

一共4字节32位(IPV4),所以一共能提供2^32个地址

根据网络号和主机号字段,分类为:

  • A类地址,网络号占1个字节8位,最高位固定为0,
  • B类地址,网络号占2个字节16位,最高位固定为10
  • C类地址,网络号占3个字节24位,最高位固定为110
  • D类地址,最高位固定为1110,用于多播
  • E类地址,最高位固定为1111,保留

A、B、C类是单播地址,最常用

  1. A类地址

网络号占8位,但是第一位固定为0,再去掉网络号全为0的表示本网络、网络号全为1如127.0.0.1表示本地环回网络,还有(2^7-2)=126个网络号,所以A类地址划分出了126个网络,每个网络内最大可以提供(2^24-2)个地址(减2是因为,主机号全为0表示主机连接到的网络地址,主机号全为1表示连接到的网络的所有主机)

关于主机号,如0.0.0.35,是一个A类地址,表示连接到的网络上主机号为35的主机;比如主机IP为5.6.7.8,是一个A类地址,该主机所在的网络地址是5.0.0.0

整个A类地址空间一共有2^31个地址(占全部的50%)

第一个字节是1~126

  1. B类地址

网络号占16位,但是因为最高位固定为10,所以不会有网络号全为0和全为1的地址,但是128.0.0.0不分配,所以能提供的网络号有(2^14-1)个

B类地址的每个网络上,主机号占16位,去掉全为0表示本网络和全为1表示本网络上所有主机,最大主机数为(2^16-2)个

整个B类地址空间大约有2^30个地址(占全部的25%)

第一个字节是128~191

  1. C类地址

网络号占24位,但是因为最高位固定为110,所以不会有网络号全为0和全为1的地址,但是192.0.0.0不分配,所以能提供的网络号有(2^21-1)个

C类地址的每个网络上,主机号占8位,去掉全为0表示本网络和全为1表示本网络上所有主机,最大主机数为(2^8-2)=254个

整个B类地址空间大约有2^29个地址(占全部的12.5%)

第一个字节是192~223

特殊的IP地址

网络号 主机号 源地址使用 目的地址使用 意义
0 0 可用 不可用 本网络上的本主机
0 host-id 可用 不可用 在本网络上的某个主机
全1 全1 不可用 可用 在本网络上广播(路由器不转发)
net-id 全1 不可用 可用 在指定net-id的网络上的所有主机广播
127 任意数 可用 可用 本地环回地址

网络号和主机号均为0,表示任何地址,不管主机有多少个网口,多少个IP,如果监听本机的0.0.0.0上的端口,就等于监听机器上的所有IP端口,数据报的目的地址只要是机器上的一个IP地址,就能被接受

网络号为某个网络的网路号,主机号全为0,表示这个网络的网络地址

IP地址一些特点

  1. IP地址由网络号和主机号组成,路由器可以只根据网络号转发,不需要考虑主机号,所以路由表会比较小
  2. 一个主机连接到两个网络,或者向路由器这样用来连接两个网络的设备,需要有两个相应的IP(路由器的每一个接口都有相应网络号下的IP地址,但是两个路由器之间直接相连,而没有其他主机时,可以不分配IP)

IP地址和物理地址

  • 物理地址是物理层和数据链路层使用的
  • IP地址是网络层和以上各层使用的,是软件实现的逻辑地址

IP数据报包含了IP地址之类信息,整体作为数据部分,封装到MAC帧,MAC帧传送时使用的是物理地址

所以,互联网上(IP层抽象出的),只能看到IP数据报,而看不到MAC帧;在局域网的链路层,只能看见MAC帧

ARP地址解析协议

从网络层使用的IP地址解析出数据链路层使用的硬件地址,解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题

对于主机已经知道的本局域网上的主机和路由器的地址,在主机的ARP高速缓存中保存了其IP地址到硬件地址的映射表,并动态更新(新增和超时删除)

当某主机在ARP cache中查不到某个IP对应的硬件地址时:

  1. 发送一个ARP请求分组,在局域网广播,其中携带了自身的IP、硬件地址和请求的IP
  2. 本局域网上所有主机都会收到此ARP请求分组,当某个主机的IP和请求分组请求的IP匹配时,向发出请求的主机发送相应分组,其中携带自身硬件地址(因为请求分组中携带了发送方的IP和硬件地址,所以主机此时也可以进行一个保存)
  3. 发出请求分组的主机收到响应后,将这一IP到硬件地址的映射记录到ARP cache

以上是在一个局域网的情况,如果是这种情况:主机H1->路由器R1->路由器R2->主机H2,即H1和H2是在通过路由器R1、R2连接的两个局域网上,那么H1就不能使用ARG解析出H2的IP对应的硬件地址,此时流程如下:

  1. H1将R1的IP地址通过ARP解析为硬件地址,发送到R1
  2. R1从转发表寻找到下一跳的路由器R2,通过ARP解析出R2的硬件地址,发送到R2
  3. R2将H2的IP地址通过ARP解析为硬件地址,发送到H2

那么为什么要使用IP地址,而不是使用硬件地址呢(MAC地址48位,比IPV4地址还多得多)?因为异构网络的复杂性,各类网络可能使用不同的硬件地址,需要复杂的硬件地址转换

IP数据报格式

前面部分是首部,后面是数据部分

首部包括20字节的固定部分和可变部分。可变部分长度从1到40字节不等,用来支持排错、测量以及安全等措施

IP数据报太长时,要分片,因为数据链路层有MTU的限制,比如MAC帧数据部分最大1500字节

IP数据报首部固定部分

固定部分一共20字节,包含12个字段

  1. 版本

占4位,IP协议的版本

  1. 首部长度

占4位,记录首部长度

注意的是,一个单位是32位(4字节),即,首部长度字段为5时,那么首部的字节数是5*4=20字节(首部固定部分20字节,因此首部长度字段最小为5)

因此IP数据报的首部的字节数,必须是4的整数倍,不足时在可变部分的填充部分进行填充

实际最常用的首部长度就是20字节

  1. 区分服务

占8位,未使用,只有使用区分服务时这一字段才有效

  1. 总长度

16位,IP数据报的总长度(单位字节),包括首部和数据部分的全长

所以IP数据报最大长度是2^16-1=65535个字节

当数据报进行了分片时,总长度字段是首部和相应分片的数据的长度

数据报长传输效率较高,但是数据报短时路由器转发更快,IP协议规定所有主机和路由器都必须能够接受不超过576字节的数据报

  1. 标识

占16位,使用一个计数器给每个数据报产生一个编号,这样在某个数据报被分片时,可以根据这一字段识别出被分片的报文重新组装(因为IP数据报的传输是不保证顺序的)

  1. 标志

占3位,但是只使用了2位:

  • MF,为1时表示之后还有分片,为0表示这是若干分片中的最后一个
  • DF,为1时表示不允许分片,为0时表示允许分片
  1. 片偏移

占13位,表示分片后当前片在原分组中的相对位置,以8字节为偏移单位(所以每个分片必须是8字节的整数倍)

假设一个数据报,数据部分一共3800字节,分为三片,第一片数据部分是原数据的0-1399字节,第二片数据部分是原数据的1400-2799字节,第三片数据部分是原数据的2800-3799字节,那么三个分片的片偏移字段分别是:0/8=0、1400/8=175、2800/8=350

  1. 生存时间

占8位

TTL(time to live),现在实际的功能是跳数限制,指明数据报在因特网中至多经过多少个路由器。

路由器收到报文后,首先将TLL减少1,然后如果TTL<=0,那么将其丢弃,不再转发

  1. 协议

占8位

指明数据报携带的数据是使用什么协议,以便于交给上层某个协议的进程负责处理

  1. 首部校验和

占16位,对首部执行反码算数计算,得到的结果为0时数据报有效,否则数据报有差错,直接丢弃

只对首部计算,并且没经过一个路由器都要重新计算(TTL等字段在经过路由器时会发生变化)

  1. 源地址

占32位,发送方的IP地址

  1. 目的地址

占32位,接收方的IP地址

IP层转发分组

IP层解决的就是不同网络之间转发的问题,表现的就是:在互联网上转发分组时,是从一个路由器转发到下一个路由器

在路由表中,每一条路由主要的信息是:(目的网络地址,下一跳地址)

特定主机路由:为特定主机指定一个路由(因特网的分组转发默认是基于目的主机所在网络的),方便测试等

默认路由:可以减少路由表占用的空间和搜索路由表使用的时间。路由表中,目的网络为0.0.0.0对应的下一跳,即为默认路由

对于某一个路由器,分组转发算法为:

  1. 从数据报首部提取出目的主机的IP地址D,可以得到目的网络地址N
  2. 如果N是与此路由器直接连接的网络,直接交付(使用ARP协议,将目的IP地址D转为对应的硬件地址,封装为MAC帧发送),结束
  3. 如果路由表中有目的主机的特定主机路由,转发给这一路由器,结束
  4. 如果路由表中有到达目的网络N的路由,转发到这一路由器,结束
  5. 如果路由表中有默认路由,转发到默认路由,结束
  6. 以上均未匹配,则报告转发分组出错

路由器转发给下一跳的路由器,或者转发到同一个网络的主机,都是通过ARP协议进行的(下一跳的路由器与本路由器直接相连,自然是一个网络内的)

划分子网

原本的IP地址是:{<网络号>,<主机号>}

引入子网号后是:{<网络号>,<子网号>,<主机号>}

划分思路:

  • 将一个物理网络划分为若干个子网,但是对外仍然表现为一个网络
  • 划分方法是将主机号的若干位作为子网号subnet-id,这样就从“网络号+主机号”的二级IP地址,变成了“主机号+子网号+主机号”的三级IP地址
  • 从其他网络发送到本网络某个主机的数据报,仍然是通过网络号进行路由,本网络的路由器收到数据报后按网络号和子网号找到目的子网,交付给目的主机

子网掩码

IP数据报只有源地址和目的地址IP,没有子网相关字段,无法判断是不是划分了子网

子网掩码,32位,将IP地址与子网掩码取与,即得这一子网的网络地址

如果某个网络不划分子网,那么使用默认子网掩码,即在网络号对应的位全为1、其他为0

所以不管网络有没有划分子网,将IP地址与子网掩码取与即可得到网络地址(没有划分子网时,子网掩码在网络号对应的位全为1)。同时,划分子网后,子网的广播地址仍然是将主机位全置为1

规定所有网络都必须使用子网掩码,路由表中每条记录也必须有该网络的子网掩码这一项;路由器在和相邻路由器交换路由信息时,必须将自己所在网络或子网的子网掩码也告知相邻路由器

推荐子网掩码使用连续的1

根据子网号subnet-id可以算出子网内最大主机数,如果subnet-id有n位,除去全0和全1两个特殊地址,最大可以有(2^n-2)个主机

因为子网占用了主机号的位,所以网络上的地址空间减小了;比如一个B类地址,原本可以有(2^16-2)个主机,划分子网后,子网掩码至少占用2位主机号、分为两个子网,每个子网最多有(2^14-2)个主机,大概减少了一半(划分为两个子网使得主机号最高位固定为1,所以地址空间变成了原来一半)

子网号没有0、1、15、16的情况(子网号不能全0或全1),不然划分出的子网的网络地址或者广播地址会和原网络的相同

使用子网时的分组的转发

划分子网后,路由表每一项必须有:目的网络地址、子网掩码、下一跳地址

划分子网后的分组转发算法:

  1. 从收到的数据报首部提取出目的IP地址D
  2. 对路由器直接连接的网络依次检查,将目的地址D与子网掩码取与,如果结果和目的网络地址匹配,那么直接交付到这一网络(使用ARP协议),结束
  3. 检查是否有特定主机路由,有则转发给特定路由器,结束
  4. 对路由表中每一项,使用子网掩码和目的地址D取与,如果结果与目的网络地址匹配,转发给对应的下一跳路由,结束
  5. 如果有默认路由,转发给默认路由,结束
  6. 以上都未完成,报告转发分组出错

无分类编址CIDR(构成超网)

网络前缀

CIDR:

  • 消除原有的分类IP地址和划分子网的概念,把IP地址分为两部分:{<网络前缀>,<主机号>},斜线记法如128.14.35.7/20,表示网络前缀占20位
  • 将网络前缀相同的连续的IP地址称为一个CIDR地址块(允许子网号全0和全1的情况)(主机号全0和全1的地址一般不使用)

使用地址掩码方便路由选择,也称子网掩码,斜线记法中斜线后的数字是网络前缀的位数,也是地址掩码中1的个数

路由聚合(构成超网):一个CIDR地址块中有很多地址,在路由表中可以利用CIDR查找目的网络,使得路由表中一个项目可以表示传统分类地址的很多项路由

每个CIDR块块包含的地址数一定是2的幂,/24包含的地址数相当于一个C类地址,前缀更短的每个地址块都包含了多个C类地址,所以叫构成超网

最长前缀匹配

最长前缀匹配:使用CIDR后,路由表中每一项包含网络前缀和下一跳地址就可(网络前缀的位数就是地址掩码的1的个数),但是查找路由表时根据网络前缀可能得到多个匹配结果,此时从匹配结果中选择具有最长网络前缀的路由,使得查找到的地址块更小,路由更具体

使用二叉线索查找路由表

提高路由表查找的速度

ICMP网际控制报文协议

ICMP,网际控制报文协议,允许主机或路由器报告差错情况和提供有关异常情况的报告,以有效的转发IP数据报和提高成功交付的机会

ICMP工作在网络层,但是报文是封装在IP数据报的数据部分作为数据的

ICMP报文格式:前4个字节是统一格式,分别是类型、代码、检验和;数据部分长度取决于类型

ICMP报文种类:

  • ICMP差错报告报文
  • ICMP询问报文

ICMP差错控制报文

共五种:

  1. 终点不可达,当路由器或者主机不能交付数据报时向源点发送这一报文
  2. 源点抑制,当路由器或者主机由于拥塞而丢弃数据报时,向源点发送这一报文,通知源点以当放慢数据报发送速率
  3. 时间超过,当路由器收到TTL为0的数据报时,将其丢弃,并向源点发送这一报文;当终点在预定时间内不能收到一个数据报的所有分片时,将已收到的全部丢弃,并向源点发送这一报文
  4. 参数问题,当路由器或者主机收到的数据报首部有的字段不正确时,丢弃这一报文并向源点发送参数问题报文
  5. 改变路由(重定向),路由器把此报文发送给主机,告知主机下次应将数据报发送给另外的更适合的路由器

关于改变路由报文,因为主机数显然远远多于路由器个数,所以主机并不会和路由器定时交换路由信息以更新路由表,一般在开始工作时设置一个默认路由器。主机将数据报发送给默认路由器,如果默认路由器发现发往某个目的地址的数据报的最佳路由是其他路由器,那么向主机发送改变路由报文,主机收到后在更新路由表,记录到该目的地址的下一跳路由器

ICMP差错报告报文的数据字段格式是,将需要进行差错报告的IP数据报的首部和数据字段的前8个字节(取IP数据报的前8个字节是为了获得运输层的端口号和运输层报文的发送序号,可用于对高层协议的通知)放入ICMP差错报告报文的数据部分

ICMP询问报文

两种:

  • 回送请求和回答,主机或路由器向某个主机发送这一报文,收到报文的主机发送回答报文,来测试该主机是否可达及状态等
  • 时间戳请求和回答,请某个主机或路由器回答当前的日期和时间,用于时钟同步和测量时间

ICMP应用举例

  1. ping

应用层直接使用网络层的ICMP协议的回送请求和回答报文,测试两个主机之间的连通性

  1. traceroute

利用网络层的ICMP协议,测试源主机到目的主机需要经过多少路由器并可打印出路由器IP和到达路由器使用的时间

实现是:发送的所有IP数据报的数据部分携带的都是一个无效的UDP用户数据报,首先发送一个TTL为1的IP数据报,这样第一个路由器收到后TTL减为0,路由器将其丢弃并向主机回复一个ICMP时间超出报文,源地址的主机由此可以得知经过的第一个路由器的信息;以此类推,将TTL设为2、3、…即可得到经过的第2、3、…个路由的信息;直到数据报交到目的主机,TTL为1,主机不会将TTL减1,也不会转发数据报,但是因为报文中数据部分封装的UDP用户数据报是无效的(使用非法端口号使得无法交付),所以向源地址主机发送一个ICMP终点不可达报文。由此,即可得到经过的所有路由的IP地址和往返时间

很多情况下,经过的路由越多,花费时间越大,但是也要看网络的拥塞情况

路由选择协议

  • 静态路由选择策略,即非自适应路由选择,简单、开销小,但是不能及时适应网络状态的变化。适合简单的小网络,人工配置每一条路由
  • 动态路由选择,即自适应路由选择,能较好的适应网络状态的变化,但是实现复杂、开销大。适合较复杂的大网络

因特网使用的是自适应的、分布式路由选择协议

因特网将互联网划分为许多小的自治系统,记为AS,每个AS内部可能使用了多种内部路由选择协议和度量,但是对其他AS表现出的是一个单一和一致的路由选择策略

根据AS定义,可以将路由选择协议分为:

  • 内部网关协议IGP,在一个AS中内部使用的路由选择协议,而与互联网中其他AS选用什么路由协议无关,如RIP协议、OSPF协议
  • 外部网关协议EGP,如果源主机和目的主机处于不同的AS,两个AS可能使用了不同的IGP,那么数据报传到一个AS边界时,需要一种协议将路由选择信息传递到另一个AS中,即EGP,如BGP-4(边界网关协议版本4)

所以,每个AS中都需要有一个或者多个路由器,同时运行本AS内的内部路由选择协议和AS间的路由选择协议

AS之间的路由选择称域间路由选择,AS内部的路由选择称域内路由选择

目前的因特网中,一个大的ISP就是一个AS

内部网关协议RIP

RIP路由信息协议,是一种分布式的基于距离向量的路由选择协议,每一个路由器都要不断的和其他路由器交换路由信息

RIP要求网络中每一个路由器都要维护一个从它到每一个目的网络的距离记录;距离即是跳数,从路由器到它直连的网络的距离定义为1(也可定义为1,初始值,不影响选择结果),到非直连的网络,距离是经过的路由器数量加1

RIP认为好的路由就是距离短的,即经过的路由器少的,并且允许一条路径最多包含15个路由器,距离等于16时即认为不可达(所以只适合小型网络)

RIP在两个网络之间不能同时使用多条路由,而是选择一条具有最少路由器的路由,即使还有其他更高速但是经过的路由器多的路由

RIP特点:

  • 仅和相邻路由(两个路由器之间通信不需要经过其他路由器,那么就是相邻的)交换信息
  • 交换的信息是本路由器知道的全部信息,即自己的路由表,其中将包含此路由器到所在AS的所有网络的最短距离,及到每个网络的下一跳的路由器
  • 按固定的时间间隔交换路由信息

所以,使用RIP协议的路由器,在刚开始工作时,只知道直连网络的距离,之后也只和相邻路由器交换和更新路由信息,但是更新若干次后,所以路由器都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址

路由表需要包括:到某个网络的最短距离、相应的下一跳地址

路由表更新原则就是找出每个目的网络的最短距离,更新算法使用距离向量算法

RIP报文作为UDP用户数据报的数据部分发送

距离向量算法

原理是Bellman-Ford算法

对每一个相邻路由器发来的RIP报文。执行以下步骤:

  1. 对地址为X的路由器发来的RIP报文,报文中每一项包括:到目的网络N,距离是d,及相应的下一跳路由器;将所有项的下一跳路由器更新为X(本路由器经过X到达其他网络,所以将下一跳先全更新为X可以方便本路由器的路由表的更新)
  2. 修改后的X发送的RIP报文,其中每一项包括:到目的网络N,距离是d,下一跳路由器全更新为了X;对报文中每一项:
  • 如果自身路由器中没有相应目的网络的记录,直接添加这一项
  • 如果自身路由表中有到相应目的网络的记录,且记录中下一跳路由器为X,直接更新(因为报文中是最新的信息,自身路由表中可能是已经过时的数据)
  • 如果自身路由表中有到相应目的网络的记录,且记录中下一跳路由器不是X,将自身路由表中的这一纪录的距离和RIP报文中这一记录的距离比较,更新为距离更小的
  1. 如果3分钟没有收到相邻路由器的RIP报文,认为其不可达,标记距离为16

内部网关协议OSPF

开放最短路径优先OSPF(链路状态协议),open其实只是表示公开,所以其实是最短路径优先,核心是Dijkstra的最短路径优先算法SPF

主要特征是使用分布式的链路状态协议(RIP是距离向量协议)

OSPF要点:

  • 使用洪泛法向本自治系统中所有路由器发送信息,洪泛法是指:路由器通过所有输出端口向所有相邻路由器发送信息,所有相邻路由器再转发到其除发送信息的路由器之外的所有相邻路由器,最终整个AS内所有路由器就都会得到信息的一个副本(RIP只向相邻路由器发送)
  • 路由器发送的信息是本路由器相邻的所有路由器的链路状态,是本路由器知道的部分信息。链路状态是指本路由器连接的有哪些路由器,及链路的度量(代价,表示费用、距离、带宽、时延等)(RIP发送的报文中的项是到目的网络的距离和下一跳路由器)
  • 只有当链路动态变化时,才使用洪泛法发送信息(RIP定时交换路由表信息)

OSPF下,最终所有路由器都可以建立一个全网的拓扑结构图,并且在全网范围内是一致的,包括有多少路由器、路由器相连情况、代价等,由此构建出路由表

为了OSPF能应用于更大规模的网络,在AS内部再划分出若干个区域,这样使用洪泛法交换链路状态信息的范围局限到每个区域内,可以减少整个网络上的通信量。每个区域内的路由器只需要知道自己所在区域的网络拓扑。

为了AS内的多个区域之间的通信,使用层次结构的区域划分,上层为主干区域,其中的路由器为主干路由器,负责连通其他下层区域;从其他区域来的信息由区域边界路由器进行概括,所以每个区域至少应有一个区域边界路由器;主干区域内还需要有一个路由器专门和本AS外的其他AS交换路由信息,即自治系统边界路由器

OSPF特点:

  • 允许管理员为每条路由指派不同的代价,因此可对不同的业务类型计算出不同的路由(比如同样的一条使用卫星的路由,在时延敏感的业务中可以设置为高代价,在实时性要求不高的业务中可以设置为低代价);通常使用链路带宽计算链路代价(RIP只考虑距离,即跳数)
  • 如果到一个目的网络有多条相同代价的路由,可以将通信量在其中平均分配,即多路径间的负载平衡(RIP只能找到一条距离最短的路由)
  • 所以在OSPF路由器之间交换的分组都有鉴别功能,保证可信赖性
  • 支持可变长度的子网划分和CIDR
  • 链路状态带有序号,序号值越大,状态越新

OSPF报文直接作为IP数据报的数据部分进行传送(RIP报文是作为UDP的数据部分进行传输的)

外部网关协议BGP

边界网关协议BGP

BGP致力于找到一条能到达目的网络的比较好的路由,而不是最佳路由(不同AS评价代价定义不同,只有可达性是可以交换的;安全性等其他策略要求避开某些AS或者要求AS之间顺序等)

BGP采用路径向量路由选择协议

配置BGP时,每个AS至少有一个路由器作为该AS的BGP speaker(BGP发言人),一般两个BGP speaker通过共享网络连接到一起,一般就是边界路由器;每个BGP speaker出了运行BGP协议外,还需要运行所在AS的内部网关协议

BGP speaker之间建立TCP连接后,使用TCP发送BGP报文来交换路由信息,,TCP连接的两个BGP speaker彼此是对方的邻站/对等站;BGP交换的网络可达性信息即要到达某个网络需要经过的一系列AS(网络使用网络前缀表示)(其实就是一个图的连通性的问题,但是找到的各个路径不应该有环);所以BGP的路由表中应当包括:目的网络前缀、下一跳路由器、到达该目的网络需要经过的自治系统的序列

每个BGP路由器收到报文后,检查其中的AS的序列中有无自身,如果有自身所在的AS,那么就会形成环,不能采用

IP多播

VPN虚拟专用网

VPN,用软件实现专线的效果

三个地址块作为特殊用途的专用地址:

  • 10.0.0.0-10.255.255.255,即10.0.0.0/8,相当于一个A类网络
  • 172.16.0.0-172.31.255.255,即172.16.0.0/12,相当于2^4=16个B类网络
  • 192.168.0.0-192.168.255.255,即192.168.0.0/16,相当于2^8=256个C类网络

专用地址只能用于一个机构内部的通信,不能用于和因特网上的主机通信,即只能用作本地地址而不能用作全球地址

在因特网中的所有路由器,对目的地址是专用地址的数据报一律不进行转发

如果希望内部的两个专用网通信,而不购买专线,那么必须经过因特网,而保密性要求经过因特网时加密。两个专用网的路由器都需要有一个接口接到因特网并拥有一个合法的全球IP地址,另有一个接口接到各自相连的专用网。专用网A内站点要向专用网B内站点通信时,源地址和目的地址使用本地地址,发送到与A相连的R1,R1发现此内部数据报需要经过因特网才能到达目的地址(是发到专用网B而不是A内部通信),那么将整个数据报加密(保证内部数据报安全),将其作为一个新的外部数据报的数据部分,并添加首部,外部数据报的源地址是R1的全球地址,目的地址是与专用网B相连的路由器R2的全球地址,转发到R2;R2收到后取出数据部分解密,即得到原本的内部数据报,根据目的地址(是一个内部地址)进行交付

NAT网络地址转换

专用网内的主机只分配到了本地地址,但是还需要和因特网上的主机通信,因为全球IP地址所剩不多,所以使用网络地址转换

NAT

需要安装了NAT软件的NAT路由器

NAT路由器至少拥有一个全球地址,在专用网内主机向因特网主机发送IP数据报时,经过此路由器时,修改数据报的首部,将源地址修改为NAT路由器的全球地址。当因特网上目的主机回复数据报时,目的地址是NAT路由器的全球地址,NAT路由器根据NAT地址转换表,将数据报首部的目的地址修改为专用网内通信的源地址的主机的本地地址IP,进行转发

这种情况有以下问题:

  • NAT拥有n个全球IP时,就最多n个专用网内主机可以同时接入因特网,专用网内主机多时要轮流使用NAT的全球IP地址
  • 通信只能由专用网内主机发起,外部主机向内部主机发送数据报时,目的地址填写的是NAT路由器的全球IP地址,但是NAT路由器不知道应该转发到内部哪一台主机(因为内部主机是轮流使用的),所以这种情况下内部主机不能作为服务器

NAPT

为了解决NAT的以上问题,采用使用端口号的NAT,即网络地址与端口号转换NAPT,不过也可可继续使用缩写NAT代表

因为主机发送数据报时都需要在TCP/UDP选择端口号,NAPT将专用网内主机的本地IP地址和TCP/UDP端口号都进行转换,比如NAPT路由器只有一个全球IP地址N时,本地的主机A、B可以将源地址都转换为N,但是同时将IP数据报中的TCP/UDP端口号转换为不同的端口号,这样A、B的地址和端口号对外就表现为了N:portA和N:portB。NAPT收到因特网向本地网络的数据报时,根据目的地址IP和数据报中的端口,从NAPT转换表中找到目的地址对应的本地的主机

如此,即使NAPT路由器仅有一个全球IP地址,也可以让本地主机同时使用,而且因特网上主机可以从外部访问本地主机

普通路由器工作在网络层,NAPT工作在网络层和运输层(当然,路由器也肯定要工作在数据链路层和物理层)

运输层

在网络层,数据报交付给主机,但实际上主机上可能多个进程,所以通信的真正端点应该是主机中的进程

所以,网络层提供主机之间的逻辑通信,运输层提供应用进程间端到端的逻辑通信。因此,TCP/UDP协议首部有端口号字段,用于标志主机内的进程(端口号只在主机内部有意义,而在主机之外,网络层等关注的就只是主机站点了,不同主机的端口号都是毫无关系的)

运输层的端口号:

  • 服务器端使用的端口号,一类是熟知端口号/系统端口号,范围在01023,指定给了TCP/IP中的最重要的应用程序,比如DNS使用53,FTP使用21,HTTP使用80,SMTP使用25,TELNET使用23等;一类是登记端口号,范围在102449151,给没有熟知端口号的应用程序使用,需要登记以防止重复
  • 客户端使用的端口号,范围是49152~65535,在客户端进程运行时动态选择、暂时使用。服务器进程收到客户端进程报文时可以知道客户端使用的端口号,使用这一端口号发送数据到客户端,通信结束后客户端口号就不复存在,可以给其他进程使用

运输层的复用和分用:

  • 复用,指的是发送方不同的应用进程都可以使用同一个运输层协议传输数据(首部不同)
  • 分用,指的是接收方的运输层在剥去报文首部后能够将数据正确交付给目的应用进程

主要的两个协议:

  • TCP,传输控制协议,传输TCP报文段,提供面向连接的服务,传输数据之前必须先建立连接,传输结束后要释放连接;不提供广播或者多播服务;提供可靠的运输服务
  • UDP,用户数据报协议,传输UDP用户数据报,传输数据前不需要先建立连接,接收方收到后也不需要给出确认;不提供可靠交付,但是高效

TCP和UDP的使用场景:

  • TCP,http、SMTP、TELNET、FTP等
  • UDP,IP电话、流式多媒体通信、多播、DHCP、DNS等

用户数据报协议UDP(User Datagram Protocol)

UDP特点:

  • 是无连接的,发送数据前不需要建立连接,可以减小开销和发送数据前的时延
  • 尽最大努力交付,不保证可靠
  • 是面向报文的,对应用层交下来的报文,添加首部后就交给IP层,既不合并也不拆分,而是保留报文的边界。因为UDP一次交付一个完整的报文,因此应用层最好选择合适大小的报文,不然太长会导致IP层分片,太短会导致IP层首部相对长度更大,降低效率
  • 没有拥塞控制,网络出现的拥塞不会使源主机的发送速率降低。对实时应用比如IP电话、实时视频会议适合,可以允许源主机以恒定的速率发送数据,这类应用可以在网络拥塞时丢失一些数据,但是不能有太大时延
  • 支持一对一、一对多、多对一和多对多的交互通信
  • 首部开销小(UDP报文首部8个字节,TCP报文首部20个字节)

UDP的首部格式

UDP报文包括首部字段和数据字段两部分

首部占8个字节,包含4个字段,各占2字节:

  • 源端口,需要接收方回复时选用,不需要时可以全0
  • 目的端口,在接收方主机交付报文到应用进程时使用
  • 长度,UDP数据报(首部+数据部分)的长度,最小为8(首部固定8个字节)
  • 检验和,检验数据报传输中是否有差错,有差错就丢弃

运输层收到数据报后,按照目的端口,上交到通信的真正终点应用进程

计算检验和时,在首部添加12字节的伪首部,对伪首部、首部、数据部分一起来计算(伪首部只在计算检验和时临时使用,交给IP层时不带有伪首部)

传输控制协议TCP

TCP特点

最主要特点:

  • 是面向连接的运输层协议,使用之前必须先建立TCP连接,传输完成后必须释放连接
  • 每一条TCP连接只能有两个端点,是点对点的
  • 提供可靠交付服务,无差错、不丢失、不重复、按序到达
  • 提供全双工通信,允许应用程序任何时候都可以发送数据,因为在收发两端都设有缓存
  • 面向字节流,对应用程序交下来的数据都看作一串无结构的字节流,不保证通信中的数据块和应用程序的数据块一致

UDP每次发送一个完整的应用层交下来的报文,而TCP可能会对大的数据库分块,也可能利用缓存积累一些小的数据块后一次性发送

TCP连接

TCP连接的端点称为套接字,套接字即是:(IP地址:端口号)

所以收发两个端点对应的两个套接字,即可确定一个TCP连接

可靠传输原理

停止等待协议

停止等待,即每发送完一个分组就停止发送,等待对方的确认,收到确认后再发送下一个分组

有以下几种情况

  1. 无差错情况

A发送M1->B收到M1->B回复M1的确认->A收到M1的确认->A发送M2->…

发送一个,等待确认后再发送下一个

  1. 出现差错的情况

可靠传输要求,A发送一个分组后,一段时间内没有收到确认,即认为刚才的分组丢失了,重新发送一次,即超时重传

A发送的M1出错差错时,B检测到差错,直接丢弃出错的M1分组,A等待一段时间后没有收到确认,超时重传

实现超时重传,需要:

  • 发送完分组后,必须暂时保留已发送的分组的副本,再收到确认后才能删除
  • 分组和对分组的确认都需要有编号,才能区分是哪一个分组收到了确认或者超时等
  • 超时计时器设置的超时时间,应比分组传输的往返时间长一些,如果设置的太短会导致不必要的重传
  1. 确认丢失和确认迟到的情况

比如B对A发送的分组M1的确认丢失了,那么A超时重传M1,B再次收到M1后,直接丢弃,但是需要再次向A发送M1的确认(不然A不知道B已经收到M1)

比如比如B对A发送的分组M1的确认遇到拥塞,在M1的确认到达A之前,A已经超时重传M1,B再次收到M1后,直接丢弃,但是需要再次向A发送M1的确认(B需要再次发送确认,因为B可不知道是丢失了还是只是拥塞超时…..),A可能先后两次收到M1的确认,对后到的确认直接丢弃即可

也就是说,接收方对收到的每一个分组,如果是重复的,直接丢弃,但是都必须发送确认;发送方对收到的每一个确认,如果是重复的,直接丢弃,并且超时时都必须重传

以上即是自动重传请求ARQ,是指重传是自动进行的,不需要接收方向发送方请求重传

停止等待协议简单,但是信道利用率太低,因为大量时间都耗费在了等待接收确认上,这期间信道是空闲的

改进:流水线传输,发送方可以连续发送多个分组,不必发完一个就停下来等待确认,这样信道不会长时间处于等待确认的空闲状态,可以提高信道利用率。相关协议:连续ARQ协议、滑动窗口协议

连续ARQ协议

发送方维持一个滑动窗口,位于发送窗口内的n个分组,可以连续发送出去,而不需要一一等待确认后再发送;每收到一个确认,比如发送窗口内是分组1-5,收到分组1的确认,那么发送窗口向前移动一个位置,窗口内变为2-6

累积确认是指,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组进行确认,表示到这一分组位置的分组已经正确接收。比如窗口内是1-5,连续发送1-5后,如果接收方回复了分组3的确认,那么代表1-3都已经正确收到,窗口向前移动,窗口内变为4-8

累积确认情况下,如果某个分组出错,那么它及它之后的分组都需要重传。比如发送窗口内是1-5,连续发送后,如果接收方只确认了1、2,但是分组3的确认超时等,那么3-5都需要重传,即Go-back-N(回退N)

TCP报文段首部格式

TCP报文段首部,一部分是固定的20字节,之后有长度可变的选项占4n和填充部分,占4n字节

首部固定字段:

  1. 源端口

占2字节

  1. 目的端口

占2字节

  1. 序号

占4字节,所以序号范围是[0,2^32-1],可对4GB数据进行编号。超出2^32时取模(再从零开始)。

TCP将对传送的所以字节编号,序号字段就是这一报文段的数据部分的第一个字节的序号,比如序号字段为301、携带了100字节的数据,那么这个报文段的数据部分是所有要传输的字节的第301-400个字节

  1. 确认号

占4字节

确认号为N,代表[0,N-1]范围内的字节已经正确收到,数值代表期望收到的下一个报文段的第一个数据字节的序号

比如,发送方发送了一个数据段,序号为501,数据部分有200字节,那么对这一数据段的确认报文段中,确认号是701,因为700及之前的已经收到

即,确认号为N,代表到序号(N-1)为止的数据已经正确收到

  1. 数据偏移

占4位,指出TCP报文段数据起始处距离报文段的起始处的长度,实际就是报文段的首部长度(首部有变长部分和填充部分,长度不是完全固定的)

但是是4字节,即,数据偏移字段为5时,数据段首部长度是4*5=20字节;数据偏移字段占4位,所以首部对多有(2^4-1)*4=60字节,除去固定的20字节,可变部分和填充部分最大40字节

  1. 保留

占6位,保留,置零

  1. 紧急URG(URgent)

占1位的控制位,当URG=1时,紧急指针有效,表示有紧急数据要发送,将把紧急数据插入到本报文段的最前面位置,一个报文段中可以紧急数据之后的数据跟有普通数据,所以要配合紧急指针使用,以区分紧急位置

  1. 确认ACK

占1位的控制位,ACK=1时确认号字段有效

  1. 推送PSH(PuSH)

占1位的控制位,发送方把PSH置为1,接收方就会尽快交付到应用进程,而不等待缓存填满

  1. 复位RST(ReSeT)

占1位的控制位,RST=1表示出错,必须释放连接,重新建立连接;或者用来拒绝一个非法的报文段或拒绝打开一个连接

  1. 同步SYN

占1位的控制位,在建立连接时用来同步序号,SYN=1表示是一个连接请求或连接接收报文

  • SYN=1、ACK=0,是连接请求报文段
  • SYN=1、ACK=1,表示同意建立连接的响应报文段
  1. 终止FIN

占1位的控制位,用来释放连接;FIN=1时,表明发送方数据发送完毕,要求释放连接

  1. 窗口

占2字节,所以窗口值范围是[0,2^16-1]内的整数

窗口是指发送这一报文段的接收方的接收窗口的大小,表示从这一报文段的确认号算起,接收方目前允许对方发送的数据量(这一数据量是受接收方的缓存空间限制的)

窗口值是作为接收方让发送方设置其发送窗口的依据,指明当前允许对方发送的数据量,是动态变化的

比如,一个报文段窗口字段是1000,确认号是701,那么表示从701算起,发送这一报文段的一方的缓存空间还可以接收1000个字节的数据

  1. 检验和

占2字节,检验范围包括首部和数据两部分;计算时,需要添加12字节的伪首部

  1. 紧急指针

占2字节

当URG=1时,紧急指针字段表示此报文段中紧急数据的字节数,之后的数据就是普通数据

窗口为零,也可以发送紧急数据

  1. 选项

长度可变,最大40字节

最初只规定了MSS(Maximum Segment Size)字段,最大报文段长度,是报文段中的数据字段的最大长度

MSS过小,因为TCP有固定的20字节首部、IP数据报有固定的20字节首部,所以每个IP数据报中数据字段占比很小,网络利用率低;如果MSS过大,IP数据报就需要分片,复杂性增加

最理想的是,MSS在IP数据报不需要分片的情况下尽可能大,但是IP数据报不需要分片的大小不是固定的,所以在连接建立时双方将支持的MSS写入这一字段,达成约定

默认MSS为536字节,所以因特网上所有主机都应能接收556字节的报文段长度(536+TCP固定的20字节首部),在加上IP数据报固定的20字节首部,正是IP协议规定的所有主机和路由器都必须能接受不超过576字节的数据报

TCP可靠传输的实现

以字节为单位的滑动窗口

发送发维护一个发送窗口,窗口左侧是已发送并且已确认的字节;窗口内靠左的部分是已经发送等待确认的字节,靠右的部分是可以发送但暂未发送的字节;窗口右侧是暂不能发送的字节(需要等窗口右移或者窗口右侧扩展);没有收到新的确认,或者收到了确认但是需要按接收方要求缩小窗口,那么窗口右侧暂不移动

已经发送的字节收到确认时,窗口右移,从左侧被移出窗口的字节成为已发送并已收到确认的字节,不必再保留;从右侧新进入的字节成为可发送但暂未发送的字节

接收方维护一个接收窗口,窗口左侧是已经交付并且发送了确认的字节;窗口内是允许接收的字节;窗口右侧是不允许接收的字节

接收方只能对按序收到的数据中的最高序号给予确认,比如窗口左侧序号是0-30,31暂未收到、32和33已经收到,那么确认号应是31(如果确认号是33,那么代表0-32都已经收到,期望下一个收到的是33)

如果发送方将窗口内可发送的数据都已经发送,但是没有收到确认,那么窗口不能右移,发送方只能等待确认,并在超时后重传未确认的数据

所以:

  • 发送缓存需要存储准备发送的数据和已发送但还未收到确认的数据
  • 接收缓存需要存储按序到达但尚未交付到应用程序的数据和未按序到达的数据(未按序到达的,由缓存暂存而不是直接丢弃,可以减少发送方的重复发送、节省网络资源)

注意:

  • 发送窗口是根据接收窗口设置的,理论上双方大小可以一样,但是受网络延迟和考虑拥塞情况等,可能大小不完全一致
  • 接收方对未按序到达的数据,并不是直接丢弃而是暂存在接收窗口中,等缺少的字节到达后按序交付,可以减少重复发送、提高网络利用率
  • 接收方必须有累积确认功能,以减少传输开销;确认稍作推迟也可以节省网络资源(但是推迟太久会导致发送方不必要重传,因此规定推迟不超过0.5s),也可以在接收方需要向发送方发送数据时顺便携带确认信息

超时重传时间的选择

超时重传时间过大会降低传输效率,过小会导致不必要的重传;时间选择需要考虑网络情况

TCP采用自适应算法,记录报文段发出的时间和收到其确认的时间,即报文段的往返时间RTT;对RTT加权平均,即每次的发出时间和确认时间的时间差计算的RTT和旧的RTT加权平均作为新的RTT,称为加权平均往返时间/平滑的往返时间

所以设置的超时重传时间RTO应当比RTT略大

问题:如果某个报文在超时时间内没有收到确认,重传后,收到了确认,那么无法判断是对第一个报文还是重传的报文的确认,也就无从确认加权平均的RTT

解决:使用Karn算法,对重传了的报文段,不采用其往返时间样本

问题:使用Karn算法下,如果网络出现问题导致时延增加,那么按照原来的重传时间不会收到报文段,而Karn算法下又不会采用重传的样本,所以超时重传时间也无法相应更新

解决:对Karn算法修正,对重传的报文段的情况,仍然不采用其往返时间,但是每次在发送重传时,将超时重传时间增大,直到不再发生重传

选择确认SACK

累积确认情况下,如果收到了未按序号的数据,比如31、34、35,虽然34、35可以暂存在接收窗口内,但是确认号只能是32,发送方在超时后会将已经收到的34、35也重传

可以使用SACK,在TCP报文段首部的选项字段中添加SACK字段和收到的未按序号的数据的边界

大多数实现未采用,仍然需要发送方重传所有未确认的数据块

TCP的流量控制

使用滑动窗口实现流量控制

流量控制即让发送方发送速率不要太快,以让接收方来得及接收;使用滑动窗口可以进行流量控制

接收方可以使用rwnd值说明接收窗口大小,发送发的发送窗口不能超过接收方给出的接收窗口的数值(窗口大小单位是字节);rwnd值为0时,发送方将暂停发送

问题:接收方发送一个消息声明rwnd并且发送方收到暂停发送后,如果接收方接收缓存有了空间可以继续接收了,发送消息说明了新的rwnd值,但是这一报文一直丢失,将会导致发送方一直暂停发送,出现互相等待的死锁情况

解决:TCP为每一个连接设置持续计时器,在一方收到零窗口通知时启动计时器,如果计时器到期,发送一个零窗口探测报文段,对方在对这一个报文段的确认中给出其当前的窗口值,如果窗口值仍然为零,那么重置并启动持续计时器,否则采用新的窗口值

发送时机与传输效率

每个报文段中数据部分长度不能超过最大报文段长度MSS,但是每个报文段发送数据太少,那么首部占比大,效率低

发送时机可以有:

  1. 缓存中数据达到MSS时发送
  2. 发送方应用进程指明要求发送时发送(TCP的push操作)
  3. 发送方计时器到期,将缓存内所有数据装入报文段发送(但是不能超过MSS)

问题:大量的小分组的发送

解决:TCP实现中使用Nagle算法,用于处理小报文段(微小分组)的发送问题,核心思想是允许网络中最多只能有一个小分组被发送,而待发送的其它小分组会被重新分组成一个”较大的”小分组,等收到上一个小分组的应答后再发送

比如,如果发送应用进程把要发送的数据逐个字节送到发送缓存,那么发送方将第一个字节先发送出去,将之后到达的缓存起来,收到第一个字节的确认后,将缓存的全部数据组装为一个数据段发送出去,同时继续缓存后续的数据,只有收到前一个报文段的确认后才继续发送下一个报文段;当缓存的数据达到发送窗口大小的一半或者达到MSS时,立即发送一个报文段

问题:糊涂窗口综合症,即如果接收缓存已满,而接收程序一次只读取很少的字节,那么每次接收窗口只能空出很小的字节的空闲,如果此时立即向发送方发送确认,发送方受限于接收窗口大小只能发送很小的分组

解决:这种情况下,让接收方等待一段时间,使得接收缓存有足够空间容纳一个长的报文段,或者接收缓存已有一半空闲,即向发送方进行确认,其中说明接收窗口当前大小

TCP拥塞控制

拥塞:在某段时间,如果对网络的某一资源(带宽、交换节点的缓存、处理机等)的需求超过了该资源能提供的可用部分

拥塞控制:防止防止过多的数据注入到网络中,以使得网络中的路由器或链路不至于过载;是一个全局性的过程,设计到所有主机、路由器等

流量控制往往指的是点对点通信量的控制,需要做的就是抑制发送端发送数据的速率,以使得接收端来得及接收

一旦发送拥塞,会导致更多超时重传,导致更加拥塞

拥塞控制原理

拥塞控制方法

慢开始、拥塞避免、快重传、快恢复

  1. 慢开始、拥塞避免

发送方维持一个拥塞窗口cwnd,其大小取决于网络拥塞程度并动态变化,并让发送窗口等于或者小于拥塞窗口;网络没有出现拥塞时,增大拥塞窗口,网络出现拥塞时,减小拥塞窗口

当没有收到确认报文时,一般是因为网络拥塞导致路由器丢弃了报文,可以认为出现了网络拥塞

慢开始算法:从小到大逐渐增大发送窗口。在刚开始发送报文段时,先把拥塞窗口cnwd设置为一个最大报文段长度MSS的数值,之后每收到一个报文段的确认,将拥塞窗口增加至多一个MSS的数值

所以,使用慢开始算法下,每经过一个传输轮次(就是指将拥塞窗口允许的报文段全部发出并收到其确认),拥塞窗口就加倍

慢开始算法只是让起始阶段发送速率慢,后续增长比较快,为了防止拥塞窗口增长过大引起拥塞,需要设置慢开始门限ssthresh;当拥塞窗口未达到慢开始门限时,使用慢开始算法,当达到慢开始门限时,改用拥塞避免算法

拥塞避免算法:让拥塞窗口缓慢增大,每经过一个往返时间RTT就把发送方的拥塞窗口cnwd增加一个MSS的长度(拥塞窗口允许发送的全部发送完并收到确认后,拥塞窗口增大一个MSS)(慢开始算法是指数增长,拥塞避免算法是线性增长)

如果发送方发现出现拥塞(未按时收到确认就认为出现拥塞),立即将慢开始门限设置为发现拥塞时的发送窗口的一半大小,并把cnwd重置为1,再次使用慢开始算法,以迅速减少发送到网络中的分组数

因为拥塞避免算法使得拥塞窗口线性增加,而出现拥塞时慢开始门限是对半减少,所以慢开始、拥塞避免算法合称为加法增大乘法减小算法(AIMD算法)

  1. 快重传、快恢复

在慢开始、拥塞避免下,一出现拥塞,立即乘法减小,慢开始门限减半、拥塞窗口置1、执行慢开始

快重传、快恢复可以提高TCP性能(慢开始起始阶段太慢)

快重传就是,接收方每收到了一个失序的报文后,立即重复确认,以尽快告知发送方缺少了某一个报文。比如接收方收到了1、2、3、5、6、7、8,缺少了4,接收方在收到6时立即确认3(ack=4),之后收到7、8也立即重复确认3(ack=4),这样发送方在连续收到了三个重复的确认报文后,不再等待超时,而是立即重传4。如此,网络吞吐量可以提高

快恢复是指,在快重传情况下,当发送方收到了连续三个重复的确认报文后,立即执行乘法减小,把慢开始门限减半,但是把拥塞窗口设置为慢开始门限(执行了乘法减小而减半后的数值),继续执行拥塞避免算法(而不是转而执行慢开始算法、将拥塞窗口置1,因为能连续收到三个重复确认,可以说明当前网络拥塞并不严重)

慢开始算法只在TCP连接建立和网络超时时使用

如果再考虑接收窗口对发送窗口大小的制约,那么发送窗口的大小不能超过:Min[接收窗口,拥塞窗口]

随机早期检测RED

TCP运输连接管理

建立连接

三次握手

连接建立过程中,需要解决的问题有:

  • 使每一方都确知对方的存在
  • 协商参数,如最大窗口值、是否允许窗口扩大选项、时间戳选项等
  • 对运输实体资源进行分配,如缓存大小、连接表中的项目等

连接建立的过程,是client主动请求、主动打开连接,server被动打开、被动等待连接建立

  1. client和server初始都是CLOSED状态;server创建传输控制块、准备好接收连接请求后即进入listen状态
  2. client创建传输控制块,向server发出连接请求报文段,首部SYN=1、ACK=0,seq为一个初始序号x(TCP规定,SYN报文段不携带数据,但是需要消耗一个序号);发送后client进入到SYN-SENT状态
  3. server收到SYN报文段后,如果同意创建连接,那么向请求的client发出确认,确认报文段首部的SYN=1、ACK=1、ack=x+1,seq为server选择的起始序号y(同样的,也是个SYN报文,不能携带数据但是需要消耗一个序号);发送后server进入到SYN-RCVD状态
  4. client收到server的确认报文段后,回复一个确认报文段,首部ACK=1、ack=y+1,seq为自己的序号x+1(ACK报文段可以携带数据,但是不携带数据时不消耗序号);发送后client进入到ESTABLISHED状态
  5. server收到client的确认报文段,进入ESTABLISHED状态

问题:为什么要三次握手(为什么client在收到server的确认后,要再向server发送一个确认报文段)

为了避免失效连接请求引起的错误。比如,client发送一个SYN报文段A请求建立连接,但是A在网络中滞留,client在超时后重传SYN报文段B请求建立连接,server回复对B的确认;此时A到达server,server仍然对A进行确认;如此,server维持了两个和这一client的连接,但其实client认为A是超时无效的,无法使用。因此引入第三次握手,这样的情况下,client对B确认后,双方建立连接,之后server对A的确认,client不回复确认,因此A不会导致server维护一个无效连接

释放连接

四次挥手

数据传输结束后,TCP两端都可以释放连接

以下以client主动关闭连接为例:

  1. 数据传输中,client、server均处于ESTABLISHED状态
  2. client发送连接释放报文段,首部FIN=1、seq=u(u是之前client发送所有字节数的序号再加1)(FIN报文段不论带不带数据,都消耗序号),不再发送数据;发送后client进入FIN-WAIT-1状态
  3. server收到FIN报文段,立即回复确认,首部ACK=1、ack=u+1、seq=v(v是之前server发送所有字节数的序号再加1);发送后server进入CLOSE-WAIT状态,此时TCP连接处于半关闭状态,server仍然可以向client发送数据
  4. client收到server的确认报文段,进入FIN-WAIT-2状态,等待server的连接释放报文段
  5. server如果有数据需要发送,继续发送;发送完毕后,server向client发送FIN报文段,首部FIN=1、ACK=1、ack=u+1(与server上次对client的FIN报文段的ack相同),seq=w(server可能有发送了数据,seq是之前server发送所有字节数的序号再加1);发送后server进入LAST-ACK字段
  6. client收到server的FIN报文段后,回复确认报文段,首部ACK=1、ack=w+1、seq=u+1(seq与client之前的FIN报文段的seq相同,因为FIN报文段不消耗序号);发送后client进入TIME-WAIT状态
  7. server收到client的确认,进入CLOSED状态;client等待2MSL时间后,进入CLOSED状态,撤销传输控制块后结束连接

MSL:最长报文段寿命

问题:为什么client发出确认后,要在CLOSED-WAIT状态等待2MSL才进入CLOSED状态

  1. 防止client发送的确认报文段丢失,导致server一直处于LAST-ACK状态(server可能会超时重传,但是仍然无法收到client的确认);client等待2MSL,可以确保client的确认报文段可以正确到达server段(可能丢失后server重传FIN报文段、client重传确认报文段)(因为client需要在CLOSED-WAIT状态等待2MSL,所以反而是被动方server先结束连接)
  2. 防止无效连接请求报文段出现。仍然是1的情况下,如果在server重传FIN报文段时,client已经在原端口建立了新的连接,将会造成异常

问题:正常建立连接后client故障,可能使server一直维持这个连接并等待

server设置保活计时器(两小时),每收到了client的报文段就重置保活计时器,而如果保活计时器过期仍然没有收到client的数据,就发送一个探测报文段,之后每75分钟发送一次,如果连续发送了10个探测报文段仍然没有回应,认为client出错,关闭连接

问题:出现大量CLOSED-WAIT状态的连接?

收到对方的FIN报文段并回复ACK后将进入CLOSED-WAIT状态,之后若是程序在等待IO等耗时操作或者忘记close导致没有close连接,将会导致连接一直处于CLOSED-WAIT状态

应用层

应用层协议解决某类具体的应用问题

一般是客户-服务器模方式,客户是服务请求方,服务器是服务提供方

域名系统DNS(Domain Name System)

DNS把便于人们记忆、使用的主机名字转换为IP地址

DNS是一个联机分布式数据库系统,采用client-server模式,大多数名字可以在本地解析,少部分需要在因特网上查询域名服务器

需要将域名解析为IP地址时,应用进程将需要解析的域名放到DNS请求报文,封装到UDP报文中,向本地域名服务器发送,本地域名服务器查找后将解析到的IP地址返回,如果本地DNS服务器查找不到,那么以本地域名服务器作为client向其他域名服务器发起查询请求

因特网域名结构

使用层次树状结构,即域、子域、子域的子域……

域名空间最上面是根(但是根没有对应的名字),下面一层是顶级域名,然后二级域名、三级域名……

域名服务器

通过划分区实现域名系统

某个域名服务器所负责管辖的范围叫做区,一个区内的节点应该是能够连通的,区小于等于一个抽象的域;每个区设置相应的权限域名服务器,保存该区内所有主机的域名到IP地址的映射

域名服务器同样按照层次安排,可以分为:

  • 根域名服务器

最高层次的域名服务器,最重要,有13个

所有根域名服务器都知道所有顶级域名服务器的域名和IP地址;所有本地域名服务器,如果无法解析域名,就首先求助于根域名服务器;如果所有根域名服务器都瘫痪了,那么DNS就无法工作

每个根域名服务器由多台机器组成,分布在多地,使用任播技术,当DNS客户端使用某个根域名服务器的IP向某个根域名服务器查询时,因特网上的路由器就能找到最近的根域名服务器;根域名服务器不直接存储所有的信息,而是只能告知本地域名服务器下一步到哪一个顶级域名服务器查询

  • 顶级域名服务器

负责管理对应的顶级域名下的所有二级域名,当收到DNS查询请求时给出回答(解析结果或者下一步到哪一个顶级域名服务器查询)

  • 权限域名服务器

负责一个区,当收到DNS查询请求时给出回答(解析结果或者下一步到哪一个顶级域名服务器查询)

  • 本地域名服务器

也称为默认域名服务器

当要查询的主机属域同一个ISP时,可以立即转换为对应的IP地址,而不需要询问其他域名服务器

为了可靠性,DNS将数据复制到多个域名服务器,其中一个作为主域名服务器,其他的是辅助域名服务器,当主域名服务器故障时辅助域名服务器保证DNS查询工作不会中断;主域名服务器定期复制数据到辅助域名服务器,但是更改数据只能在主域名服务器进行,以保证一致

域名解析过程:

  1. 递归查询

主机向本地域名服务器的查询一般是递归查询

本地域名服务器无法解析时,作为DNS client向其他根域名服务器发出查询请求报文,然后由根域名服务器负责继续进行查询,最终向本地域名服务器返回的是解析结果或者无法解析的报错信息

比如:主机->主机向本地域名服务器发送查询请求报文->本地域名服务器向根域名服务器发送查询请求报文->根域名服务器向顶级域名服务器发送查询请求报文->顶级域名服务器向权限域名服务器发送查询请求报文->权限域名服务器向顶级域名服务器返回查询结果->顶级域名服务器向根域名服务器返回查询结果->根域名服务器向本地域名服务器返回查询结果

这一过程是递归的,所以叫递归查询

  1. 迭代查询

本地域名服务器向根域名服务器的查询通常是迭代查询

根域名服务器收到本地域名服务器的迭代查询请求报文时,如果无法解析,那么返回下一步可以查询的域名服务器,本地域名服务器继续向返回的域名服务器进行查询

比如:本地域名服务器向根域名服务器查询->根域名服务器返回下一步查询的顶级域名服务器的地址->本地域名服务器向根域名服务器返回的顶级域名服务器查询->顶级域名服务器向本地域名服务器返回下一步查询的权限域名服务器的地址->本地域名服务器向返回的权限域名服务器查询->权限域名服务器向本地域名服务器返回解析结果

这一过程是迭代的,所以叫迭代查询

为了根域名服务器的符合、减少网络上DNS查询报文数量,在域名服务器使用高速缓存,存访最近查询过的域名和从何处获得域名映射信息记录;并需要为高速缓存设置合理过期时间

文件传送协议

FTP/TFTP:若要存取一个文件,必须先复制整个文件,得到一个文件的本地副本,如果要修改,只能先对副本进行修改,然后将修改后的文件回传到原节点

网络文件系统NFS:允许多个程序同时对一个文件进行存取,对远程共享文件的访问由远程操作系统提供,对用户是透明的

文件传送协议FTP

FTP使用TCP协议,主要功能是减少或消除在不同操作系统下处理文件的不兼容性;使用C/S方式

FTP主进程负责接受新的请求,若干个从属进程负责处理单个请求:

  • 主进程打开21端口,之后客户端可以连接
  • 主进程等待客户进程的连接请求,有请求到来时,启动一个从属进程来进行处理;从属进程处理完成后即终止,也可以根据需要启动新的从属进程
  • 主进程启动从属进程处理请求后,重新回到等待状态,继续接受客户进程请求

所以FTP的主进程和从属进程是并行的,一个FTP进程可为多个用户进程提供服务

进行文件传输时,需要建立起两个并行的TCP连接,即控制连接和数据连接,相应的两端有控制进程和数据传送进程:

  • 控制连接在会话中一直打开,传送请求通过控制连接交由控制进程处理
  • 控制进程收到客户进程发送的传输请求后,创建数据传送进程和数据连接,连接的两端分别是服务器和客户端的数据传送进程,负责文件的传送,传送完毕后关闭数据传送连接、数据传送进程终止

客户进程请求建立连接时,连接到的是服务器的21端口,客户进程需要声明一个端口用于建立数据传送连接,服务器数据传送进程使用自身20端口与客户进程这一声明的端口建立数据传送连接

网络文件系统NFS

NFS允许应用进程打开一个远程文件,并且能在该文件的特定位置开始读写数据;所以NFS可以只复制一个文件中的某个小片段,而不是必须复制整个文件,所以网络上需要传送的只是少量的修改数据

简单文件传送协议TFTP

TFTP使用C/S方式;使用UDP,因此需要有自己的差错改正机制;只支持文件传输,不支持交互;不支持用户身份鉴别等

优点:

  • 可用于UDP环境,比如多机器同时下载
  • 代码占内存小

主要特点是:

  • 除了不足512字节时一次性发送,每次传输512字节的数据
  • 数据报文按序编号,序号从1开始
  • 支持ASCII码或二进制传送
  • 可对文件读或者写
  • 首部简单

TFTP每发送一个文件块,需要等待对方确认,并且有超时重传,确认报文也有超时重传

其实阶段,服务器进程监听69端口;客户进程发送读/写请求报文到服务端;服务器进程选择一个端口与客户进程通信;如果最后一个文件块也恰好是512字节,需要客户进程再发送一个不携带数据、只有首部的数据报文;如果某个报文不足512字节,那么表示已经到了文件结束

远程终端协议TELNET

使用TELNET可以远程连接注册/登录到远程主机上,将本地的击键传到远程主机、将远程主机的输出通过TCP连接返回到用户屏幕,用户对远程主机的使用是透明的

TELNET使用client-server方式;本地运行TENLET客户进程,远程主机运行TELNET服务器进程;服务器进程中主进程等待请求,启动新的从属进程来处理请求

为了兼容不同操作系统下的击键(比如有的使用ctrl-c表示中断,有的使用ctrl-d表示,有的使用esc表示),TELNET使用网络虚拟终端NVT,客户端将用户的击键和命令转换成NVT格式,使用NVT格式在网络上传输,服务器端将NVT格式的数据和命令转为远程系统使用的格式

万维网WWW

万维网,即Web,一个大规模、联机式的信息储藏所

URL

URL格式:<协议>://<主机>:<端口>/<路径>

主机通常就是某个主机在因特网上的域名

HTTP

URL格式:://<主机>:<端口>/<路径>

HTTP协议默认端口80,一个面向事务的协议,使得可以可靠的交换文件

HTTP服务器进程监听TCP的80端口,浏览器发起连接请求,建立连接之后浏览器就可以向服务器发出浏览某个页面的请求,服务器返回请求的页面

HTTP协议的无状态的,同一个客户第二次访问同一个服务器上的同一个页面时,服务器的响应与第一次访问相同(没有更新内容的情况下)

HTTP/1.0是非持续连接,只能对多个链接的对象一次链接、多次下载

HTTP/1.1使用持续连接,在服务器发送响应之后仍然可以在一段时间内保持这一连接,所以仍然可以继续在这一连接上传送后续报文

持续连接的非流水线方式:收到前一个响应后,才发出下一个请求

持续连接的流水线方式:不必等待收到响应,直接发送新的请求,最终访问了所有对象只需要花费一个RTT的时间

代理服务器

代理服务器,又称为万维网高速缓存,可工作在服务器端或客户端或中间系统上;代理服务器将最近的一些请求和响应暂存到本地磁盘,当新请求到达时,如果发现与之前暂存的请求相同,可以直接返回暂存的响应而不需要向服务器请求

HTTP报文结构

两类报文:

  • 请求报文,从客户发向服务器
  • 响应报文,服务器向客户的应答

HTTP是面向文本的,报文字段都是文本的,各个字段的长度也不固定

报文包括:

  1. 开始行

区分是请求报文还是响应报文

请求报文:开始行称为请求行,包括请求方法、请求的URL、HTTP协议版本

常见的请求方法:

  • GET
  • POST
  • PUT
  • DELETE
  • OPTION
  • HEAD
  • TRACE
  • CONNECT

响应报文:开始行称为状态行,包括HTTP协议版本、状态码、短语

状态码有:

  • 1xx,表示通知信息,通知请求已收到、请求正在处理等
  • 2xx,成功
  • 3xx,重定向
  • 4xx,客户端错误
  • 5xx,服务器错误

常见的状态码:

  • 200,ok
  • 301,永久重定向
  • 302,暂时重定向
  • 400,bad request(通常是参数、首部、格式等错误)
  • 401,unauthorized
  • 403,forbidden,访问被禁止
  • 404,not found
  • 405,Method Not Allowed
  • 500,Internal Server Error
  • 502,Bad Gateway
  • 503,Service Unavailable,服务器超载或维护等而服务不可用
  • 504,Gateway Timeout
  1. 首部行

可以包括零到多行,每行包括一个首部字段和对应的值,结束后跟有一空行

  1. 实体主体(entity body)

请求报文一般不携带,响应报文可能不携带

Cookie即在HTTP服务器和客户之间传递的状态信息,以使得服务器可以在无状态的HTTP协议下记住用户的身份

服务器在响应报文的首部行添加一个”Set-cookie: xxx”,客户端服务器就在其cookie存储中保存这一纪录,并且会记录这一cookie对应的主机名等;该用户再次访问这一网站时,浏览器会将保存的cookie内容取出、添加到请求报文,比如在首部行添加一行”Cookie: xxx”

HTML

超文本标记语言HTML(HyperText Markup Language),静态发万维网文档

动态万维网文档

文档的内容在浏览器访问万维网服务器时才有服务器的应用程序动态的创建

JavaScript

活动万维网文档

活动文档的内容是不变的,也是静态文档

java applet

万维网的信息检索系统

全文检索搜索引擎,纯技术型的检索工具;通过搜索软件到各个网站收集信息,从一个网站链接到下一个网站…然后按照一定规则建立在线数据库供用户查询,用户查询时,使用关键字,在已经建立的索引数据库中查询而不是实时的在网络上检索;如Google、百度

分类目录搜索引擎,不采集网站的任何信息,而是利用各个网站向搜索引擎提交的网站信息中填写的关键词和网站描述等,经过人工审核编辑后,符合的则录入到分类目录的数据库中,供用户查询;用户使用时,按照网站设定好的目录逐级查询;如雅虎

垂直搜索引擎,针对某一特定领域、特定人群或某一特点需求提供搜索服务;根据关键字搜索,面向的是某个行业;如购物时的搜索

元搜索引擎,将用户提交的检索请求发送到多个独立的搜索引擎上搜索,将结果统一处理,以统一格式提供给用户

电子邮件

电子邮件地址格式:用户名 @ 邮件服务器的域名

简单邮件传送协议SMTP

发送邮件时使用SMTP

邮件读取协议POP3和IMAP

读取邮件时使用

通用因特网邮件扩充MIME

动态主机配置协议DHCP

连接到因特网的计算机的协议软件需要配置:IP地址、子网掩码、默认路由器的IP地址、域名服务器的IP地址

DHCP使用C/S方式,使用UDP

比如IP地址的动态配置:

  • 需要IP地址的主机向DHCP广播一个发现报文(目的地址全1,源地址全0(因为主机这时还没有分配IP地址)),以得知DHCP服务器的地址
  • 本地网络上所有主机都可以收到这一广播报文,但只有DHCP服务器才会挥发(可能一个或多个DHCP服务器回答);DHCP服务器在数据库中查找这一主机的配置,查找不到时从IP地址池去一个地址分配给该计算机,返回提供报文
  • 主机在收到的一个或多个提供报文中选择一个使用,向对应的DHCP服务器发送DHCP请求报文
  • 该DHCP服务器回复确认报文,请求的主机和DHCP为它分配的IP地址称为已绑定状态

简单网络管理协议SNMP

应用进程跨越网络的通信

系统调用和应用编程接口

网络安全

安全问题

被动攻击,即截获,攻击者从网络上窃听通信内容但是不干扰信息流

主动攻击:

  • 篡改,攻击者故意篡改报文,比如中断报文传送、伪造报文
  • 恶意程序,病毒、木马等
  • 拒绝访问,即Dos(Denial of Service),攻击者向因特网上某个服务器不停发送大量分组使得服务器一直处于忙的状态而无法提供正常服务;分布式拒绝服务DDoS

对称加密与非对称加密

对称密钥密码体制

加密密钥和解密密钥是相同的密码体制

如DES,算法是公开的,安全性取决于密钥的保密

公钥密码体制

使用不同的加密密钥与解密密钥,用于解决两类问题:对称密钥密码体制的密钥分配问题;数字签名

如RSA

加密密钥即公钥是公开的,解密密钥即私钥需要保密

加密方法的安全性,仍然是取决于密钥的长度和攻破密文需要的计算量;公钥密码体制由于开销大,仍然是配合对称密钥使用的

数字签名

数字签名用于:

  • 合适发送者身份,防止伪造
  • 接收者可以确信收到的数据没有被篡改过
  • 发送者对报文的签名不可否认

数字签名即,A使用私钥加密,B使用A的公钥解密,可以解密那么就可以确认A的身份、解密可以得到报文那么就说明没有被篡改(篡改时,因为无法得到A的私钥,所以会使得篡改后的报文解密后不可读)、第三方可以使用A的公钥证实A发送了这一报文而不可否认

如果签名需要保密,可以:A使用A的私钥加密报文->A使用B的公钥加密报文->B使用B的私钥解密报文->B使用A的公钥解密报文,即使用B的公钥、私钥做了加密

鉴别

鉴别,authentication,验证身份

授权,authorization,判断某行为是否拥有权限

报文鉴别

报文可能不需要加密,但是需要数字签名,而非对称对长的报文加密解密太耗时

报文摘要MD(Message Degest),对较长的报文执行摘要算法后得到一个比较短的摘要,用私钥对得到的摘要加密,即进行了签名;接收方对加密的摘要使用发送方的公钥解密,得到明文的摘要,再次对报文计算摘要计算,对比结果,如果一致,就能以极高的概率断定收到的报文是A产生的

报文摘要算法,一个散列函数,是单向的,即可以由内容计算出摘要,但是不能逆运算得到内容,并且不可能有不同的报文拥有相同的摘要;如MD5算法、SHA安全散列算法

实体鉴别

重放攻击——不重数

中间人攻击

密钥分配

对称密钥分配

通过密钥分配中心KDC

公钥的分配

通过可信的机构认证中心CA

每个实体可以持有CA发放的证书,里面有公钥和拥有者的标识信息,CA对证书进行数字签名;任何用户可以通过可信渠道得到CA的公钥,使用CA的公钥来验证证书、验证某个公钥是否是某实体所有

因特网使用的安全协议

网络层安全协议

IPsec

运输层安全协议

安全套接字层SSL(Secure Socket Layer)

运输层安全TLS

SSL/TLS工作在运输层和应用层之间

比如https,是HTTP调用SSL/TLS对整个网页进行加密;在发送方,SSL接受应用层的数据,进行加密后送往TCP socket,接收方SSL从TCP socket读取数据后解密、交给应用层

https默认端口443,使用https时,在建立TCP连接后,首先进行浏览器和服务器之间的握手协议,完成加密算法的协商和会话密钥的传递,然后进行安全数据传输,过程为:

  • 协商加密算法;浏览器向服务器发送浏览器的SSL版本号和一些可选的加密算法,服务器选定一个支持的算法并告知A
  • 服务器鉴别;服务器向浏览器发送一个包含其RSA公钥的数字证书,浏览器通过发放该证书的CA的RSA公钥,对该证书进行验证
  • 会话密钥计算;浏览器随机产生一个秘密数,用服务器的RSA公钥加密后发送到服务器,双方根据协商的算法产生一个共享的对称会话密钥
  • 安全数据传输;双方使用会话密钥加密和解密传送的数据并验证其完整性

应用层安全协议

PGP