《计算机网络自顶向下方法》
第三章笔记
这是一本好书,这个文档只是对其中的概念总结下。
UDP
UDP 是无链接的,它得到数据,加上8字节UDP头,转发。为什么还有那么多应用(DNS, SNMP)选择UDP而不是TCP?
答案是协议没有好坏,选择一个最适合的最重要,对于DNS, SNMP,可靠性不是最重要的。
许多应用选择UDP的原因有以下几点:
一:应用层能够更好的控制要发送的数据和发送时间。
因为UDP是无连接的,相对于TCP的有连接,并且有拥塞控制机制而言。 当网络变的很拥塞时,TCP会想办法让数据到达,这通常会采用
缩小发送窗口(发送数据多少)重传(发送时间)来保证数据到达。 UDP相对的更好控制发送数据大小和时间。
二:无需连接
TCP 三次握手是需要时间的,而UDP省去了连接建立的时延。DNS就利用了这一点。
三:无连接状态
TCP 要维护序列号,确认好,窗口大小,接收和发送缓存等,肯定需要资源。而UDP不需要这些,所以对有些服务器,UDP能够连接等多的客服端。
四:头部开销小。
UDP 8 字节 TCP 20字节 。
在说TCP之前先说说可靠数据传输
四:具有比特差错信道上的可靠数据传输
接收方需要具有三个功能
1:差错检测
通过校验和检测出错误发生了,但是不只哪儿错了。
2:接收方反馈
3:发送方重传。
现在考虑下如果发送方接收到接收方发送的受损的ACK或者NACK,这个时候需要重新发送,如果接收方已经接收到了,又需要接收,产生了冗余数据。为了解决这个问题,引入了序列号。
五:具有比特差错的丢包信道上的可靠数据传输。
怎么检测丢包以及丢包后应该做些什么事情?
引入了倒计时定时器,在一个给定的时间过期后,可中断发送方,重传等。
现在总结下数据传输协议的要点:校验和,序列号定时器, 肯定确认以及否定确认。通过这些技术,可保证有效的可靠数据传输。
校验和:检测到传输分组中的比特错误,但是不能够校正
定时器:用于检测超时/重传一个分组。因为分组丢失等原因。重传可能会引起冗余的数据。
序号: 序号之间的空隙可以检测出丢失的分组,具有相同的需要可以检测出是冗余的分组
确认: 确认可以认为是逐个的或者是累加的,取决于协议
否认确认:通常携带这未被正确接收的分组号
发送窗口,流水线:发送方被限制仅发送一定范围内的分组,一次多发送几个分组,可以增加利用率,发送窗口长度可根据接收方接收和缓存能力或者网络中的拥塞程度来决定它的大小.
TCP的实现基本上就是用的这些技术,只是要复杂许多.
TCP 具体实现
主要补充TCP比较特殊的实现
快速重传:一定接收方接收到3个冗余(一样)的ACK,它就认为该ACK序列号之后的数据已经丢失了,这样,这定时器到之前提前重传,避免以后的数据产生更多的冗余ACK.
流量控制:流量控制是一个发送方的发送速率和接收方的接收速率匹配服务.用于消除接收方缓存溢出,流量控制和拥塞控制很相似(都是对发送方的控制) . TCP让发送方维护一个接收窗口的变量来提供流量控制,该变量告诉发送方,接收方还有多少缓存来接收数据.因为TCP是全双工的,所以接收方同样也有一个窗口.
TCP 的三步握手就不讲了,参考<UNIX网络编程><TCP/ip详解>
拥塞控制原理:
怎么发现网络拥塞了?怎么解决??
丢包是网络拥塞的一个征兆,丢包之后的重传却不是一个解决方法。
TCP拥塞控制
因为IP层不向端系统提供显示的网络拥塞反馈。所以TCP使用端到端拥塞控制。
TCP 使用的是让发送方根据所感知到的网络拥塞程度,来限制其发送的速率。
A)TCP是怎么限制其发送的速度的?
B)TCP是怎么感知到拥塞的?
C)TCP是什么算法来改变发送速率的?
解决办法
A)每一端(假设发送端)都拥有拥塞窗口和流量窗口。 拥塞窗口表示能够发送的速率(用于拥塞控制),流量窗口用于表示接受端能够接受的速率(流量控制)
B)TCP“丢包事件“:丢包,或者接收到三个冗余的ACK,发送方就认为网络出现了拥塞。
C)TCP拥塞控制算法
1) 加性增(如果没有检测到拥塞,有可能链路没有利用完,所以缓慢的增加,乘性减(如果检测到丢包,则拥塞窗口值减半)
2) 慢启动(最开始,拥塞窗口(congwin)值为1, 2,4, 8, 16,这样指数增加,当有拥塞检测到时,减半,线性增加,方法1
3) 对超时事件作出反应
Tcp维持一个值(A = 10),当拥塞发生时,该值为拥塞窗口(B = 20)的一半,这时发送方进入慢启动,指数增加,然后直到拥塞窗口的值为小于这个值(10)的最大值,之后进入了一个阶段叫拥塞避免阶段,这个阶段拥塞窗口线性增加。