再读网络架构与TCP粘包-笔记

361 阅读1分钟

5层网络架构

  • 应用层:http ftp
  • 运输层:tcp(面向字节流,面向连接) udp(无连接) 底层基于socket实现
  • 网络层:ip
  • 数据链路层:交换机 路由器
  • 物理层:网卡 网线

SOCKET

tcp中,由于是全双工传输,所以socket的实现对象有两个,而udp只有一个

TCP在运输层实现可靠传输的手段

  • 滑动窗口、拥塞控制:通过不断地尝试来动态适应接收方的窗口缓冲区大小,以尽力匹配为最大流量
  • 超时重传:发送方一段时间内未收到接收方回复的ack后,主动重传
  • 累积确认:累积到一定量的数据包之后,告诉发送方,在此数据包之前的数据全都收到了
  • 选择确认:每一个报文段需要两个边界(头尾)来进行确定
  • 连续ARQ:连续发送数据包,陆续连续确认

TCP粘包

  • 在学术中,并不存在真正的“粘包”的说法
  • 粘包指的是:TCP是面向字节流的协议,并不关心流的具体内容,所以可能存在一份数据流中前部分和后部分分属两个不同的应用的数据
  • 拆包:将前后部分的内容拆解开并分发给上层不同的应用
  • 市面上的应用层协议例如http、ftp等都有完整的方法处理好这类问题,除非是自己实现一套私有的应用层协议,才会碰到此类问题
  • 解决方法示例:通过在流中添加特殊的结束标志、末尾不足补0、在头部添加内容长度标识