网络——TCP核心机制
对于TCP来讲,最核心的两个机制就是可靠传输,尽量提高传输效率。
对于可靠传输来讲,TCP采取三种机制保证传输的可靠性。
1、确认应答机制
确认应答ACK机制,每个ACK应答都带有对应的确认序列号,告知发送者,我已经接收了哪些数据,下次该从哪里继续发。
2、超时重传机制
若接收方没有返回确认应答ACK报文,则发送方隔一段时间后,再次传输同样的数据,降低丢包的可能性。
3、连接管理机制
先试探对方是否适合与我进行通信,三次握手,四次挥手。
除了要保证可靠性外,TCP还采取下面几种机制提高传输效率
4、滑动窗口机制
由于确认应答机制对于每一个发送的数据段都会返回一个ACK报文,在收到ACK后才会继续发送下一个数据段,若数据的往返时间较长,则这样做效率就会很低,性能很差。
TCP采取滑动窗口机制,设置一个窗口大小,在该窗口中的数据无需等待确认应答就可继续发送数据。每当收到某数据报的ACK应答后,窗口就会向后滑动。操作系统开启缓冲区用以保存还没有确认应答的数据,若收到确认应答后,则会从缓冲区中删掉。
在滑动窗口机制中就不是使用超时重传机制了,而是使用快速重传机制,若发生数据报丢包情况,接收端反复给发送端主机发送相同的序列号,若发送端主机连续三次收到相同的序列号,说明该序列号所对应的数据报应该得重新发送。比如,一个滑动窗口中的数据从1000传到7000,而1000-2000序列号的数据报丢失,但其他数据发送接收正常,发送端会反复收到3次相同的确认应答1001,会对1001-2000这段数据进行重传,因此当接收端成功接收1000-2000的数据报后,直接返回序列号7001。其他正常接收的数据都被放在操作系统的接收缓冲区了。
在理解流量控制和拥塞控制前首先要知道实际上的数据传输是:发送方->接收方缓冲区->接收方,类似于一个生产消费者模型。
4.1.流量控制机制
由于接收方缓冲区大小存在界限,一旦发送端发送数据太快,会导致接收端缓冲区溢满,若继续发送数据,缓冲区将不再接收数据,此时就会导致数据溢出,因此需要采用流量控制决定发送端的发送速度。
流量控制:接收端将接收端缓冲区的大小赋值为TCP首部中的“窗口大小”字段,并通过确认应答ACK报文返回给发送端,发送端会根据这个窗口大小的数值来调整自己的发送速度。窗口越大,发送速度越快,若接收端缓冲区已满,则将窗口大小设置为0,此时发送端就不会发送数据,而是定期发送一个窗口探测数据段获取接收端当前的窗口大小。
4.1.1.延迟应答
若接收端收到数据后立即返回ACK应答,此时返回的窗口大小可能比较小,假设接收端处理数据的速度比较快,短时间内就可以处理大量数据。此时若直接返回,就会浪费大量的缓冲区,而如果采用延迟应答,等待一会再响应,则会放大窗口大小,使网络吞吐量越大,效率越高。(eg:缓冲区设置为1M,一次收到500K,直接返回窗口大小就是500K,若接收端2ms就能处理300K,则过2ms后,就能返回窗口大小为800K了)
4.1.2.捎带应答
由于存在延迟应答,TCP发送确认应答的同时也发送其他数据。减少收发数据的次数,提高网络利用率。
4.2.拥塞控制机制
由于不清楚当前网络状态,因此不能直接发送大量的数据,若在网络拥堵的状态下发送大量数据可能会导致网络瘫痪。
拥塞控制:采用慢启动机制,先发少量的数据探测此时的网络拥堵状态,再决定按照多大的速度传输数据。发送开始时将拥塞窗口设置为1,每收到一个ACK应答,拥塞窗口+1。这样的增长是指数式增长,当然也不会一直增长,当增长到一定值时,按照线性方式增长。当网络发送阻塞时(少量的丢包超时重传),吞吐量立即会下降。