From 5c97b1609f668da7027d705f5efd2e2bf0102e72 Mon Sep 17 00:00:00 2001 From: riba2534 Date: Sun, 27 Jan 2019 12:56:31 +0800 Subject: [PATCH] =?UTF-8?q?P232=20=E8=B7=AF=E7=94=B1=E7=9A=84=20TTL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 34 ++++++++++++++++++++++++++++++++++ ch14/README.md | 1 + 2 files changed, 35 insertions(+) create mode 100644 ch14/README.md diff --git a/README.md b/README.md index 60cd7da..3cecdbc 100644 --- a/README.md +++ b/README.md @@ -3670,6 +3670,40 @@ gcc readv.c -o rv ## 第 14 章 多播与广播 +本章代码,在[TCP-IP-NetworkNote](https://github.com/riba2534/TCP-IP-NetworkNote)中可以找到。 + +### 14.1 多播 + +多播(Multicast)方式的数据传输是基于 UDP 完成的。因此 ,与 UDP 服务器端/客户端的实现方式非常接近。区别在于,UDP 数据传输以单一目标进行,而多播数据同时传递到加入(注册)特定组的大量主机。换言之,采用多播方式时,可以同时向多个主机传递数据。 + +#### 14.1.1 多播的数据传输方式以及流量方面的优点 + +多播的数据传输特点可整理如下: + +- 多播服务器端针对特定多播组,只发送 1 次数据。 +- 即使只发送 1 次数据,但该组内的所有客户端都会接收数据 +- 多播组数可以在 IP 地址范围内任意增加 + +多播组是 D 类IP地址(224.0.0.0~239.255.255.255),「加入多播组」可以理解为通过程序完成如下声明: + +> 在 D 类IP地址中,我希望接收发往目标 239.234.218.234 的多播数据 + +多播是基于 UDP 完成的,也就是说,多播数据包的格式与 UDP 数据包相同。只是与一般的 UDP 数据包不同。向网络传递 1 个多播数据包时,路由器将复制该数据包并传递到多个主机。像这样,多播需要借助路由器完成。如图所示: + +![](https://i.loli.net/2019/01/27/5c4d310daa6be.png) + +若通过 TCP 或 UDP 向 1000 个主机发送文件,则共需要传递 1000 次。但是此时如果用多播网络传输文件,则只需要发送一次。这时由 1000 台主机构成的网络中的路由器负责复制文件并传递到主机。就因为这种特性,多播主要用于「多媒体数据实时传输」。 + +另外,理论上可以完成多播通信,但是不少路由器并不支持多播,或即便支持也因网络拥堵问题故意阻断多播。因此,为了在不支持多播的路由器中完成多播通信,也会使用隧道(Tunneling)技术。 + +#### 14.1.2 路由(Routing)和 TTL(Time to Live,生存时间),以及加入组的办法 + +为了传递多播数据包,必须设置 TTL 。TTL 是 Time to Live的简写,是决定「数据包传递距离」的主要因素。TTL 用整数表示,并且每经过一个路由器就减一。TTL 变为 0 时,该数据包就无法再被传递,只能销毁。因此,TTL 的值设置过大将影响网络流量。当然,设置过小,也无法传递到目标。 + +![](https://i.loli.net/2019/01/27/5c4d3960001eb.png) + +接下来是 TTL 的设置方法。TTL 是可以通过第九章的套接字可选项完成的。 + diff --git a/ch14/README.md b/ch14/README.md new file mode 100644 index 0000000..018c4e0 --- /dev/null +++ b/ch14/README.md @@ -0,0 +1 @@ +14. \ No newline at end of file