确认应答机制
- 确认与重传接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传
- 每次接受端收到数据后会返回ACK,ACK中带有对应的确认序号告诉发送端从哪开始
- 所有的数据都有序列号,TCP在发送数据时不是按顺序发送的,接收方接收后按序号排序,如果中间某个数据报丢失了,之后的数据报还是会被接收,但是不会对发送端返回之后的确认,而是会重复发送对丢失出之前的数据确认,让发送端重发丢失的数据段。
超时重传、数据校验
- 接收方的ACK丢失,发送方在特定的时间间隔内没有收到接收方发来的确认影带会进行重发,这是接收方会利用
数据合理分片和排序
- UDP:IP数据报大于1500字节,大于MTU.这个时候发送方IP层就需要分片(fragmentation).把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报.将导致丢弃整个UDP数据报.
- tcp会按MTU合理分片,接收方会缓存未按序到达的数据,重新排序后再交给应用层。
流量控制
- 滑动窗口:
- 窗口大小是指无需等待确认应答而可以继续发送数据的最大值
- 在发送数据时并不是一次发送窗口的大小,而是将其分段,当第一段的数据收到一个ACK应答时,窗口就会向后滑动,继续发送下一段数据。
- 操作系统维护了一个缓冲区,发送端有发送端缓冲区用来记录哪些数据发送未应答,只有收到ACK后才会在缓冲区删除。
- 接受端有接收端缓冲区,接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,导致接收端的缓冲区满,而发送方继续发送,就会造成丢包,继而引起丢包重传等一系列连锁反应。
- TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制叫做流量控制。
- 在TCP报文段首部中有一个16位窗口长度,当接收端接收到发送方的数据后,在应答报文ACK中就将自身缓冲区的剩余大小,放入16窗口大小中。
- 这个大小随数据传输情况而变,窗口越大,网络吞吐量越高,而一旦接收方发现自身的缓冲区快满了,就将窗口设置为更小的值通知发送方。
- 如果缓冲区满,就将窗口置为0,发送方收到后就不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。
拥塞控制
- 慢开始
- 开始先发送少量数据,试探当前网络状态,再决定以多大的速度发送数据。慢开始的发送速度成指数型增长,但不能一直增长。
- 拥塞窗口
- 代表传输速度的状态
- 设置一个拥塞窗口的阈值,当拥塞窗口大小超过阈值时(tcp开始启动时阈值等于拥塞窗口的最大值),不能再按照指数来增长,而是线性的增长。每次超时重发时,慢启动的阈值就会变成原来的一半,同时拥塞窗口变成1
- 快重传
- 当1001~2000这段报文段丢失后,接收端就会以只收到1001的ACK,它告诉发送端,我收到了1~1000的数据报,我想要1001,但是后面的报文段(2001-7000)它也会接收,却仍然发送丢失之前的应答(下一个1001发送)
- 直到发送方连续三次收到同样一个“1001”这样的应答,就会将对应的数据“1001~2000”重新发送
- 接收端收到1001~2000之后,就会直接返回ACK=7000(因为2001~7000接收端之前都收到过了,都放在了之前提到的接收缓冲区中),这就是快重传
- 快恢复
- 当发送端连续收到三个重复确认,就执行“乘法减小”算法,把慢开始阈值减半。
- 与慢开始不同之处是现在不执行慢开始算法,而是直接将拥塞窗口的值设置为慢开始阈值ssthresh减半后的数值,然后直接进行拥塞避免,使拥塞窗口缓慢地线性增大