TCP如何实现可靠传输

TCP的特点:面向字节流、面向连接、可靠传输
可靠传输的实现:
1.确认应答机制
:对收到的信息给发送方发送报文确认收到数据
2.超时重传机制:等待200ms没有收到接收方的确认应答则说明数据丢失,那么就要进行重新发送。
3.序号+确认号:告诉发送方自己接收到数据了,下次应该从哪里开始发。
4.序号+16位校验和:校验数据的正确性
但是TCP为了实现可靠传输做了一些不必要的牺牲,于是作为弥补,增加了一些机制:
1.滑动窗口,进行数据传送前进行协商,确定窗口大小,窗口大小的数据无需等待应答就只可以直接发送,每次进行固定大小数据的发送,发送到窗口最大值再进行确认回复,节省了每次发送数据确认回复。
2.快速重传机制:如果客户端收到服务器端发送来的三个冗余ack就说明数据包丢失(ack内容是服务器端收到数据的下一个序号,比如1000以后的数据丢了,就发送1001给客户端,并连续发送三次),客户端就可以立即将1001以后的数据发送给服务端。
冗余的ack还被用在拥塞控制中。
3.拥塞控制;以慢启动快增长的方式来调节窗口大小,防止网络出现问题,大量数据发送到缓冲区造成数据堆积的情况。少量丢包触发拥塞控制,大量丢包则认为是网络拥塞。
4.流量控制:通过控制协议字段中的窗口大小字段控制发送数据大小(发送数据的大小不能大于接收方缓冲区剩余的大小)
5.延迟应答机制,不是立即回复;如果接收方的主机在收到数据后立即回复,那么窗口就会变得很小,影响发送效率。一般是每隔两个数据包回复一次,超过最大延迟时间就停止一次。
6.捎带应答机制,每次确认回复发送一个数据包有点浪费,可以将确认回复和数据一起捎带着发送。

面向字节流:数据不会直接发送,而是放在一个缓冲区,操作系统选择一个合适的时机将数据以二进制数据串发送出去;接收方也可以选择一次性接收整条数据也可以选择一次接收一点点,多次接收。
但是会引起粘包问题:数据不是直接接收,而是放在缓冲区,那么接收方读取数据的时候就可能会把两条数据当做一条数据接收。
发生粘包问题主要是因为TCP在传输层,对数据的格式没有明确的划分。
解决方案:1、给数据定长,以规定大小发送和接收;变长数据,在应用层协议声明中声明数据长度
2、以特殊字符作为分隔符,但是发送和接收时要进行编码和解码。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值