[原]TCP/UDP使用细节备忘

[原]TCP/UDP使用细节备忘

      首先,TCP和UDP的基本区别是TCP提供可靠的面向连接的流传输;UDP提供不可靠的基于数据包的传输;


      所谓可靠就是说发送端调用send后,数据就一定会发送给接收端。虽然这当中可能会消耗很长的时间,或者实在无法发送的话发送端或者接收端也能得到适当的通知。而不可靠传输是指,发送端调用send后,接收端能不能收到数据是没有保证的,运气(网络状况)好的话,接收端可以立即收到数据。运气不好的话,数据可能会在传输过程中被丢弃。如果数据被丢弃的话,发送端和接收端都不会得到任何通知。另外,数据还有可能经历漫长的时间后到达接收端。


      那么基于流的传输是指发送端send一块数据后,就像把一杯水倒入小河,当水流到达接收端后,接收端能够汲取到从发送端传过来的水,那却很难再把那杯水原原本本地装进一个杯子里了(当然实际的开发中,可以在这块数据前后设置标志让接收端从流中提取出这块数据来)。正因为TCP的传输是基于流的,所以发送端调用N次send总共发送S字节的数据,在接收端对应的是M次recv总共接收的数据还是S字节。这里N往往不等于M,如果实际使用中希望send的数据块和recv的数据块的次数对等的话,就要自己给数据块加上标志以帮助接收端区分数据块。而且在接收端区分数据块是也很可能发生一次recv从流中接收的数据不够一块的情况,这时,接收端应该等待TCP流再次到达,并从中recv块剩余的部分。


      基于数据包的传输和流不一样,发送端send一块数据后,如果数据能够到达接收端,那么接收端recv到的就是一块完整的数据。如果数据包丢失,那么接收端就收不到任何东西。所以对于UDP的数据包传输来说,情况很简单,接收端要么收到完整的数据包,要么啥都收不到。数据包和数据流另外一个不同点是,数据流中的数据是有序的,接收端收到的数据和发送端发送的数据的顺序是一致的。而数据包的数据不能保证有序,发送端发送的数据到达接收端的顺序是错乱的。


      相较之下,UDP的概念比TCP要简洁一些,但是实际使用起来,要注意的地方也要更多一些。所以在使用UDP时要注意以下几个方面:


1)UDP不提供拥塞控制,如果发送端无节制地向接收端发送数据包,很可能会导致接收端来不及处理数据包,而造成大量的丢包现象。


2)UDP的数据包是无序的,接收端如果对数据的顺序有要求的话,要自行处理数据包的顺序


3)UDP数据包的大小是有限制的,理论上这个限制是由于一个IP包的最大长度除去UDP包头的长度,而实际上各个不同的TCP/IP协议的实现给出的限制不同,基本都小于32768。而实际的网络环境中,往往要更小。


 


      除了上面提到过的UDP数据包的大小限制,还有一个MTU的概念,MTU基本上是由于链路层协议对数据包的长度的限制,不同的链路层的MTU是不一样的,如果一个IP数据包的长度超过了链路的MTU,那么这个包会按MTU的大小在链路层分片,当数据通过链路后,再重新组包后发送到IP的下一路。在一个IP包的传输过程中可能会发生多次分片和组包。如果一个IP包中设置了禁止分片的DF标志,那么,当发现IP包的长度超过MTU时,数据包会被丢弃。发送端会收到一个ICMP的通知,告诉数据包因为过大而被丢弃。看起来,MTU和UDP数据包大小限制这两个概念比较容易搞混淆。其实MTU是一个影响IP层的概念,而UDP数据包大小限制是传输层的问题。假设发送端和接收端之间的MTU是1500,这并不代表UDP包的最大限制就是1500。此时UDP包的最大限制还可能是32768!这是因为承载UDP包的IP包在网络上自动被分片并组包了。这个情况下UDP包的最大限制是由TCP/IP协议的实现决定的,如果这个实现的IP包都设置DF标志,那么IP包在链路上不会被分片,那么UDP的最大限制就等于MTU,是1500。如果这个实现的IP包不设置DF标志,那么IP包在链路上就能顺序通过,那就由这个实现中对UDP的大小限制这个部分来决定了。


      最后,TCP会自己处理每个TCP数据段的大小(MSS),UDP的最大限制就要使用者自己来把握(可以使用比较保险的较小的值,也可以通过在发送端和接收端之间发送检测包来决定)。还有,当数据无法发送到接收端时(往往是接收端的进程并没有启动),TCP和UDP都能收到适当的通过。在socket当中都是10053这个错误号,在TCP的实现中,是通过设置了RST标志的包通知,在UDP的实现中,是通过一个ICMP包来通知的。



