TCP的可靠性
-
复杂网络环境下的问题
-
乱序
-
冗余
-
丢包
-
干扰
-
-
解决方法
-
干扰:就是在数据包传送的过程中数据发生了改变,这里TCP引入了checksum去解决。
checksum类似于数字签名,对整个报文(头部+数据部分)进行计算;接收方在收到报文后也会计算checksum,如果发现结果不符合期望值,则直接丢包。
-
乱序和冗余:乱序就是接收方数据包的接收数据问题,冗余就是因为网络原因发送方发送了多个相同的数据包,TCP主要是给报文加上序号(seq)的方式解决。
因为加上序号之后,接收方就能对接收的报名进行排序和组合,就能知道自己缺失哪一段报文,同时也可以把多余的报文丢弃和通过seq和ack告诉发送方,我已经收到哪段报文和期待接收哪段报文。 因为有seq,发送方可以发送多个报文段,让接收方接收。
-
丢包:如何确认接收方收到信息,ACK 和 ack
接收方会发送确认号给发送方,而发送方也会存在超时重传机制,如果过了一定的时间后还没受到对于某段报文的确认号,则会重传该报文。 计时器:每个已发送但未确认数据包都会被放进队列里, 这个队列持有一个单独的计时器。当第一个数据包进入队列时,计时器启动了。如果计时器超时,队列头部的数据包会被重发,并且计时器重新计时。当收到ACK时,计时器也会重启。队列的所有数据都被确认了的话,就关闭定时器。
-
-
TCP的拥塞控制
-
什么是拥塞控制: 路由器的内存是有限的,若同一时间到达某个路由器的数据太多,这个路由器将无法接收所有的数据,只能将一部分丢弃;或者同一台路由器数据太多,后面到达的数据将要等待较长的时间才会被转发。网络中的数据太多,导致某个路由器处理不过来或处理地太慢,这就是网络拥塞。若是对于
TCP
这种有重传机制的传输协议,当发生数据丢失时,重传数据将延长数据到达的时间;同时,高频率的重传,也将导致网络的拥塞得不到缓解。拥塞控制,就是在网络中发生拥塞时,减少向网络中发送数据的速度,防止造成恶性循环;同时在网络空闲时,提高发送数据的速度,最大限度地利用网络资源。 -
拥塞控制的两种方法
-
端到端的拥塞控制:在这种拥塞控制方法中,由发送数据的端系统自己来判断是否拥塞,然后调整传输速率。比如说发送的数据已经超时却还没有接收到确认报文,数据往返时延过高,接收到对同一个数据段的重复确认......都可以认为是网络拥塞的现象;若发送端检测到这种现象,就应该降低发送数据的速率,若没有,则可以慢慢提高速率;
-
网络辅助的拥塞控制:由网络中的路由器来告诉发送方,网络的拥塞情况。一般有两种方式:(1)路由器直接向发送端发送报文,告知网络拥塞情况;(2)路由器更改数据段中的某个标志,来提示网络中的拥塞情况,然后数据将这个标志携带到目的主机,再由目的主机根据这个标志,向发送端发送报文,告知拥塞情况(被包含在确认报文中);
-
-
TCP的方法因为网络层不会提供拥塞的反馈信息,所以TCP协议采用的是第一种方式——自己判断网络的拥塞情况。当
TCP
检测到网络拥塞,则降低数据的发送速率,否则增加数据的发送速率。这里就将面临三个问题:-
TCP
如何限制数据的发送速率; -
TCP
如何检测网络中是否拥塞; -
TCP
采用什么算法来调整速率(什么时候调整,调整多少);首先来回答第一个问题。了解TCP的应该知道,TCP不是发送一个数据段,接收到确认后再发送另一个数据段,它采用的是流水线的方式。TCP的每一个数据段都有一个序号,而TCP维护一个发送窗口来发送是数据,这个窗口就是一个区间。所有序号位于这个窗口内的数据段都会被一次性发送,而不需要等待之前发送的数据段被确认。而每当最早发送出去的数据段被确认,窗口就会向前移动,直到移动到第一个没有被确认的序号,这时候又会有新的数据段序号被包含在窗口中,然后被发送出去。所以限制数据发送速率最好的方式就是限制窗口的大小。在发送方的TCP程序会跟踪和维护一个叫做拥塞窗口的变量,用来进行拥塞控制。拥塞窗口被称为cwnd。在TCP发送端,所有被发送但是还没收到确认的数据段必须落在这个窗口中,所有,当网络拥塞时,TCP程序将减小cwnd,而网络通畅时,增大cwnd,以此来控制数据发送的速率。 接着来回答第二个问题。TCP程序将通过数据发送的一些现象来推测网络是否拥塞,比如: 若发送一条数据段后,成功接收到了接收方的确认报文,则可以认为网络没有拥塞; 若发送出一条数据段后,在规定时间内没有收到确认报文(丢失或时延太大),则可以认为网络出现了拥塞; 若连续收到接收方对同一条报文的三次冗余确认(也就是四次确认),则可以推测那条报文丢失,即发生了拥塞; TCP无法保证数据能够按顺序到达接收端,所以,可能出现序号靠后的数据报反倒先到达的情况。而TCP接收方并不是接收到哪一条报文,就向发送方发送哪条报文的确认,它是通过发送当前应该接收到的序号最小的报文进行确认。 TCP如何调整发送速率——在没有丢包时慢慢提高拥塞窗口cwnd的大小,当发生丢包事件时,减少cwnd的大小。当然,具体的算法要复杂的多,TCP调整拥塞窗口的主要算法有 慢启动 , 拥塞避免 以及 快速恢复 ,其中前两个是TCP规范要求必须实现的,而第三个则是推荐实现的,TCP根据情况在这三者之间切换。
-
-
慢启动是建立
TCP
连接后,采用的第一个调整发送速率的算法(或叫模式)。在这个阶段,cwnd
通常被初始化为1MSS
,这个值比较小,在这个时候,网络一般还有足够的富余,而慢启动的目的就是尽快找到上限。在慢启动阶段,发送方每接收到一个确认报文,就会将cwnd
增加1MSS
的大小,于是:-
初始
cwnd=1MSS
,所以可以发送一个TCP
最大报文段,成功确认后,cwnd = 2MSS
; -
此时可以发送两个
TCP
最大报文段,成功接收后,cwnd = 4 MSS
; -
此时可以发送四个
TCP
最大报文段,成功接收后,cwnd = 8 MSS
......
-
-
拥塞避免:刚进入这个模式时,
cwnd
的大小近似的等于上次拥塞时的值的一半(这是由进入这个模式的条件决定的),也就是说当前的cwnd
很接近产生拥塞的值。所以,拥塞避免是一个速率缓慢且线性增长的过程,在这个模式下,每经历一个RTT
(请注意2.4
中有关RTT
的结论),cwnd
的大小增加1MSS
,也就是说,假设cwnd
包含10
个报文的大小,则每接收到一个确认报文,cwnd
增加1/10 MSS
。这个线性增长的过程什么时候结束,分为两种情况:-
第一种:在这个过程中,发生了超时,则表示网络拥塞,这时候,
ssthresh
被修改为cwnd / 2
,然后cwnd
被置为1MSS
,并进入慢启动阶段; -
第二种:若发送方接收到了某个报文的三次冗余确认(即触发了快速重传的条件),此时也认为发生了拥塞,则,
ssthresh
被修改为cwnd / 2
,然后cwnd
被置为ssthresh + 3MSS
,并进入快速恢复模式;
-
-
快速恢复:快速恢复和上面两种模式不太一样,这种模式在TCP规范中并没有强制要求实现,只是一种推荐实现的模式。在快速恢复阶段,每接收到一个冗余的确认报文,
cwnd
就增加1MSS
,其余不变,而当发生以下两种情况时,将退出快速恢复模式:-
第一种:在快速恢复过程中,计时器超时,这时候,
ssthresh
被修改为cwnd / 2
,然后cwnd
被置为1MSS
,并进入慢启动阶段; -
第二种:若发送方接收到一条新的确认报文(不是冗余确认),则
cwnd
被置为ssthresh
,然后进入到拥塞避免模式;
-
-
数字签名
-
是非对称加密技术与数字摘要技术的综合运用。
-
也就是将数据的摘要信息使用发送者的私钥进行加密;然后接收者使用公钥对密文解密,并与自己根据数据计算出的摘要信息进行比较,如果没有差别就说明数据没有发生改变。
-
作用:验证数据完整性、认证数据来源、抗否认
-
具体原理:
-
将报文按照双方约定的HASH算法放那得到报文摘要
-
将报文摘要用发送者的私人密钥进行加密,然后连同报文段和数字证书(包含公钥),一起发送给接受者(数字签名)
-
接收方收到后,用同样的HASH技术摘要,然后与用发送者的公钥进行解密的摘要信息作比较
-
同时通过证书颁发机构CA确认证书的有效性即可确认发送的真实身份
-
-
常用数字签名算法:RSA/DSA/ECDSA
- 建议了解一下上面这些数字签名算法的使用