TCP

TCP

一、tcp粘包/拆包:
  1、服务端分两次读取到两个独立的数据包,分别是D1和D2,没有粘包和拆包。
  2、服务端一次接收到两个数据包,D1和D2粘合在一起,被称为TCP粘包。
  3、服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP拆包。
  4、服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1包的剩余内容D1_2和D2包的整包。
  如果此时服务端TCP接收滑窗非常小,而数据包D1和D2比较大,很有可能会发生第5种可能,即服务端分多次才能将D1和D2包接收完全,期间发生多次拆包。
二、MTU与MSS的区别:
  MTU是网络传输最大报文包,MSS是网络传输数据最大值。
  1、MSS加包头数据就等于MTU 简单说拿TCP包做例子。 报文传输1400字节的数据的话,那么MSS就是1400,再加上20字节IP包头,20字节tcp包头,那么MTU就是1400+20+20. 当然传输的时候其他的协议还要加些包头在前面,总之MTU就是总的最后发出去的报文大小。MSS就是你需要发出去的数据大小。(MSS <=MTU-40(IPv4)或MTU-60(IPv6))
  2、MSS: Maxitum Segment Size 最大分段大小,MSS最大传输大小的缩写,是TCP协议里面的一个概念,MSS就是TCP数据包每次能够传输的最大数据分段。
  3、为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。
三、粘包问题的解决策略:
  1、消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格;
  2、在包尾增加回车换行符进行分割,例如FTP协议;
  3、将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段,通常设计思路为消息头的第一个字段试用int32来 表示消息的总长度;
  4、更复杂的应用层协议。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值