作者:nobugtodebug 发表于2010-12-17 11:12:00 原文链接


阅读:119 评论:0 查看评论



来自为知笔记(Wiz)


转载于:https://www.cnblogs.com/nobugtodebug/p/4500264.html

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

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

相关文章

java程序员遇到的问题_JAVA程序员最常遇见的10个异常

程序员最不想遇到黑心老板外,异常也是难以不遇,现在列出10个最遇到的异常,大家可以参考一下。NO.1 java.lang.NullPointerException这个异常大家肯定都经常遇到,异常的解释是 "程序遇上了空指针 ",简单地说…

如何对一组 IP 地址 进行排序?

咨询区 Cracker我有一组如下IP地址。192.168.1.5 69.52.220.44 10.152.16.23 192.168.3.10 192.168.1.4 192.168.2.1我在寻找一个方法将他们排序成如下顺序。10.152.16.23 69.52.220.44 192.168.1.4 192.168.1.5 192.168.2.1回答区 Alex Aza对 ip 地址进行排序,大概…

LeetCode之Intersection of Two Arrays

1、题目 Given two arrays, write a function to compute their intersection. Example: Given nums1 [1, 2, 2, 1], nums2 [2, 2], return [2]. Note: Each element in the result must be unique.The result can be in any order.Subscribe to see which companies asked t…

如何为APK签名?

1.用来生成应用签名的文件①默认: debug.keystore > debug签名的应用程序不能在Android Market上架销售,它会强制你使用自己的签名。> 不同电脑使用此文件生成的签名不一样。那就意味着如果你换了机器进行apk版本升级,那么将会出现上面那种程序不能…

shell 杂记一(笨鸟)

查找子串cat /tmp/debug.log | perl -e while(<>) { if ($_ ~ /hd_uid(\d)/) { print "$1\n"; } } 匹配每行"hd_uid"后面的数字if [ ... ]then ...fiexit numcase $i in1) echo 1111;;2) echo 2222;;*) echo other;;esacbasename 返回…

基于 Azure 的认知服务将文本合成语音

基于 Azure 的认知服务将文本合成语音Intro前几天发了一个 .NET 20 周年祝福视频&#xff0c;语音是通过 Azure 的认知服务合成的&#xff0c;下面就来介绍一下如何将使用 Azure 的认识服务实现将文本合成为语音Prepare你可以在 Azure Portal 上创建一个免费的语音服务&#xf…

sql查询结果集根据指定条件排序的方法

oracle认为 null 最大。 升序排列&#xff0c;默认情况下&#xff0c;null值排后面。 降序排序&#xff0c;默认情况下&#xff0c;null值排前面。 有几种办法改变这种情况&#xff1a; &#xff08;1&#xff09;用 nvl 函数或decode 函数 将null转换为一特定值 &#xff08;2…

mysql怎么改字体编码_mysql怎么改字符编码?

mysql命令行修改字符编码1、修改数据库字符编码mysql> alter database mydb character set utf8 ;2、创建数据库时&#xff0c;指定数据库的字符编码mysql> create database mydb character set utf8 ;3、查看mysql数据库的字符编码mysql> show variables like charac…

