首页 > 代码库 > 网络基本概念之TCP, UDP, 单播(Unicast), 组播(Multicast)

网络基本概念之TCP, UDP, 单播(Unicast), 组播(Multicast)


这篇文章相当低级,但相当重要!


我们周围一切几乎都依赖于把事情抽象成低等级,并在某一点把它具体化,在一些设计概念中,接口层十分清晰并且目标很集中,应用程序不用考虑操作系统如何工作,操作系统也不用考虑硬件如何工作,OSI模型的第4层不需要考虑第三层如何工作。所以我们只需要集中精力在某一层,就当下面的层正常工作,但这样能行吗?如果你写一个应用,你最好知道OS是怎么样工作的,并且要考虑数据库如何存储字符的,同样,一个好的操作系统必需要了解硬件是如何工作的。如果你认为TCP不需要考虑IP的实现那就搞错了。 所以,这里即使我们假设web应用和服务都运行在OSI第7层,现在我们住下面走走,到第4层(或更低层),看看那里在干什么。我们会讨论TCP和UDP的区别,什么是组播(multicast),它如何工作与如何不工作。相信我,这些东西很有用。

先说一下HTTP,我们现在正在用的直接与这个协议相关,HTTP和一些其它网络应用(SQL*NET, WCI搜索)一起工作在网络第7层,应用层,在第4层的TCP之上,那什么是TCP呢? TCP(传输控制协议)和UDP是internet的主要低层网络协议。它们都建立在另一层IP(Internet协议)之上,IP比它们差一层,在第3层。所以要理解TCP,要先看下IP,然后再回头看看TCP在上面干什么。

    IP:(Internet协议)

