粘包/拆包问题一直都存在,只是到TCP就拆不动了。

  • 1c395805a77984b367ec3d5107ceca44.gif

  • • OSI open-system-Interconnection

  • • TCP/IP 5层协议栈

    • • 应用层和操作系统的边界是 系统调用 ,对应到网络编程是socket api

  • • TCP/UDP 概况

  • • TCP粘包问题

  • • 结合TCP/IP报头再回顾,柳暗花明

OSI开放系统互联

定义了网络框架,以层为单位实现协议,同时控制权逐层传递。

ec0130f2e3158a62826b950193cf930d.gif

OSI实际并没有落地,TCP/IP5层协议栈是目前主流的落地实现。

TCP/IP 5层协议栈

TCP/IP协议栈不止是传输层tcp/网络层ip, 还包括应用层等,这是一个协议簇,只是因为TCP/IP很具代表性。

不管是OSI还是TCP/IP5层协议栈,均会出现应用程序和操作系统边界(代码执行在用户态/内核态)。

04d41286b78d7a9c2c5809ba2b4e3c80.png

边界调用被称为系统调用system call, socket api便是TCP/IP协议栈中应用层的网络编程接口。

TCP/UDP概览
  • • TCP: Transmission Control Protocol面向连接的,可靠的,基于字节、双向流式传输层协议。

  • • UDP: USer Datagram Protocol面向消息的传输服务,传输的数据是有边界的。

  • 区别:

TCP可靠性是tcp三次握手的基础,在此之上,增加了seq、ack数据确认机制、 拥塞控制, 其中ack= seq+len(data)。

UDP:想法就发,不用三次握手建连,无粘包问题。

我们目前常见的应用场景底层都是tcp,比如http请求、sql数据库请求。

建立TCP连接之后,才能做http请求、sql请求,tcp连接很耗时,故服务器都存在连接池化机制。

这里我要给自己强调的是:开发者对于tcp一定不要带入http请求-响应模型,tcp是双向通信流。

TCP粘包/拆包

粘包拆包问题在数据链路层、网络层以及传输层都有可能发生。

数据链路层,网络层的粘包和拆包问题都由协议自行处理了(注意看tcp、ip报头中的长度),日常应用开发都在对接传输层,故面临的是TCP粘包。

d129268677d8599762f14808cb99089e.png

TCP粘包并不是TCP协议造成的问题,因为tcp协议本就规定流式传输(算法决定:利用缓冲区,有拥塞控制,大小包合并),它不含消息、数据包等概念,需要应用层自己设计消息边界。

5b8899507254422c0dd9bb518a10ac2b.png

HTTP 超文本传输协议的规定如下:

cf86f9be8416a38e5af15784c423822b.png

附:TCP报头、IP报头

tcp报头结构:[源端口、目标端口、SEQ/ACK在这定义]

006fbec7b406d70f85d4fe29831fbf0f.png

ip报头结构:[源ip、目标ip在这定义]

186d4bb2618224515f47bf0fbdba0c22.png
旁白

结合TCP报头/IP报头, 我们知道粘包、拆包一直都存在(TCP/IP报头附录里利用数据长度/偏移量,协助封包、拆包)。

只是协议栈一层层帮我们拆到TCP层的时候,如果没有特殊机制,我们是没有办法区分应用层断续发送的请求/调用。 故同理应对TCP粘包问题,上次应用层需要使用特殊分隔符或者长度来协助封包/拆包。

点“aff8f2ba00dfb1172459a58605ff678d.gif戳“在看b5db0e3863e7cf9046c9ee015fb7042b.gif

体现态度很有必要!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有态度的马甲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值