一、TCP提高性能的四种机制
1、滑动窗口
TCP的滑动窗口都是以字节为单位的。凡是已发送过的数据,在未收到确认之前,都必须暂时保留,以便在超时重传时使用。发送窗口里面的序号表示允许发送的序号,发送窗口后面的部分表示已经发送并且已经得到确认。
假若发送一个报文段,确认的时间到了还未收到ACK,这时就会触发重传机制,经过了一段时间收到了确认报文,如何判断此报文是对先发送报文的确认还是对后发送报文的确认? 若收到的确认是对重传报文的确认,却被主机当成是对原报文段的确认,这样计算出来的RTT和超时重传时间RTO就会偏大,若后面发送的数据又是经过超时重传才收到确认报文段,按此方法的到的超时重传时间就会越长。 若收到的确认是对原来报文的确认,却被主机当成是对重传文段的确认,这样计算出来的RTT和超时重传时间RTO就会偏小,这样会导致报文段过多的重传。
2、快速重传
3、延迟应答
如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小,可以等待适量的时间,使返回的窗口值增大。
4、捎带应答
客户端服务器在应用层也是一收一发的,客户端给服务器发送一个消息后,相应的服务器也会给客户端回一个消息,那么我们可以在服务器给客户端回消息时捎带回应ACK。
二、TCP当中的粘包问题(UDP不存在粘包问题)
1、首先粘包中的”包”指的是应用层的数据包,在TCP协议头中,没有像UDP一样的报文长度,只有一个序号一样的字段。从应用层的角度来看,应用层交付给传输层的数据都是一连串的字节数据,应用程序看到这一连串的字节数据,并不知道是从哪个部分到哪个部分是一个完整的应用数据包。而从传输层的角度来看,TCP是以报文形式传输过来的,按序号排好序,放在缓冲区中。
2、如何避免粘包问题?
- 在应用层将包分开,明确两个包的边界;
- 对于定常的包,保证每次都按固定大小读取即可;
- 对于变长的包,可以在报头的位置约定一个包总长度的字段,从而就知道了包的结束位置;
- 对于变长的包,还可以在包和包之间使用明确的分隔符(应用层协议是由程序员自己来确定的)。
三、TCP异常的情况(常见面试题)
1、进程终止:进程终止会释放文件描述符,仍然可以发送FIN,和正常关闭没什么区别;
2、机器重启:和进程终止的情况相同;
3、机器掉电/网线断开:接收端认为连接还在,一旦接收端有写入操作,接收端发现连接已经不在了,就会进行reset,即使没有写入操作,TCP自己也内置一个保活定时器,定期访问对方是否还在,如果对方不在,也会把连接释放;
四、如何用UDP实现可靠性传输?(面试题)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**