粘包
-
TCP粘包
- 在TCP的协议头中,没有如同UDP一样的报文长度这样的字段,但是有一个序号这样的字段
- 但是在应用层,看到的只是一串字节数据,就不知道从那一段到那一段是一个完整的数据包
-
解决
- 对于定长的包,保证每次都按照固定大小读取即可
- 对于变长的包,可以在包头的位置,约定一个包总长度的字段,从而就知道包尾位置
- 还可以使用明确的分隔符间隔
-
UDP不存在粘包
- 对于UDP,如果还没有上层交付数据,UDP的报文长度仍然在,同时,UDP是一个一个把数据交付给应用层,就有很明确的数据边界
- 对于应用层,使用UDP时,要么收到完整的UDP报文,要么不收。
可靠性
-
TCP的可靠性
- 校验和
- 序列号(按序到达)
- 确认应答
- 超时重发
- 连接管理
- 流量控制
- 拥塞控制
-
UDP不可靠
- 不保证消息交付:不确认,不重传,无超时
- 不保证交付顺序:不设置包序号,不会发送队首阻塞
- 不跟踪连接状态:不必建立连接或重启状态机
- 不需要拥塞控制:不内置客户单或网络反馈机制
性能
-
TCP提高性能
-
滑动窗口
-
快速重传
-
延迟应答
-
捎带应答
-
-
UDP本身性能就高
- 传输速度快,简单
UDP实现可靠传输
在应用层加入:
- 确认应答机制
- 超时重传
- 引入序号,保证发送顺序