IP拥有把一个数据包从一个地方发送到另一个地方的能力,通过提供一种”地方“或“设备”一个特定的地址(IP地址),并指定怎样通过地址在设备之间移动数据包来实现这个协议。现在,IP和下一层的协议之间的区别在于,在第2层的设备总是确切知道如何给其它网络设备发送信息,(第2层为链路层,通常表示为以太网或WiFi)在第2层,设备不但知道怎样发送数据到目的地(通常由MAC地址表示地址),同时也知道是否数据能不能到达目的地。(举个例子,以太网和WiFi简单地把整个数据包广播到整个网络,目的设备假设都在监听这个MAC地址,然后提取数据包,如果目的地不存在或者不在监听,以太网数据就无法到达。顺便提下,网络“嗅探器”正是利用这个广播机制来工作。用于调制解调器拨号连接的PPP协议可以发送任何东西到单个目标:你拨号的号码。

IP提供了发送数据到其它网络的途径,一个设备不需要知道具体路径就可以把一个东西到另一个到另一个网络,这就是“inter-net ”的由来:“在网络之间”。它通过指定一个路由规则,定义一个带有目标地址的数据包。这是基本的规则:如果目标在本地就直接发送(你知道目标在哪,因为它们在同一个网络),否则在一堆路由列表中找一个地址来发送。一个路由只遵守一个协议,除非地址同时属于两个或多个不同的网络,这种情况下会有不同的本地目的地址,也会产生一个更长的路由列表指向更多的未知地址。 目前为止,IP除了可以发送单个数据包到单个地址外不能干其它任何事情,当然它可以接收从任何一个网络发过来的包(不像其它低级的协议),但仅此而已。明显缺点如下:


  • IP不提供发送、接收、出错等通知。
  • IP不提供“端口号”之类的标记来隔离发到目标IP地址的数据包。
  • IP不提供双向通讯。
  • IP不会用任何方式对多个包排序或分组。


最简单的比喻是IP好比邮政服务,你住邮箱里扔一张带地址的明信片,然后它就照着你写的地址寄过去了,寄到,或者没寄到,你并不知道。当明信片寄到时家时,你并不知道别的室友是不是读过它了。如果你想到一个回复,你的收件人不能在同一个卡片上写东西然后还给邮递员,他们要在自己的卡片上写字,贴上邮票,写上地址,最后自己寄出。

TCP:传输控制协议

虽然IP协议不提供这些功能,但TCP可以。如果你先看一下IP不提供的那些特性,再看看邮递然后可以说:“嗯?当然可以做双向通信!人们写信来来回回就像一直在对话一样”。或者,“你可以直接要求收信人或者邮局给你回一封信”。或者说:“算了笨蛋,你可以把明信片标上数字记号然后告诉收信人按顺序阅读,如果有丢失就告诉你”。好吧,你是对的,这就是TCP做的事情。它使用基本的IP(或邮政服务)并指定通过何种方式添加一些附加信息,以便实现这些特性。 所以,TCP真正解决的是如何实现在多个IP设备间进行可靠的多次通信。神马意思?这意味着你可以发送一系列消息(包),基于一个选定的会话(端口或连接),这个包会以同样的顺序接收,发送时不会丢包,同样也不会有重复。 它是这样做的:给所有的包都写一个端口号,用来把其它连接和会话区别开,同时给每个包一个序列号,接收方就能知道传输中是否有丢失。之后,TCP指定接收方响应每个接收的数据(并不强制每个包都响应,可以简单的回复:“我收到第13456个字节之前的全部数据,或者“我收到845到13433之间的数据”),这样发送方就知道是否要重新发送。最后,通信是双向的,不仅仅有应答,还可以让接收方不用指定地址就可以直接住回发信息,有点像给每个包附加一个写好自己地址的回复信封。 可以看到,如果丢包或顺序不对,TCP实际上需要做很多工作。如果我们继续邮局理论,TCP就像一个私人助理,他帮你收集、分类邮件,排好序,获取并阅读,再回复回去。如果邮政服务超级可靠,TCP的任务就很简单,只需要做一个中间人把文件分发出去就好,如果邮政服务损失了许多员工,或者有很多邮件要处理,TCP就要做很多工作,把丢失的包发回去,跟踪并存储许多信息。

    UDP:用户数据协议

UDP就比TCP简单多了, 它和IP做的一样,并加上端口的概念,这样你就把消息发给另一个有IP地址的接收者。它没有顺序或连接,或双向连接,也没有应答。 你应该会认为UDP不靠谱,因为你知道TCP是一个可靠的连接方案,但是实际上在同一个网段,或者在信号很好的局域网,UDP实际上是非常可靠的。如没有丢包并包的按顺序依次到达(这个几乎是短局域网的常态),并不需要重新传输包,所以TCP的所有应答和等待只会浪费时间,增加网络延时。对于可以包容丢包的应用(实时音频和视频)来说,即使网络不给力,UDP也通常是一个好方案。它也经常用于小消息和通知。比如DHCP和DNS都使用UDP。值得一提的是,Unix网络文件系统(NFS)在局域网使用的是UDP。可能你觉得一个文件系统应该需要一个可靠的TCP连接,但是NFS的实现者觉得用UDP可以得到更好的性能,并建立一个专门的机制来保证可靠性。 顺便提一下,它被称作“用户数据报协议”是有原因的,因为它是由一帮系统管理员设计的。“数据报”是“包”的另一个名字,“用户”没有什么实际意思,就和“你”一样。就是说这个计算机程序和操作系统没什么关系。原因是低级的IP是写OS的人写,但是UDP提供了许多和数据报相同的功能,为“用户”程序(非OS)服务。

    多播(Multicasting)

这里可以简化下TCP/IP/UDP的相关讨论,默认我们知道IP(UDP和TCP一样)可以把数据包在一个网络中发到另一个设备。更准确点就是IP把数据包从一个IP地址发到另一个IP地址。多播的决窍就是在同一时间把一个数据包发送到多个设备,可以把一个特定的IP地址指定为多播地址,并同时发送到多个设备。

IP多播首先要知道的是只有UDP有多播,没有TCP多播这样的东西,为什么呢?多播的重点是高效的把同一个包尽可能多的发送到不同的,甚至可能是未知的设备。但是TCP连接可能要求丢包重发或者延时或重组顺序,这些操作可能非常消耗资源,不适于许多使用多播的应用场景。(同时多播不知道发出的包是不是已经到达,这个也导致不能使用TCP)。

参考前面的知道,常用的非多播的UDP(TCP)消息叫做单播(unicast)。

下面我们需要知道多播经常没法通过路由发到另一个网络。下面是部分原因:

  • 多数多播包的TTL比较低: 所有的IP包都有一个“生存时间”(time-to-live),或者叫TTL。和DNS记录不一样,TTL指定一个包到达目的地之前跳过网络的最大次数。单播包通常被允许穿越30个网络(比如,被路由或”跳“过29个路由),穿过网络通常小于15次”跳越“,所以30的限制经常用于当网络配置的很烂时把数据包杀掉。但是许多程序发多播时把TTL设为一个很低的值,通常为0(这样消息不会离开自身的设备)。
  • 设置为1表示只能发到本地网络的计算机,设置为2 表示只能穿过一个路由。很少有应用想把多播发给整个校园网络的未知设备,更不会发给整个网络。
  • 诸多路由都设置了很高的TTL阈值:很多网络路由器,特别是WAN路由和internet网关路由都有很高的TTL阈值,这样它们就不会发送这些低TTL(如15)的多播包。这样可以防止多播从本地网络泄漏。
  • 路由器一般配置成完全不发送多播,或只发一些特定的地址,或配置成阻塞多播包。

UDP多播可能有点过于邪恶,但是它使用的次数可能远远超出你的预计。它不会用于网络视频网站比如YouTube,因为它需要当用户点播时再发送视频,而不是同时发给所有的用户,同样也不用于VoIP语音。它用于很多发现和自动配置,如Skype, iTunes 和 uPnP,也偶尔用于WCI入口。

 

来自https://blogs.oracle.com/lmukadam/entry/tcp_udp_unicast_multicast_i_th