其他分享
首页 > 其他分享> > 读书笔记之网络

读书笔记之网络

作者:互联网

1.因为B根据自己的子网掩码,计算出A属于不同子网,跨子网通信需要默认网关的转发。而要和默认网关通信,就需要获得其MAC地址。B收到了A发出的ARP广播,这个广播查询的是B的MAC地址。这是因为在A看来,B属于相同子网,同子网通信无需默认网关的参与,只要通过ARP获得对方MAC地址就行了。这个包也表明默认网关成功地把B发出的ping请求转发给A了,否则A不会无缘无故尝试和B通信。B回复了A的ARP请求,把自己的MAC地址告诉A。这说明B在执行ARP回复时并不考虑子网。虽然ARP请求来自其他子网的IP,但也照样回复。B先把ping请求交给默认网关,默认网关再转发给A。而A收到请求后直接把ping回复给B

 

2.应用层:这一层的详细信息,会发现它只专注于文件操作,比如读或者写,而对于数据传输一无所知。

• 传输层:这一层用到了TCP 协议。应用层所产生的数据就是由TCP来控制传输的。点开TCP层前的“+”号,我们可以看到Seq号和Ack号等一系列信息,它们用于网络包的排序、重传、流量控制等。虽然名曰“传输层”,但它并不是把网络包从一个设备传到另一个,而只是对传输行为进行控制。真正负责设备间传输的是下面两层。TCP是非常有用的协议,也是本书的重点。

• 网络互连层(网络层):在这个包中,本层的主要任务是把TCP层传下来的数据加上目标地址和源地址。有了目标地址,数据才可能送达接收方;而有了源地址,接收方才知道发送方是谁。

• 网络接口层(数据链路层):从中可以看到相邻两个设备的MAC地址,因此该网络包才能以接力的方式送达目标地址。

理解了分层的基本概念,我们再来看看复杂一点的情况。如果这个写操作比较大, 变成8192字节,TCP层又该如何处理?是否也是简单地加上TCP头就交给网络互连层(网络层)呢?答案是否定的。因为网络对包的大小是有限制的,其最大值称为MTU,即“最大传输单元”。大多数网络的MTU是1500字节,但也有些网络启用了巨帧(Jumbo Frame),能达到9000字节。一个8192字节的包进入巨帧网络不会有问题,但到了1500字节的网络中就会被丢弃或者切分。被丢弃意味着传输彻底失败,因为重传的包还会再一次被丢弃。而被切分则意味着传输效率降低。由于这个原因,TCP不想简单地把8192 字节的数据一口气传给网络互连层,而是根据双方的MTU决定每次传多少。知道自己的MTU容易,但对方的MTU如何获得呢?如图5所示,在TCP连接建立(三次握手)时,双方都会把自己的MSS(Maximum Segment Size)告诉对方。MSS加上TCP头和IP头的长度,就得到MTU了。

 

3.为什么要用三个包来建立连接呢,用两个不可以吗?其实也是可以的,但两个不够可靠。我们可以设想一个情况来说明这个问题:某个网络有多条路径,客户端请求建立连接的第一个包跑到一条延迟严重的路径上了,所以迟迟没有到达服务器。因此,客户端只能当作这个请求丢失了,不得不再请求一次。由于第二个请求走了正确的路径,所以很快完成工作并关闭了连接。对于客户端来说,事情似乎已经结束了。没想

到它的第一个请求经过跋山涉水,还是到达了服务器。如图10所示,服务器并不知道这是一个旧的无效请求,所以按照惯例回复了。假如TCP只要求两次握手,服务器上就这样建立了一个无效的连接。而在三次握手的机制下,客户端收到服务器的回复时,知道这个连接不是它想要的,所以就发一个拒绝包。服务器收到这个包后,也放弃这个连接。

 

4.发送方的发送窗口是受接收方的接收窗口和网络影响的。发送窗口决定了一口气能发多少字节,而MSS决定了这些字节要分多少个包发完。举个例子,在发送窗口为16000字节的情况下,如果MSS是1000字节,那就需要发送16000/1000=16个包;而如果MSS等于8000,那要发送的包数就是16000/8000=2了。

 

