“TCP是一种流模式的协议,UDP是一种数据报模式的协议”,这句话相信大家对这句话已经耳熟能详~但是,“流模式”与“数据包模式”在编程的时候有什么区别呢?以下是我的理解,仅供参考!
1、TCP
打个比方比喻TCP,你家里有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通过龙头将水池里的水放出来,然后用各种各样的容器装(杯子、矿泉水瓶、锅碗瓢盆)接水。
上面的例子中,往水池里倒几次水和接几次水是没有必然联系的,也就是说你可以只倒一次水,然后分10次接完。另外,水池里的水接多少就会少多少;往里面倒多少水,就会增加多少水,但是不能超过水池的容量,多出的水会溢出。
结合TCP的概念,水池就好比接收缓存,倒水就相当于发送数据,接水就相当于读取数据。好比你通过TCP连接给另一端发送数据,你只调用了一次write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。(假设数据都能到达)但是,你发送的数据量不能大于对方的接收缓存(流量控制),如果你硬是要发送过量数据,则对方的缓存满了就会把多出的数据丢弃。
2、UDP
UDP和TCP不同,发送端调用了几次write,接收端必须用相同次数的read读完。UPD是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。也就说,如果不指定MSG_PEEK标志,每次读取操作将消耗一个报文。
3、为什么
其实,这种不同是由TCP和UDP的特性决定的。TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。
而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的。
分享到:
相关推荐
udp与tcp连接建立、数据传输、连接断开的报文分析
这个压缩包里面一共有两个工具,,一个是用于抓包分析报文的。。还有一个用于建立TCP UDP连接,发送报文的,可以用来调试自己写的网络程序。
tcp udp 协议 报文测试工具,可以模拟数据发送,接收等,用于开发中的报文数据进行测试。
实现基于UDP、TCP协议的网络连接及报文收发
1,tcp udp 数据发送 2,支持16进制数据 3,支持创建tcp/udp服务器
可以协助测试UDP、tcp协议栈,模拟发送标准的tcp、udp报文
C# Socket TCP和UDP报文及端口测试工具的开发(提供源码)万能超好测试工具
Linux UDP socket 设置为的非阻塞模式与阻塞模式区别 UDP socket 设置为的非阻塞模式 Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), MSG_DONTWAIT, (struct sockaddr *)&SockAddr,&ScokAddrLen); UDP...
1、生成 wireshark 工具可读取的 capture.pcap 抓包文件; 2、学习 “DNS解析步骤”报文结构; 3、学习 “TCP三次握手”报文结构;...一文详解 TCP与UDP 协议 https://xiaxl.blog.csdn.net/article/details/106223354
关于TCP和UDP协议发送数据大小的一些讨论。
串口助手,TCP/UDP串口工具,方便测试TCP/UDP数据报文,报文重发
C# Socket TCP和UDP报文及端口测试工具的开发
ModbusTCP协议报文详细分析
网络调试助手 NetAssist,支持UDP,TCP协议,网络数据收发,很好用的调试工具
C# Socket TCP和UDP报文及端口测试工具,正常测试通讯
欧姆龙PLC之Fins UDP与Fins TCP协议解析与通讯测试
C#2010 Socket TCP和UDP报文及端口测试工具的开发和源码