“TCP是一种流模式的协议,UDP是一种数据报模式的协议”,

文章目录

  • 1、TCP
  • 2、UDP
  • 3、为什么

1、TCP

打个比方比喻TCP,你家里有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通过龙头将水池里的水放出来,然后用各种各样的容器装(杯子、矿泉水瓶、锅碗瓢盆)接水。

上面的例子中,往水池里倒几次水和接几次水是没有必然联系的,也就是说你可以只倒一次水,然后分10次接完。另外,水池里的水接多少就会少多少;往里面倒多少水,就会增加多少水,但是不能超过水池的容量,多出的水会溢出。

结合TCP的概念,水池就好比接收缓存,向水池倒水就相当于发送数据,接水就相当于读取数据。好比你通过TCP连接给另一端发送数据,你只调用了一次write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。(假设数据都能到达)但是,你发送的数据量不能大于对方的接收缓存(流量控制),如果你硬是要发送过量数据,则对方的缓存满了就会把多出的数据丢弃。 这种情况若是设置非阻塞I/O模型,会把内存耗尽,因为socket是存在内核中的。

2、UDP

UDP和TCP不同,发送端调用了几次write,接收端必须用相同次数的read读完。UDP是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。也就说,如果不指定MSG_PEEK标志,每次读取操作将消耗一个报文。

3、为什么

其实,这种不同是由TCP和UDP的特性决定的。TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。

而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的。

参考文章:流模式和数据报模式的区别

Linux socket 流模式(STREAM)跟数据报模式(DGRAM)的区别相关推荐

  1. TCP流模式与UDP数据报模式

    "TCP是一种流模式的协议,UDP是一种数据报模式的协议", 1.TCP 打个比方比喻TCP,你家里有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通过龙头将水池里的水放出来, ...

  2. Linux网络编程 五种I/O 模式及select、epoll方法的理解

    近期一次面试机会让我觉得有很多地方理解可能不到位,翻翻谷歌的资料加深对一些技术的理解 五种I/O 模式: [1] 阻塞 I/O (Linux下的I/O操作默认是阻塞I/O,即open和socket创建 ...

  3. 流批一体计算引擎-3-[Flink]的本地模式Local和standalone模式

    flink-1.15.0在centos7上安装(Local模式安装) 目前开源大数据计算引擎有很多的选择,比如流处理有Storm.Samza.Flink.Spark等,批处理有Spark.Hive.P ...

  4. UDP socket 设置为的非阻塞模式

    UDP socket 设置为的非阻塞模式  Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), MSG_DONTWAIT, (struct s ...

  5. Linux邻居子系统的细节之confirm-Open××× server模式的MAC地址学习

    在<Linux实现的ARP缓存老化时间原理解析>一文中,我剖析了Linux协议栈IPv4的邻居子系统的转化,再次贴出那个状态机转化图,可是这个图更详细了些,因为它有一个外部输入,那就是co ...

  6. Linux网络编程 | 并发模式:半同步/半异步模式、领导者/追随者模式

    文章目录 同步与异步 半同步/半异步模式 变体:半同步/半反应堆模式 改进:更高效的半同步/半异步模式 领导者/追随者模式 组件 :句柄集.线程集.事件处理器 并发模式是指I/O处理单元和多个逻辑单元 ...

  7. socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现)

    socket的阻塞模式和非阻塞模式 无论是Windows还是Linux,默认创建socket都是阻塞模式的 在Linux中,可以再创建socket是直接将它设置为非阻塞模式 int socket (i ...

  8. socket的阻塞模式和非阻塞模式

    文章目录 socket的阻塞模式和非阻塞模式 如何将socket设置为非阻塞模式 send和recv函数在阻塞和非阻塞模式下的表现 非阻塞模式下send和recv函数的返回值总结 阻塞与非阻塞sock ...

  9. Linux之父盟友分道扬镳 直言开源模式软肋

    Linux之父盟友分道扬镳 直言开源模式软肋 2005-09-06 12:53:00 标签:linux职场开源休闲 从1993年起,Larry McVoy就一直是Linux之父Linus Torval ...

最新文章

  1. 《LoadRunner 没有告诉你的》之三——理发店模型
  2. group by的查询
  3. Simulink仿真教程1---一个简单的仿真例子
  4. 全球传媒巨头纷纷布局,VR影视内容的爆点可期
  5. java gui 按键 数组_java GUI分配数组值
  6. Java有快速打好基础的方法?
  7. Why React?
  8. Webservice 的安全
  9. linux创建文件夹操作步骤,linux如何用命令创建新建文件夹
  10. 通用技术和信息技术合格考知识点_小高考信息技术知识点(绪言)
  11. itextpdf解决PDF合并的问题
  12. java并发编程简单分析
  13. python爬微信公众号教程_python爬搜狗微信获取指定微信公众号的文章
  14. SQL 语法查询手册
  15. 真!AI低代码平台——瀚码编程小助手“叨叨“正式上线!
  16. unity开发 HTC vive手柄控制 手柄上各个按钮的点击事件
  17. 成人职业教育:知乎、B站、网易“短兵相接”
  18. python计算圆柱体积_python计算圆周长、面积、球体体积并画出圆
  19. Java基础:宾馆管理系统(一)
  20. 关于5G系统天线的原理

热门文章

  1. [Rails.Test.Prescriptions]系列之一:0基础的Test Rails...
  2. ASP.NETmvc常用JQUERY插件【jquery.dataTables.js】
  3. 正则表达式学习笔记(一)
  4. PS效果教程——冒充手绘效果
  5. acrobat xi pro 简体中文语言支持包_性能出众佳能PRO-561绘图仪西安优杰报价
  6. SAP运维和SAP实施有什么区别
  7. Oracle的存储过程和存储函数
  8. BU_DATE_CHAR abap screen 日期字段搜索帮助
  9. 修改ALSM_EXCEL_TO_INTERNAL_TABLE的限制
  10. ALEIDoc EDI(4)--change point02