5.网络之所以能限制发送窗口,是因为它一口气收到太多数据时就会拥塞。拥塞的结果是丢包,这是发送方最忌惮的。能导致网络拥塞的数据量称为拥塞点,发送方当然希望把发送窗口控制在拥塞点以下,这样就能避免拥塞了。无论是慢启动还是拥塞避免阶段,拥塞窗口都在逐渐增大,理论上一定时间之后总会碰到拥塞点的。从发出原始包到重传该包的这段时间称为RTO。重传之后的拥塞窗口是否需要调整呢?非常有必要,为了不给刚发生拥塞的网络雪上加霜,RFC建议把拥塞窗口降到1个MSS,然后再次进入慢启动过程。这一次从慢启动过渡到拥塞避免的临界窗口值就有参考依据了。RFC 5681则认为应该是发生拥塞时没被确认的数据量的1/2,但不能小于2个MSS。比如说发了19个包出去,但只有前3个包收到确认,那么临界窗口值就被定为后16个包携带的数据量的1/2。不难想象,超时重传对传输性能有严重影响。原因之一是在RTO阶段不能传数据,相当于浪费了一段时间;原因之二是拥塞窗口的急剧减

小,相当于接下来传得慢多了。

 

6.有时候拥塞很轻微,只有少量的包丢失。还有些偶然因素,比如校验码不对的时候,会导致单个丢包。这两种丢包症状和严重拥塞时不一样,因为后续有包能正常到达。当后续的包到达接收方时,接收方会发现其Seq号比期望的大,所以它每收到一个包就Ack一次期望的Seq号,以此提醒发送方重传。当发送方收到3个或以上重复确认(Dup Ack)时,就意识到相应的包已经丢了,从而立即重传它。这个过程称为快速重传。之所以称为快速,是因为它不像超时重传一样需要等待一段时间。为什么要规定凑满3个呢?这是因为网络包有时会乱序,乱序的包一样会触发重复的Ack,但是为了乱序而重传没有必要。由于一般乱序的距离不会相差太大,比如2号包也许会跑到4号包后面,但不太可能跑到6号包后面,所以限定成3个或以上可以在很大程度上避免因乱序而触发快速重传

 

7.NewReno在丢包量很大的时候,就需要花费多个RTT(往返时间)来重传所有丢失的包。接收方在Ack 2号包的时候,顺便把收到的包号告诉发送方。因此发送方对丢包细节了如指掌,在快速重传了2号包之后,它可以接着传3号,然后再传9号包。这个非常直观的方案称为SACK

 

8.• 没有拥塞时,发送窗口越大,性能越好。所以在带宽没有限制的条件下,应该尽量增大接收窗口,比如启用Scale Option(Windows上可参考KB 224829)。

• 如果经常发生拥塞,那限制发送窗口反而能提高性能,因为即便万分之一的重传对性能的影响都很大。在很多操作系统上可以通过限制接收窗口的方法来减小发送窗口,Windows上同样可以参考KB 224829。

• 超时重传对性能影响最大,因为它有一段时间(RTO)没有传输任何数据,而且拥塞窗口会被设成1个MSS,所以要尽量避免超时重传。

• 快速重传对性能影响小一些,因为它没有等待时间,而且拥塞窗口减小的幅度没那么大。

• SACK和NewReno有利于提高重传效率,提高传输性能。

• 丢包对极小文件的影响比大文件严重。因为读写一个小文件需要的包数很少,所以丢包时往往凑不满3个Dup Ack,只能等待超时重传了。而大文件有较大可能触发快速重传。

 

9.延迟确认策略的原理是:如果收到一个包之后暂时没什么数据要发给对方,那就延迟一段时间(在Windows上默认为200毫秒)再确认。假如在这段时间里恰好有数据要发送,那确认信息和数据就可以在一个包里发出去了。延迟确认并没有直接提高性能,它只是减少了部分确认包,减轻了网络负担。有时候延迟确认反而会影响性能。Nagle算法的原理是:在发出去的数据还没有被确认之前,假如又有小数据生成,那就把小数据收集起来,凑满一个MSS或者等收到确认后再发送。和延迟确认一样,Nagle也没有直接提高性能,启用它的作用只是提高传输效率,减轻网络负担。在某些场合,比如和延迟确认一起使用时甚至会降低性能。

 

10.ddos分布式拒绝服务攻击最流行的就是基于三次握手的syn flood,其原理是从大量主机发送syn请求给服务器,假装要建立tcp链接,这些syn请求可能含有假的原地址,所以服务器响应后永远收不到ack,救护留下half-open状态的tcp链接,由于每个tcp链接都会消耗一定的系统资源,如果攻击足够猛烈,此类链接越来越多,服务器的资源就会被耗光,真正的用户访问也会被拒绝,可以识别后reset握手请求

 

标签:发送窗口,重传,读书笔记,MSS,网络,TCP,拥塞
来源: https://blog.csdn.net/ph3636/article/details/100060269