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

1       案例背景

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

2    案例分析

TCP报文的格式:

 

TCP首部的格式:

 

UDP报文的格式:

 

UDP首部的格式:

 

针对首部公共部分的对比,很明显的一个区别是UDP首部是有数据报总长度字段的,而TCP首部是没有数据报总长度字段的,这个原因的解释在TCP-IP详解卷一答案中的解释是TCP首部有选项字段而UDP首部大小是固定的,而网上的查询结果有一种是因为模式的不同。

我比较赞同的是,TCP是面向连接的流模式,而UDP是不连接的数据报模式。

3       实验

实验一:

       TCP客户端循环发送数据到服务器,主循环部分分三次调用send或者sendto,分别发送111,222,333;而服务器是睡眠十秒,然后调用recv或者recvfrom接收数据。注意,只接收一次。

客户端发送部分(其中的sendto可用send代替):

    while(1)

       {

              memset(achBuf,0,1024);

              memcpy(achBuf,"111",3);

        buflen = strlen(achBuf);

              ret = sendto(nSockFd,achBuf,buflen,0,(struct sockaddr*)&ServAddr,sizeof(ServAddr));

              memset(achBuf,0,1024);

              memcpy(achBuf,"222",3);

        buflen = strlen(achBuf);

           ret = sendto(nSockFd,achBuf,buflen,0,(struct sockaddr*)&ServAddr,sizeof(ServAddr));

              memset(achBuf,0,1024);

              memcpy(achBuf,"333",3);

        buflen = strlen(achBuf);

           ret = sendto(nSockFd,achBuf,buflen,0,(struct sockaddr*)&ServAddr,sizeof(ServAddr));

}

服务器接收部分(其中的recv可用recvfrom代替):

       sleep(10);

       recv(conn,buf,1024,0);

       printf("conn = %s\n",buf);

四种不同的发送接收组合,均是以下结果:

 

实验二:

UDP客户端循环发送数据到服务器,分三次调用sendto,分别发送了111,222,333;服务器睡眠十秒,然后调用recvfrom循环接收数据。为了表示是第几次接收到的数据,首先打印接收序号。

客户端发送部分:

       nNum = sendto(nSockFd,"111\n", 12, 0, (struct sockaddr *)&MCAddr,sizeof(MCAddr));

    printf("nNum = %d\n",nNum);

       nNum = sendto(nSockFd,"222\n", 12, 0, (struct sockaddr *)&MCAddr,sizeof(MCAddr));

    printf("nNum = %d\n",nNum);   

       nNum = sendto(nSockFd,"333\n", 12, 0, (struct sockaddr *)&MCAddr,sizeof(MCAddr));

    printf("nNum = %d\n",nNum);

服务器接收部分:

       while(1)

       {

              sleep(10);

              memset(achBuf,0,MAXBUFLEN);

              nNum = recvfrom(nServFd,achBuf,MAXBUFLEN,0,(struct sockaddr *)&CliAddr, &dwCliAddrLen);

             

              if(nNum < 0)

              {

                     printf("recverror\n");

                     break;    

              }

              printf("%d\n",i);i++;

              printf("%s\n",achBuf);

       }

结果如下图:

 

4       总结

由实验结果可以知道,读取数据的方式和调用的函数没有关系,而和套接字类型有关。而TCP接收数据时不是一次只读取一个数据报,而是根据buf的大小和缓冲区数据的大小中的较小值来读取数据的,可以一次性读取多个数据报;而UDP是按照接收到的数据次序,一次只读取一个数据报。

现在可以大概的推敲出流模式和数据报模式的区别,接收和发送数据方式的不同。流模式只要不超过流的容量就可以继续往流上提交数据,另一端只要流上有数据就可以读取,而不管这个数据的开头和结尾;数据报模式,有严格的次序关系和数据报的分割关系。而这两种的不同大概是由于TCP一个套接字只接收来自一个对象的数据,而UDP套接字可以接收来自任意对象的数据。

两者在模式上的不同,导致两者在效率和应用模式上的不同。

在每个数据都要分析的情况下,例如发送一条配置命令,TCP必须约定消息头格式指出这条消息的大小,而UDP不需要。而在流媒体数据上,由于TCP有数据重组的特性,效率相对UDP更高。

转载于:https://www.cnblogs.com/leo0000/p/4863139.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GWT 入门介绍

From: http://blog.csdn.net/struts2/article/details/1758122 GWT 入门介绍 GWT使用JSON格式的数据通讯 GWT是 Google Web Toolkit的简称。 GWT是一个以Java语言为工具&#xff0c;以类似Swing的方式编写UI组件&#xff0c;之后通过GWT Compiler编译 为JavaScritp和HTM…

SQL Server 2008空间数据应用系列十一:Bing Maps中呈现GeoRSS订阅的空间数据

友情提示&#xff0c;您阅读本篇博文的先决条件如下&#xff1a; 1、本文示例基于Microsoft SQL Server 2008 R2调测。 2、具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验。 3、熟悉或了解Microsoft SQL Server 2008中的空间数据类型。 4、具备相应&am…

聚类算法的分类整理

1、基于划分的聚类算法 基于划分的聚类算法 主要通过聚类中心的迭代重置&#xff0c;直到达到“簇内点足够近&#xff0c;簇间点足够远”的目标效果&#xff0c;完成样本集的最优化分。其算法优点是时间、空间复杂度低&#xff0c;可以处理大规模数据集。缺点包括容易陷入局部…

[react] 为什么标签里的for要写成htmlFor呢?

[react] 为什么标签里的for要写成htmlFor呢&#xff1f; 为了区别和html自身标签中属性 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

minGW64安装和使用 极简教程

