《下一代网络技术》三

发布于 2019-05-23  24 次阅读


# 《下一代网络技术》作业三

请说明 IPv6 头的结构特点?IPv6 头中定义了哪些可选头

包头长为 64bit,顺序依次是:版本 4bit,通信类别 8bit,流标记 20bit,分组长度 16bit,下一协议头 8bit,跳数限制 8bit。源地址 128bit,目的地址 128bit。

如图:

IPv6 Header

IPv6 地址有哪几种

单播(unicast)

单播地址标示一个网络接口。协议会把送往地址的数据包送往给其接口。单播地址包括可聚类的全球单播地址、链路本地地址等。

任播(anycast)

任播发送给距离最近的其中一个接收地址,当该接收地址收到数据包并进行回应,该接收列表的其他节点会知道某个节点地址已经回应了,就不会继续传输。

任播地址主要分配给服务端,且不能作为发送端地址。

多播(multicast)

多播地址也称组播地址。送到多播地址的数据包会被发送到所有的地址。它们的前置为 FF00::/8。

移动 IP 需要解决的问题是什么?移动 IP 中的主要功能实体有哪些

主要解决的问题是设备漫游时的网络通路问题。例如:对于无线终端,从一个局域网漫游到另一个局域网,使用移动 IP 保证链路联通。

主要功能实体有:移动节点、归属代理和外部代理,即:客户端,源代理和现代理。其中,源代理通过隧道等方式跨过现代理向终端传输数据包。

移动 IP 的基本原理是怎样的?移动 IPv4 与移动 IPv6 有什么区别

终端在漫游时含有两个 IP 地址,一个是 home address,另一个是 CoA。归属代理保存终端的相关信息,当服务节点与终端通信时,将数据包发往源地址,并由归属代理负责转发数据包。也可以通过 redirect 的方式告知服务节点终端的新 IP。

这一技术在 IPv6 的区别是:

  • 移动IPv6不需要外地代理的支持
  • 移动IPv6支持路由优化
  • 移动IPv6在移动节点不在本地网络时通过IPv6路由头部而不是隧道来路由
  • 可以通过邻居发现的方式来改变路由

如何使得一个应用程序既能使用 IPv4 对外通信,也能使用 IPv6 对外通信

首先,程序想通过 IPv6 对外通信,本机必须有 IPv6 地址。其次,程序必须监听 IPv6 端口。从编码上讲,创建 socket 时,必须指定是 IPv6 类型。

这里附一段 C++ 代码,使用 Boost.Asio 创建了可以在双栈网络运行的 Echo Server:

void session(tcp::socket sock)
{
  try
  {
    while (true)
    {
      std::vector<char> buffer(1024);
      boost::system::error_code error;
      size_t length = sock.read_some(boost::asio::buffer(buffer), error);
      if (error == boost::asio::error::eof)
        break;
      else if (error)
        throw boost::system::system_error(error);
      boost::asio::write(sock, boost::asio::buffer(buffer));
    }
  }
  catch (std::exception& e)
  {
    std::cerr << "Exception in thread: " << e.what() << std::endl;
  }
}
void server(boost::asio::io_context& io_context, unsigned short port)
{
  tcp::acceptor a(io_context, tcp::endpoint(tcp::v6(), port));
  while (true)
  {
    std::thread(session, a.accept()).detach();
  }
}

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。