“TCP是一种流模式的协议,UDP是一种数据报模式的协议”,
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的数据合并在了一起,这样的数据是没有意义的。

TCP流模式与UDP数据报模式相关推荐

  1. TCP的流模式与UDP的报文模式对比

    1       案例背景 在学习TCP-IP协议详解卷一时,读到介绍TCP协议的部分,发现TCP的首部是没有报文总长度字段的,而在UDP中是有的,对这个问题的思考引出了两者之间的区别. 2    案例 ...

  2. Linux socket 流模式(STREAM)跟数据报模式(DGRAM)的区别

    "TCP是一种流模式的协议,UDP是一种数据报模式的协议", 文章目录 1.TCP 2.UDP 3.为什么 1.TCP 打个比方比喻TCP,你家里有个蓄水池,你可以里面倒水,蓄水池 ...

  3. [TCP/IP] TCP流和UDP数据报之间的区别

    TCP流和UDP数据报之间的区别 1.TCP本身是面向连接的协议,S和C之间要使用TCP,必须先建立连接,数据就在该连接上流动,可以是双向的,没有边界.所以叫数据流 ,占系统资源多 2.UDP不是面向 ...

  4. 【网络编程】Socket套接字;UDP数据报套接字编程;TCP流套接字编程

    文章目录 1. 什么是网络编程 2. 网络编程中的基本概念 3. Socket套接字 4 UDP数据报套接字编程 4.1 客户端服务器交互流程 4.2 UDP版本的回显服务 4.3 英译汉服务 5. ...

  5. 分析udp数据报_开发需知!!!TCP和UDP的特点和区别

    对于学过计算机网络的人来说,不得不提到TCP和UDP相关的概念以及知识.本节,我们简单介绍下TCP和UDP的特点. 传输控制协议TCP(Transmission Control Protocol) T ...

  6. 网络编程 数据报是什么?TCP、UDP数据报结构

    数据报 数据报是通过网络传输的数据的基本单元,包含一个报头(header)和数据本身,其中报头描述了数据的目的地以及和其它数据之间的关系.数据报是完备的.独立的数据实体,该实体携带要从源计算机传递到目 ...

  7. 【Linux网络编程】TCP 和 UDP 数据报格式详解

    TCP 报文格式 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP 报文段的报头有 10 个必需的字段和 ...

  8. 网络基础3(IP段格式,UDP数据报格式,TCP数据报格式)

    IP段格式 IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍. 对于IPv4,4位版本字段是4.4位首部长度的数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节 ...

  9. 多多云手机【语音引流】创新吸粉模式 -- 语音播放功能模块开发教程

    多多云手机[语音引流]创新吸粉模式,接口完全免费开放给开发者,可用于第三方APP语音引流软件开发,互联网引流等等,例如微商语音吸粉.游戏语音推广.应用喊话推广,替代传统枯燥的文字引流方法,自动化的操作 ...

最新文章

  1. Mysql学习笔记【原创】
  2. python中读取文件内容-深入学习python解析并读取PDF文件内容的方法
  3. 关于微信 setData 回调函数中的坑
  4. nginx安装与配置详解
  5. String类型的认识以及编译器优化
  6. 构造函数模式知识的扩展
  7. 牛客网NOIP赛前集训营 第6场 T1 最长路
  8. string中内容的访问
  9. 七夕表白小代码喜欢的拿去
  10. dynamic结合匿名类型 匿名对象传参
  11. Android 多媒体开发学习之简单的音乐播放器
  12. NGUI组件参数总结
  13. 王者荣耀战区实时战力查询
  14. mysql存小程序获取到的带有表情的昵称_拉取用户信息,带表情的昵称,存储到数据库是???要怎么处理...
  15. 简单代理事件工具(百搜技术)
  16. [从头读历史] 第310节 星球战争 BC2399 至 BC2300(公元前24世纪)
  17. 共享汽车一种新型的交通方式
  18. ‘xxx‘ is assigned a value but never used.
  19. Ansible 部署的时候提示错误 SSH password instead
  20. iphone手机上卸载非主界面上的软件

热门文章

  1. 复杂高端木马USB窃贼出现
  2. 物联网VSWiFi 两强争霸还是携手并进?
  3. Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu
  4. VCS命令行选项总结简单脚本实例
  5. FPGA--------随笔总结(持续更新)
  6. php7 opcode,php7最小化安装 vld扩展安装并查看php代码的opcode ast测试
  7. PYTHON 处理JSON文件(新建key值Findex,并将歌手名字转换为大写首字母作为value值)
  8. oracle10g 安装手册 linux,oracle10g在x86linux上的安装步骤
  9. Java多线程Queue_Java多线程-BlockingQueue-ArrayBlockingQueue-LinkedBlockingQueue
  10. centOs8安装docker报错:错误:事务检查错误