- 浏览: 724085 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1044)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (64)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
最新评论
http://bbs.csdn.net/topics/360240000
TCP是面向流的, 流, 要说明就像河水一样, 只要有水, 就会一直流向低处, 不会间断. TCP为了提高传输效率, 发送数据的时候, 并不是直接发送数据到网路, 而是先暂存到系统缓冲, 超过时间或者缓冲满了, 才把缓冲区的内容发送出去, 这样, 就可以有效提高发送效率. 所以会造成所谓的粘包, 即前一份Send的数据跟后一份Send的数据可能会暂存到缓冲当中, 然后一起发送.
UDP就不同了, 面向报文形式, 系统是不会缓冲的, 也不会做优化的, Send的时候, 就会直接Send到网络上, 对方收不收到也不管, 所以这块数据总是能够能一包一包的形式接收到, 而不会出现前一个包跟后一个包都写到缓冲然后一起Send.
但其实别想得太复杂的, TCP所谓的粘包处理, UDP所谓的丢包处理, 其实都是很简单的.
TCP只要保证自己写入的流是按 长度 + 内容 + 长度 + 内容 这样就可以非常简单的解决粘包问题, 切忌不要采用所谓的 开始标识 + 数据 + 结束标识 来分包, 适用性极低, 错误率极高, 除非数据都是固定有格式, 否则是不能采用这种方式的.
UDP传送当中, 只存在丢包的可能, 收到包的时候, 肯定这个包的内容就是正确的, 很少会有错误的, 因为UDP本身也会用CRC32进行验证, 还有长度验证, 验证不通过, 系统自动就会丢弃, 所以, 只需要去想象一种情况, 把一个苹果切了很多块, 然后要捡起这些块到另外一个容器, 由另外一个人进行重组, 而这捡的过程当中, 有可能切的人捡漏了某些块, 然后重组苹果的人就要求切的人重新把缺失的块捡回来.
TCP是面向流的, 流, 要说明就像河水一样, 只要有水, 就会一直流向低处, 不会间断. TCP为了提高传输效率, 发送数据的时候, 并不是直接发送数据到网路, 而是先暂存到系统缓冲, 超过时间或者缓冲满了, 才把缓冲区的内容发送出去, 这样, 就可以有效提高发送效率. 所以会造成所谓的粘包, 即前一份Send的数据跟后一份Send的数据可能会暂存到缓冲当中, 然后一起发送.
UDP就不同了, 面向报文形式, 系统是不会缓冲的, 也不会做优化的, Send的时候, 就会直接Send到网络上, 对方收不收到也不管, 所以这块数据总是能够能一包一包的形式接收到, 而不会出现前一个包跟后一个包都写到缓冲然后一起Send.
但其实别想得太复杂的, TCP所谓的粘包处理, UDP所谓的丢包处理, 其实都是很简单的.
TCP只要保证自己写入的流是按 长度 + 内容 + 长度 + 内容 这样就可以非常简单的解决粘包问题, 切忌不要采用所谓的 开始标识 + 数据 + 结束标识 来分包, 适用性极低, 错误率极高, 除非数据都是固定有格式, 否则是不能采用这种方式的.
UDP传送当中, 只存在丢包的可能, 收到包的时候, 肯定这个包的内容就是正确的, 很少会有错误的, 因为UDP本身也会用CRC32进行验证, 还有长度验证, 验证不通过, 系统自动就会丢弃, 所以, 只需要去想象一种情况, 把一个苹果切了很多块, 然后要捡起这些块到另外一个容器, 由另外一个人进行重组, 而这捡的过程当中, 有可能切的人捡漏了某些块, 然后重组苹果的人就要求切的人重新把缺失的块捡回来.
发表评论
-
滑动窗口与拥塞控制
2017-09-29 14:47 730滑动窗口:用作流量控制: 1.发送端和接收端各维护一个独立的发 ... -
rawsocket发送tcp包
2017-09-25 11:52 932testTcp.h #ifndef TESTTCP_H ... -
柔性数组
2017-09-20 09:53 448#include <iostream> #i ... -
rawsocket发送dns包
2017-09-14 15:18 569#include <stdio.h> #in ... -
rawsocket发送icmp包
2017-09-06 09:54 620#include <stdio.h> #in ... -
netfilter
2016-10-04 20:31 450http://blog.chinaunix.net/uid-2 ... -
gdb的简单使用
2016-09-19 15:18 388注意编译的时间加上-g参数 1.调试运行 gdb a.out ... -
TCP各状态的意义
2016-03-01 14:06 391各个状态的意义如下: LISTEN - 侦听来自远方TCP端 ... -
log
2015-03-30 17:42 415log.h #ifndef __LOG_H__ #def ... -
TIMEWAIT与CLOSEWAIT
2015-03-17 11:32 615http://blog.csdn.net/kobejayand ... -
TcpClient
2015-01-16 17:46 443TcpClient.h #ifndef TCPCLIENT ... -
信号量
2014-09-26 10:20 649#include <semaphore.h> ... -
共享内存
2014-09-17 10:39 542SharedMemory.h #ifndef SHARED ... -
记录锁
2014-09-11 16:32 405#include <errno.h> #in ... -
popen
2014-09-06 14:50 584#include <stdio.h> #in ... -
大小端存储
2014-09-05 09:29 569#include <stdio.h> i ... -
条件变量(cond)
2014-09-01 11:02 830#include <pthread.h> # ... -
读写锁
2014-09-01 10:33 670#include <pthread.h> # ... -
trylock
2014-09-01 10:07 641#include <pthread.h> # ... -
线程分离
2014-09-01 10:00 659http://www.cnblogs.com/mydomain ...
相关推荐
C#实现TCP与UDP助手类小案例,可以用于学习。。。。。
了解如何在NS2中建立TCP与UDP连接,把模拟过程输出到档案,最后借由工具分析将结果显示出来
TCP 与UDP 端口扫描
TCP与UDP区别(socket编程)
TCP与UDP多连接实例,供大一起共同参考学习。
ipv6的tcp与udp通信的demo,linux下的,分客户端与服务器
TCP与UDP的区别、用途、例子 希望可以帮助到你。
tcp与udp的区别
NULL 博文链接:https://javapub.iteye.com/blog/681138
提供TCP、UDP客户端服务端例程代码,tcp_client,tcp_server,udp_client,udp_server
Pocket PC 2003 (ARMV4)下的TCP与UDP的Demo,封装了UDP和TCP的操作,使用选择模式处理,提供了TCP下的客户端和服务器端,修改下就可以在wince上面使用了。
Microsoft Visual Studio 6.0实现TCP与UDP通讯
tcp与udp c语言代码实现 可正常使用。
详细讲解TCP和UDP
关于ORACLE在应用程序同时使用UDP与TCP 端口发现的问题的解决方案
TCP与UDP的区别.docxTCP与UDP的区别.docx
TCP与UDP的区别.pdfTCP与UDP的区别.pdf
TCP/UDP测试工具,建立服务器和客户端,便可实现模拟通信
TCP与UDP通信手机端.zip