c++ tcp分包_Socket分包,封包,粘包


一、简单了解TCP

    首先我们先来简单的认识一下TCP协议,只讲与本文有关的知识,具体的可以自己网络学习一下(有基础的可以直接看代码),TCP是一个面向连接可靠性的网络通信协议,面向连接就像打电话一样,必须拨通了才能进行通话,而TCP必须等客户端Connect之后才能进行发送数据和接收数据。可靠性是由于TCP具备三次握手才能建立连接,而且建立完成之后发送的数据是连续有序的。

二、为什么要分包?

    这里的分包我表示的是两层意思,第一层意思:比如我们定义每一次发送的数据大小为8k(因为在真正的项目编程中基本都是要进行封装的,所以发送的大小基本固定),那如果我们要发送一个25k的数据,我们是不是得分成8+8+8+1四个包发送,前三个包都是8k,最后一个包是小于8k;第二层意思:我记得在大一的计算机网络中讲过,TCP是以段(Segment)为单位发送数据的,建立TCP链接后,有一个最大消息长度(MSS).如果应用层数据包超过MSS,就会把应用层数据包拆分,分成两个段来发送.这个时候接收端的应用层就要拼接这两个TCP包,才能正确处理数据。相关的,路由器有一个MTU( 最大传输单元)一般是1500字节,除去IP头部20字节,留给TCP的就只有MTU-20字节。所以一般TCP的MSS为MTU-20=1460字节,当应用层数据超过1460字节时,TCP会分多个数据包来发送。

第二层意思(TCP会根据消息长度自动分包)的分包会有很几种情况。

情况一:分两次发送,第一次发送的数据包含第二个包的包信息。

2992c1437379ba7305e12eb49ece97e0.png

情况二:第一次发送和第二次发送正好是两个包的大小

f72252fef0fb5f06e9dbc61411bbc249.png

情况三:第一次发送的信息大小  第二个包的大小(包含第一个包一部分消息)

a8280c4c39a2d6358da9b8dc5c558570.png

三、为什么要进行粘包?

    这里的粘包也对应上面的两层分包意思,第一层粘包是把自定义分开发送的数据(8+8+8+1)重新粘在一起组成25k的原数据。第二层粘包是由于TCP数据段在发送的时候超过MSS,协议会自动的分包,所以也得把它粘起来组成一个完整的包。解析出我们正确想要的数据。


我狠话不多,反正上面噼里啪啦一大堆了,我们接下来开始实战了。

四、发送TCP数据包的格式(怎么分包)

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值