当前位置: 首页 > news >正文

【2018-06-02】有关TCP和UDP粘包和消息保护边界

[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2018-06-02| 标题:有关TCP和UDP粘包和消息保护边界分类:编程 |标签:TCPUDP


TCP和UDP的分包问题

参考链接
《 http://www.cnblogs.com/lancidie/archive/2013/10/28/3392428.html》

在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的。因此TCP的socket编程,收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样接收端就难于分辨出来了,必须提供科学的拆包机制。 对于UDP,不会使用块的合并优化算法,这样,实际上目前认为,是由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了。
那么什么是保护消息边界和流呢?保护消息边界,就是指传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息.也就是说存在保护消息边界,接收端一次只能接收发送端发出的一个数据包. 而面向流则是指无保护消息保护边界的,如果发送端连续发送数据,接收端有可能在一次接收动作中,会接收两个或者更多的数据包.我们举个例子来说,例如,我们连续发送三个数据包,大小分别是2k, 4k , 8k,这三个数据包,都已经到达了接收端的网络堆栈中,如果使用UDP协议,不管我们使用多大的接收缓冲区去接收数据,我们必须有三次接收动作,才能够把所有的数据包接收完.而使用TCP协议,我们只要把接收的缓冲区大小设置在14k以上,我们就能够一次把所有的数据包接收下来.只需要有一次接收动作.这就是因为UDP协议的保护消息边界使得每一个消息都是独立的.而流传输,却把数据当作一串数据流,他不认为数据是一个一个的消息. 所以有很多人在使用tcp协议通讯的时候,并不清楚tcp是基于流的传输,当连续发送数据的时候,他们时常会认识tcp会丢包.其实不然, 因为当他们使用的缓冲区足够大时,他们有可能会一次接收到两个甚至更多的数据包,而很多人往往会忽视这一点,只解析检查了第一个数据包,而已经接收的其他数据包却被忽略了.所以大家如果要作这类的网络编程的时候,必须要注意这一点.
结论:根据以上所说,可以这样理解,TCP为了保证可靠传输,尽量减少额外开销(每次发包都要验证),因此采用了流式传输,面向流的传输, 相对于面向消息的传输,可以减少发送包的数量。从而减少了额外开销。但是,对于数据传输频繁的程序来讲,使用TCP可能会容易粘包。 当然,对接收端的程序来讲,如果机器负荷很重,也会在接收缓冲里粘包。这样,就需要接收端额外拆包,增加了工作量。因此,这个特别适合的是数据要求可靠传输,但是不需要太频繁传输的场合( 两次操作间隔100ms,具体是由TCP等待发送间隔决定的,取决于内核 中的socket的写法) 而UDP,由于面向的是消息传输,它把所有接收到的消息都挂接到缓冲 区的接受队列中,因此,它对于数据的提取分离就更加方便,但是, 它没有粘包机制,因此,当发送数据量较小的时候,就会发生数据包 有效载荷较小的情况,也会增加多次发送的系统发送开销(系统调用, 写硬件等)和接收开销。因此,应该最好设置一个比较合适的数据包 的包长,来进行UDP数据的发送。(UDP最大载荷为1472,因此最好能 每次传输接近这个数的数据量,这特别适合于视频,音频等大块数据 的发送,同时,通过减少握手来保证流媒体的实时性。

http://www.cnnetsun.cn/news/3488323.html

相关文章:

  • 思源宋体TTF完全指南:7种字重免费开源字体全方位应用
  • 漫画翻译工具:翻页即译技术原理与实战应用指南
  • 多机器人协作中的任务分配:从理论到实践
  • Windows热键侦探:三分钟定位快捷键冲突的神器
  • 掌握vJoy虚拟摇杆:从零构建专业级游戏控制解决方案
  • KVarN: Variance-Normalized KV-Cache Quantization Mitigates Error Accumulation in Reasoning Tasks
  • go refresh-token需要存表校验吗?
  • 如何在5分钟内搭建终极自托管游戏串流系统:Sunshine完全指南
  • C语言变量详解:定义、存储类型与最佳实践
  • 依托 AI 导出鸭提质增效,理顺豆包输出 word 文档转化全流程
  • 2023技术趋势:AI与云原生的融合与突破
  • 模板驱动型PDF生成工具的核心原理与工程实践
  • Unity 2022安卓打包报错全解析:从环境配置到插件冲突的实战解决方案
  • 司法调解在刑事案件中的应用:从冲突化解到关系修复
  • WarcraftHelper:让经典魔兽争霸3在现代系统上焕发新生的完整解决方案
  • WaveTools鸣潮工具箱完整指南:免费解锁120FPS高帧率与抽卡数据分析
  • Zotero PDF Translate终极指南:如何免费高效翻译学术文献
  • 16年老Mac mini改造指南:从硬件升级到Linux服务器实战
  • WarcraftHelper终极指南:魔兽争霸3现代系统兼容性完整解决方案
  • GPT-5.6、Grok 4.5与MiniMax M3:AI大模型技术对比与实战选型指南
  • PHP安全:file_exists函数与符号链接的攻防解析
  • 嵌入式面试核心题库:硬件、RTOS、通信协议与C/C++实战解析
  • ExplorerPatcher终极配置指南:让Windows 11完美回归经典体验的5个技巧
  • Notepad--:跨平台文本编辑器的三大核心优势解析
  • 如何高效配置syzkaller:15个实战内核模糊测试技巧
  • Claude写作全流程拆解(含Prompt工程+结构化润色+合规校验)——企业级内容团队内部培训手册首次公开
  • Windows Cleaner:告别C盘爆红!开源免费的系统清理神器深度评测
  • 鸣潮自动化工具:5分钟掌握智能战斗助手,轻松解放你的游戏时间
  • Vue冒号前缀语法与:is-logged属性详解
  • 【机密文档解封】某千亿级AI平台Agent优化白皮书节选(含RAG响应延迟压降68%实测数据)