1、下载minGW64 官网下载&#xff1a;https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/我的FTP&#xff1a;a、minGW64 install.exe b、解压免安装版 2、解压 3、添加环境变量 4、CMD 运行gcc 安装完成。 5、使用minGW编译C源码 6、运行

培训总结2

今天&#xff0c;我学习了工具类java.util.包中的几个平时经常用到的几个类&#xff0c;例如ArrayList、HashMap、Hashtable等几个类&#xff0c;在这我总结一下ArrayList的用法。 特征&#xff1a;允许null在内的所有元素&#xff0c;大致上等同于Vector类&#xff0c;但是他是…

GWT 开发入门

From: http://home.cnblogs.com/group/topic/47694.html 在使用GWT开发web程序时&#xff0c;首先得到GWT下载其SDK&#xff0c;目前的最新版为GWT 2.3。 安装插件&#xff0c;目前两大Java IDE&#xff1a; Eclipse 和 NetBeans都有其开发插件&#xff0c;建议使用Eclipse &…

[C#反编译教程]001.Reflector.NET反编译工具 v8.5绿色版+注册机+注册教程

截图 下载地址 Reflector.NET反编译工具 v8.5绿色版注册机 下载地址&#xff1a;http://pan.baidu.com/s/1mgN1Cpi 密码&#xff1a;mx19 简介 .NET Reflector是一个类浏览器和反编译器&#xff0c;.NET Reflector可以分析程序集并向你展示它的所有秘密。.NET 框架向全世界引入…

[react] 函数式组件有没有生命周期?为什么?

[react] 函数式组件有没有生命周期&#xff1f;为什么&#xff1f; 没有生命周期 因为他没有继承React.Component 所以也不需要render() 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌…

openOCD安装 极简教程

1、下载openOCD 官网下载&#xff1a;https://gnutoolchains.com/arm-eabi/openocd/我的FTP&#xff1a;openOCD 2、解压 3、添加环境变量 ->path 4、CMD运行openOCD 安装完成。

一起谈.NET技术,.NET4.0 之 Dynamic VS Reflection 效率

在我先前的文章中&#xff0c;不断的推广.NET4.0新特性。特别是.NET4.0 Dynamic 这个新特性。随之而来的问题也出现了—Dynamic 执行效率如何&#xff1f; 我们做开发的不光需要代码简洁&#xff0c;能够希望自己能够写出好的架构。还有一点非常重要的就是&#xff0c;我们的写…

在windows下写makefile编译代码

From: http://blog.163.com/xjming487126/blog/static/212951352007625114849843/ 在windows下写makefile编译代码 1.下载minGW 下载MinGW-5.0.0.exe&#xff0c;选择全安装。将minGW安装到F:\MinGW目录下。安装后将直接生成MSYS。运行MSYS即进入了一个linux模拟环境。如果是…

Javascript中函数声明与函数表达式的不同

定义函数的方式有两种&#xff1a;一种是函数声明&#xff0c;另一种是函数表达式。 函数声明的语法如下&#xff1a; 1 function functionName(arg0,arg1,arg2){ 2 //函数体 3 } 函数表达式的语法如下&#xff1a; 1 var functionName function(arg0,arg1,arg2){ 2 //函数…

arm-none-eabi-gcc 嵌入式交叉编译器安装 极简教程

1、下载arm-none-eabi-gcc win10 官网下载&#xff1a;https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads我的FTP&#xff1a;arm-none-eabo-gcc 2、解压 3、添加环境变量 4、CMD运行 安装完毕&#xff0c…

[react] 路由切换时同一组件无法重新渲染的有什么方法可以解决?

[react] 路由切换时同一组件无法重新渲染的有什么方法可以解决&#xff1f; componentWillReceiveProps 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

Oracle:使用ASM自动存储管理, 严重推荐

ASM 是Oracle 公司推出的专门用于oracle数据库系统的一种数据存储解决方案. 类似于OS的 软RAID,不过其在系统构架中的层次比较特殊,是直接服务于上层软件(asm)应用的,可以理解为 上下横跨 {硬件分区RAIDOS卷管理OS文件系统}的复合产物. 因其精简和优化了存储系统构架的实现,因而…

Ruby 的环境搭建及安装

上面粗略的介绍了下Ruby&#xff0c;本来不想安装这个的&#xff0c;原因是我是通过网站学习的&#xff0c;可在线编译。不过考虑到内容的全面性&#xff0c;还是尝试下。 参考了下别人的安装&#xff0c;try 一try. 首先因为我是windows 7 &#xff0c;所以就下在相关的版本。…

vscode openOCD 配置Jlink 下载和调试STM32 教程

1、修改openOCD 的配置文件jlink.cfg 由于手头上的jlink 是swd接口&#xff0c;需要将openOCD的jlink.cfg修改&#xff0c;指定接口类型为swd。这里直接复制一份&#xff0c;然后修改&#xff0c;jlink-swd.cfg内容如下&#xff1a; adapter driver jlink transport select s…

[react] 组件卸载前,加在DOM元素的监听事件和定时器要不要手动清除?为什么?

[react] 组件卸载前&#xff0c;加在DOM元素的监听事件和定时器要不要手动清除&#xff1f;为什么&#xff1f; 定时器要在 componentWillUnmount 手动清除&#xff0c;直接绑定在JSX里的事件监听器不用&#xff0c;使用ref绑定的要清除 因为如果不清除定时器&#xff0c;组件…

Ansi、Unicode、UTF8字符串之间的转换和写入文本文件

转载请注明出处http://www.cppblog.com/greatws/archive/2008/08/31/60546.html 最近有人问我关于这个的问题&#xff0c;就此写一篇blog Ansi字符串我们最熟悉&#xff0c;英文占一个字节&#xff0c;汉字2个字节&#xff0c;以一个\0结尾&#xff0c;常用于txt文本文件 Uni…