您的位置:首页 > 理论基础 > 计算机网络

计算机网络复习

2015-04-18 21:23 169 查看

差错控制

CRC 循环冗余码

信息位为N位,在后面添加K位冗余位

已知的生成多项式是K+1位的,即若生成多项式是5位,则冗余位为4位。

将信息位左移K位,去除以生成多项式对应的二进制码,得到K位余数,此时得到CRC码为N位信息位+K位余数冗余位。注意除法中的减法不借位。

客户端接收到的码字除以生成多项式对应的二进制代码,能整除则无错,否则就有错。

例子:

已知信息位为
1100
,生成多项式为G(x)=x3+x+1G(x) = x^3 + x + 1,求CRC码。

解:

生成多项式是4位的,因此冗余位为3位。将信息位左移三位,得到

1100000 // 左移三位,低位补0


1100000
除以生成多项式对应的二进制代码
1011
,注意除法中的减法不会借位。得到的结果商为
1110
,余数为
010
。因此,CRC码为

1100010 // 将余数替换左移的那三位数字


它是检错码,检验的方法也很简单,在接收端接收到的完整CRC码,去除以生成多项式对应的二进制码,若整除则无错,否则就有错。

海明码

若信息位为K位,增加R位冗余位,需要满足关系式

2R>=K+R+12^R >= K +R + 1

比如4位信息位,满足关系式的最小R位3。

下面是比较tricky的海明码的生成算法:

假设信息位为

10101011 // 从左到右分别编号为D8, D7, ... D1


根据关系式,满足不等式的最小R为4,即需要4位冗余位。我们将冗余位标记为
P1, P2, P3, P4
。冗余位要放置在
1, 2, 4, 8, 16, 32, 64..
即2r2^r的位置上,因此合并后的码字为

.D8D7D6D5D4D3D2D1
码字1010P4101P31P2P1
下标121110987654321
现在,需要计算冗余位的数据。计算方法为将数据位所在位置用冗余位的位置关系来表示(即用1,2,4,8..来表示)

Index(D1) = 3 = 1 + 2
Index(D2) = 5 = 1 + 4
Index(D3) = 6 = 2 + 4
Index(D4) = 7 = 1 + 2 + 4
Index(D5) = 9 = 1 + 8
Index(D6) = 10 = 2 + 8
Index(D7) = 11 = 1 + 2 + 8
Index(D8) = 12 = 4 + 8


根据这种位置上的关系,可以看到P1出现在D1,D2,D4,D5,D7中,因此

P1 = D1 ^ D2 ^ D4 ^ D5 ^ D7 = 1
// 同理可得
P2 = D1 ^ D3 ^ D4 ^ D6 ^ D7 = 1
P3 = D2 ^ D3 ^ D4 ^ D8 = 1
P4 = D5 ^ D6 ^ D7 ^ D8 = 0


将P1~P4带入,得到海明码为

101001011111


进行校验时,假设D1出现差错,则

P1 ^ D1 ^ D2 ^ D4 ^ D5 ^ D7 = 1
P2 ^ D1 ^ D3 ^ D4 ^ D6 ^ D7 = 1
P3 ^ D2 ^ D3 ^ D4 ^ D8 = 0
P4 ^ D5 ^ D6 ^ D7 ^ D8 = 0


得到的结果为
0011
,表示数字3,对应的刚好是数据位D1,即可纠错。

拥塞控制

网络层的拥塞控制

两种方法:

1. 闭环控制:事先考虑拥塞原因,尽量避免拥塞的静态预防法

2. 开环控制:基于反馈环路的概念,检测拥塞的产生并处理,是一种动态的方法。

传输层的拥塞控制

发送方有拥塞窗口进行拥塞控制,窗口动态变化,只要未拥塞,窗口就增大,只要拥塞,窗口就减小。控制算法如下图所示



慢开始:拥塞窗口从1开始成指数增长,达到阀值后开始拥塞避免算法

拥塞避免:窗口线性增长,直到出现拥塞。此时修改阀值=当前窗口/2,重新从慢开始开始。

此时,发送窗口的实际大小由接收窗口和拥塞窗口共同控制,取他们的最小值。

流量控制

数据链路层的流量控制

基于滑动窗口的流量控制方式。

发送方维持一组允许发送的帧序号,称为发送窗口。其大小表示在未收到确认的情况下,最多允许发送的帧数目。若发送窗口为空,则表示停止发送。

接收方维持一组允许接收的帧序号,称为接收窗口。只有在接受窗口中的帧才能接收,其他的则全部丢弃。

发送窗口只有接收到确认后,才能滑动一个帧的距离;接收窗口只有收到帧并发送一个确认后,才能移动一个帧的距离。因此,只有接受窗口先移动,发送窗口才能移动。

数据链路层中的停等协议,回退N协议和选择重传协议只是在发送、接收窗口大小上有差异。

停等协议相当于发送=1,接收 = 1

回退N协议相当于发送>1, 接收 = 1

选择重传协议相当于发送>1,接收>1

数据链路层的窗口大小是固定的。

传输层的流量控制

传输层的流量控制也是使用滑动窗口协议,原理上跟上面的相同,不同之处在于传输层的滑动窗口大小是可变的。

在接收方,根据自己接收的缓存的大小,动态的更新发送方的窗口大小,即窗口字段,表示接收方能接收的最大字节数目。发送方根据窗口字段限制自己发送窗口的大小。

发送窗口的实际大小取拥塞窗口和接收窗口中的最小值。

数据在各层当中的封装



路由算法

RIP:基于距离-矢量算法(基于UDP)

路由信息协议