LeetCode之Move Zeroes

1、题目 Given an array nums, write a function to move all 0s to the end of it while maintaining the relative order of the non-zero elements. For example, given nums [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0]. Note: You …

七种RAID技术

想把好多硬盘组在一起使用的基本方式为&#xff1a;连接所有硬盘&#xff0c;先向第一个硬盘中写数据&#xff0c;满了之后&#xff0c;再向第二个硬盘上写数据&#xff0c;如此只是简单的连通了多个硬盘。 再此基础上发展了RAID技术&#xff1a;由独立磁盘组成的具有冗余特性的…

如何编译 dotnet/runtime 源代码

前言最近&#xff0c;准备为 dotnet/runtime 修改 issue&#xff0c;但是在 clone 代码后&#xff0c;发现要编译成功&#xff0c;远没有想象中那么容易。因此&#xff0c;将整个过程进行记录&#xff0c;以供大家参考。以下操作都是在 Windows 10 下完成。0.环境准备详见官方文…

网站高可用方案

前端&#xff1a;vanish squid等代理缓存动态数据缓存&#xff1a;对于不是经常变化的用memcached 如果跟微博差不多的场景可以用redis数据库&#xff1a;为了备份和恢复&#xff1a;可以用主从 对于主-》从-》从 有个参数log_slave_update参数决定后面两个从是否写日志一主多从…

Android:源码环境编译自定义的APP到ROM(System Image)中

有时候我们需要在源码环境中增加自己的应用或模块&#xff0c;随ROM一起发布。 下面讲述相关步骤: 1. 首先可以在SDK环境下进行编码设计&#xff08;如果你的APP不涉及到emulator无法模拟的硬件的话) 也可以参考另一篇文章&#xff0c;直接在Eclipse中调试系统级应用源代码&…

jenkins maven testng selenium自动化持续集成

准备环境 首先我们新建一个maven的工程&#xff0c;并且在pom.xml中配置好我们依赖的一些jar包 <dependencies><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>2.46.0<…

LeetCode之Excel Sheet Column Number

1、题目 Related to question Excel Sheet Column Title Given a column title as appear in an Excel sheet, return its corresponding column number. For example: A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 Credits: Special thanks to ts f…

java程序 开发工具_15款Java程序员必备的开发工具

如果你是一名Web开发人员&#xff0c;那么用膝盖想也知道你的职业生涯大部分将使用Java而度过。这是一款商业级的编程语言&#xff0c;我们没有办法不接触它。对于Java&#xff0c;有两种截然不同的观点&#xff1a;一种认为Java是最简单功能***大的编程语言之一&#xff0c;另…

C# 实例解释面向对象编程中的开闭原则

在面向对象编程中&#xff0c;SOLID 是五个设计原则的首字母缩写&#xff0c;旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特C马丁(Robert Cecil Martin)提出的许多原则的子集&#xff0c;在他2000年的论文《设计原则与设计模式》中首次提出…

SQLite编译问题

从http://www.sqlite.org/主页上获得了SQLite的源文件&#xff0c;还没有时间研究就在编译上发生了不小的问题。 首先是碰到是&#xff0c;编译之后&#xff0c;只产生了sqlite3.dll文件&#xff0c;不产生对应的lib库文件。 查看了下sqlite3.h代码&#xff0c;发现了SQLITE_AP…

回首程序员4年时光

犹记得在2010年9月只身一人来上海找实习机会&#xff0c;因为自己的算法和数据结构基础很牢固&#xff0c;很容易找到了一家100多人的外资公司&#xff0c;这家公司是开发儿童英语学习虚拟社区的。做的产品是基于Flash实现的&#xff0c;产品含有很多课件&#xff0c;益智游戏&…

LeetCode之Number Complement

1、题目 Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation. Note: The given integer is guaranteed to fit within the range of a 32-bit signed integer.You could assume no leading…