【计算机网络】TCP提高性能的机制及沾包问题

一、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实现可靠性传输?(面试题)

可以参考TCP

  引入序列号,保证数据顺序;引入确认应答,保证对端收到了数据;引入超时重传,如果隔一段时间没有应答,就重新发送数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值