what:什么是TCP的可靠传输?
作为一个面向连接的传输层协议,TCP的目标是为用户提供可靠的端到端连接,保证信息有序无误的传输。它除了提供基本的数据传输功能外,还为保证可靠性采用了数据编号、校验和计算、数据确认等一系列措施。它对传送的每个数据字节都进行编号,接收方在接收到数据后检查校验和并请求接收方回传确认信息(ACK)。发送方如果在规定的时间内没有收到数据确认,就重传该数据。
why:为什么会出现不可靠的现象?
(1)保护消息边界,就是指传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息。也就是说存在保护消息边界,接收端一次只能接收发送端发出的一个数据包。而面向流则是指无保护消息保护边界的,如果发送端连续发送数据,接收端有可能在一次接收动作中,会接收两个或者更多的数据包。
由Nagle算法造成的发送端的粘包:Nagle算法是一种改善网络传输效率的算法.简单的说,当我们提交一段数据给TCP发送时,TCP并不立刻发送此段数据,而是等待一小段时间,看看在等待期间是否还有要发送的数据,若有则会一次把这两段数据发送出去.这是对Nagle算法一个简单的解释。
(2)接收端接收不及时造成的接收端粘包:TCP会把接收到的数据存在自己的缓冲区中,然后通知应用层取数据.当应用层由于某些原因不能及时的把TCP的数据取出来,就会造成TCP缓冲区中存放了几段数据.
如下图粘包的产生(传输过程中的三种情况):
(3)发送方发送数据过快,接收方未来得及接收,造成接收缓冲区溢出,从而造成分组丢失。流量控制也会出现死锁现象
(4)网络拥挤
How:如何保证TCP的可靠传输?
(1)解决粘包问题。
1、使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容(可联想到封包和拆包问题)。
2、设置定长消息,服务端每次读取既定长度的内容作为一条完整消息,当消息不够长时,空位补上固定字符。
3、 设置消息边界,服务端从网络流中按消息编辑分离出消息内容,一般使用‘\n’。
(2)数据编号、校验和计算、数据确认
(3)流量控制以及解决死锁。
(4)拥塞控制(慢启动、拥塞避免、快重传/快恢复)