距离也称为路由器的跳数。跳数为0表示直接连接。RIP认为跳数越少越好。

每隔30秒就跟相邻节点之间交换路由表。一开始的时候每个节点都只知道相邻节点的路由信息,一次广播后就能知道跳数为1的路由,N次广播后就能知道整个网络的路由,最终是收敛的。

跳数最大为16,即最多只能经过15个路由器,再多的话就被标记为不可达。

例子:

A收到B发过来的RIP报文
<C, 3>
,A将该报文修改为
<C, 4>


若A中没有C,则插入;若A中到C的跳数大于4,则更新为A经过B可达到C,距离为4。

若某个节点180秒没有更新过,则修改为16(不可达)。

缺点:

每次更新需要发送全部路由表,占用带宽大

网络出现故障时,收敛速度慢。

OSPF:基于链路状态路由算法(基于IP)

开放最短路径优先协议

使用泛洪法,向本域内所有路由器广播更新信息,而不只是相邻节点。

广播的是临近节点的链路状态,而不是整个路由表。

只有改变时才更新,而不是定时更新,收敛速度快。

每个路由器使用dijkstra算法计算最短路径,只需要保存下一跳,不需要保存完整路径。

BGP:基于路径-矢量算法(基于TCP)

边际网关协议,用于不同自治域之间的路由信息交换。

由BGP发言人建立TCP链接,交换路由信息,然后各个自治域就能找到到达对方的最短路由。

BGP是各个自治域之间的路由交换,交换数量相比域内小很多。

路由表中,需要记录网络号前缀,下一跳的路由,以及中间可能经过的其他域的序列。

同样是有变化时才交换变化的部分,节省带宽。

IP数据报



标识、标志和片偏移用于IP分片,当IP数据报大于数据链路层能传输的最大数据单元的时候,就需要分片。

生存时间即TTL。每经过一个路由器TTL-1。当TTL等于0的时候,该报文就会被丢弃。

注意:校验和只是校验IP首部,不会去校验数据部分。

协议字段中,6表示TCP,17表示UDP。

TCP报文



序号以数据字节为单位(不含头部),比如序号301,数据100B,下个序号就从401开始。

确认号为N,表示N-1的数据包都已经收到。

数据偏移以4B为单位,比如偏移为15,表示数据部分在60B之后,也相当于首部大小为60B。

窗口用于滑动窗口协议的流量控制。如序号701,窗口大小1000,表示可以接受701~1700之间的报文。

检验和会校验头部和数据部分,此处跟IP的校验和不同。校验时会在TCP的头部前面添加12B的伪首部,然后进行校验和计算。

UDP报文



UDP长度至少是8B,即只有首部。

校验和跟TCP的一样,也是校验首部和数据。校验时也需要添加12B的伪首部,再进行校验和计算。

TCP链接管理



三次握手

客户端发送请求报文,设置初试序号,SYN=1,序号=x,状态=SYN-SEND。(第一次握手)

服务端接收报文,分配资源,发送确认,SYN=1,ACK=1,序号=y,确认号=x+1,状态=SYN-RCVD。(第二次握手)

客户端接收确认,发送确认,SYN=1,ACK=1,序号=x+1,确认号=y+1,状态=ESTABLISHED。(第三次握手)

服务端收到确认后,状态也变为ESTABLISHED,开始数据传输。

四次放手

客户端发送连接释放报文,FIN=1,序号=u,状态=FIN-WAIT1(第一次放手)

服务端接收到报文,ACK=1,序号是v,确认号是u+1,此时进入半连接状态,状态=CLOSE-WAIT。(第二次放手)

客户端接收到ACK之后,状态=FIN-WAIT2

服务端数据传输完毕之后,发送结束报文,FIN=1,ACK=1,确认号是u+1,序号是w(序号不是v+1是因为关闭前可能又传输若干数据)。状态=LAST-ACK。(第三次放手)

客户端接收到FIN之后,发送最后的ACK=1,序号=u+1,确认号=w+1,状态=TIME-WAIT,等待2MSL之后状态=CLOSED。(第四次放手)

服务端接收到ACK之后,状态=CLOSED。

应用层协议

在浏览器的地址栏中输入网站域名并回车后,都发生了哪些?

url为http://www.blabla.com,浏览器分析url,使用http协议进行解析。

浏览器在本机DNS缓存中查找域名对应的ip,如果没查找到,则向DNS服务器发送DNS请求(基于UDP),最终得到域名对应的ip地址。

浏览器使用默认端口80,向该ip地址建立TCP链接,发送HTTP GET请求。

服务器检测GET请求,按照内部逻辑返回对应的状态码(200,301,302,304,400,401,404,500)。

假设服务器返回状态码200,将默认页面index.html返回给浏览器,浏览器按照http协议解析response,然后根据响应的内容决定如何去渲染(image,xml,html等)。

浏览器将渲染后的结果显示给用户,并在浏览器中缓存一部分数据。

DNS是如何解析的?

www.abc.com从左到右依次是三级域名,二级域名和顶级域名。

全球13个跟域名服务器负责顶级域名管理。但是他们并不负责域名解析,而是给出应该去查询哪个顶级域名服务器。

域名解析过程如下:



1. 首先向本地域名服务器进行域名解析(我们填ip地址时的域名服务器地址)。

2. 如果没查到,则本地域名服务器会向跟域名服务器进行迭代查找,跟服务器返回顶级域名服务器地址

3. 本地域名服务器向顶级域名服务器查找,若顶级域名服务器找不到,则给出授权域名服务器地址。

4. 本地域名服务器向授权域名服务器查找,若找到则缓存并返回对应ip,否则返回DNS解析失败。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: