1 / 2
文档名称:

数据流和数据报.docx

格式:docx   大小:22KB   页数:2页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

数据流和数据报.docx

上传人:buhuixin1314 2018/10/23 文件大小:22 KB

下载得到文件列表

数据流和数据报.docx

相关文档

文档介绍

文档介绍:关于 TCP流模式与 UDP数据报文模式区别
分类: TCP/IP 2011-05-10 14:25 95 人阅读 评论 (1) 收藏 举报
“TCP 是一种流模式的协议, UDP 是一种数据报模式的协议 ”,这句话相信大家对这句话已
经耳熟能详 ~ 但是,“流模式 ”与 “数据包模式 ”在编程的时候有什么区别呢?以下是我的理解,
仅供参考!
1、 TCP
打个比方比喻 TCP ,你家里有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通
过龙头将水池里的水放出来, 然后用各种各样的容器装 (杯子、 矿泉水瓶、 锅碗瓢盆) 接水。
上面的例子中, 往水池里倒几次水和接几次水是没有必然联系的, 也就是说你可以只倒一次
水,然后分 10 次接完。另外,水池里的水接多少就会少多少;往里面倒多少水,就会增加
多少水,但是不能超过水池的容量,多出的水会溢出。
结合 TCP 的概念, 水池就好比接收缓存, 倒水就相当于发送数据, 接水就相当于读取数据。
好比你通过 TCP 连接给另一端发送数据,你只调用了一次 write ,发送了 100 个字节,但是
对方可以分 10 次收完,每次 10 个字节;你也可以调用 10 次 write ,每次 10 个字节,但是对方
可以一次就收完。 (假设数据都能到达) 但是, 你发送的数据量不能大于对方的接收缓存 (流
量控制),如果你硬是要发送过量数据,则对方的缓存满了就会把多出的数据丢弃。
这种情况是设置非阻塞 I/O 模型,会把内存耗尽,因为 socket 是存在内核中的。
2、 UDP
UDP 和 TCP 不同,发送端调用了几次 write ,接收端必须用相同次数的 read 读完。 UPD
是基于报文的, 在接收的时候, 每次最多只能读取一个报文, 报文和报文是不会合并的,如
果缓冲区小于报文长度,则多出的部分会被丢弃。也就说,如果不指定 MSG_PEEK 标志,
每次读取操作将消耗一个报文。
3、为什么
其实,这种不同是由 TCP 和 UDP 的特性决定的。 TCP 是面向连接的,也就是说,在连接
持续的过程中, socket 中收到的数据都是由同一台主机发出的 (劫持什么的不考虑) ,因此,
知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。
而 UDP 是无连接的协议,也就是说,只要知道接收端的 IP 和端口,且网络是可达的,任
何主机都可以向接收端发送数据。 这时候, 如果一次能读取超过一个报文的数据, 则会乱套。
比如,主机 A 向发送了报文 P1 ,主机 B 发送了报文 P2 ,如果能够读取超过一个报文的数
据,那么就会将 P1 和 P2 的数据合并在了一起,这样的数据是没有意义的。
帧( frame)是一种信息单位,它的起始点和目的点都是数据链路层。
数据包( packet)也是一种信息单位,它的起始和目的地是网络层。
数据报( datagram)通常是指起始点和目的地都使用无连接网络服务的的网络层的信息
单元。
段( segment)通常是指起始点和目的地都是传输层的信息单元。
消息( message)是指起始点和目的地都在网络层以上(经常在应用层)的信息单元。
元素( cell )是一种固定长度的信息,它的起始点