网络的基本概念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不提供“port号”之类的标记来隔离发到目标IP地址的数据包。
- IP不提供双向通讯。
- IP不会用不论什么方式对多个包排序或分组。
最简单的比喻是IP好比邮政服务。你住邮箱里扔一张带地址的明信片,然后它就照着你写的地址寄过去了。寄到。或者没寄到,你并不知道。当明信片寄到时家时,你并不知道别的室友是不是读过它了。假设你想到一个回复,你的收件人不能在同一个卡片上写东西然后还给邮递员,他们要在自己的卡片上写字,贴上邮票,写上地址。最后自己寄出。
TCP:传输控制协议
尽管IP协议不提供这些功能,但TCP能够。
假设你先看一下IP不提供的那些特性,再看看邮递然后能够说:“嗯?当然能够做双向通信!
人们写信来来回回就像一直在对话一样”。或者,“你能够直接要求收信人或者邮局给你回一封信”。或者说:“算了笨蛋,你能够把明信片标上数字记号然后告诉收信人按顺序阅读,假设有丢失就告诉你”。好吧,你是对的,这就是TCP做的事情。它使用主要的IP(或邮政服务)并指定通过何种方式加入一些附加信息。以便实现这些特性。 所以,TCP真正解决的是怎样实如今多个IP设备间进行可靠的多次通信。
神马意思?这意味着你能够发送一系列消息(包)。基于一个选定的会话(port或连接),这个包会以相同的顺序接收,发送时不会丢包,相同也不会有反复。 它是这样做的:给所有的包都写一个port号。用来把其他连接和会话差别开。同一时候给每一个包一个序列号,接收方就能知道传输中是否有丢失。
之后,TCP指定接收方响应每一个接收的数据(并不强制每一个包都响应。能够简单的回复:“我收到第13456个字节之前的所有数据,或者“我收到845到13433之间的数据”),这样发送方就知道是否要又一次发送。最后。通信是双向的。不唯独应答。还能够让接收方不用指定地址就能够直接住回发信息,有点像给每一个包附加一个写好自己地址的回复信封。
能够看到,假设丢包或顺序不正确,TCP实际上须要做非常多工作。假设我们继续邮局理论。TCP就像一个私人助理,他帮你收集、分类邮件,排好序。获取并阅读。再回复回去。假设邮政服务超级可靠,TCP的任务就非常easy。仅仅须要做一个中间人把文件分发出去就好。假设邮政服务损失了很多员工。或者有非常多邮件要处理。TCP就要做非常多工作,把丢失的包发回去,跟踪并存储很多信息。
UDP:用户数据协议
UDP就比TCP简单多了, 它和IP做的一样,并加上port的概念。这样你就把消息发给还有一个有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