标签: ipv6

为ipv6实现最长前缀匹配的最佳方法是什么?

ipv6路由器存储多个路由作为n地址的第一位.2000年,研究人员在1500条ipv6路线中发现只有14种不同的前缀长度.传入数据包根据最长前缀匹配路由到不同的传出端口,因此如果数据包x的前8位与8位路由匹配,但同一数据包的前48位与48位路由匹配,则路由器必须选择48位路线.

我的路由器正在处理如此多的数据包,因此查找路由表的内存速度是一个限制因素.在路由表中找到最长匹配前缀的好算法是什么?

algorithm ipv6

5
推荐指数
1
解决办法
1万
查看次数

IPv6组播地址:组ID字段是有效的112位还是32位?

我正在尝试理解选择IPv6多播地址组ID的规则,并且RFC似乎有些不一致.例如,在RFC 2373第2.7节中显示了此图:

|   8    |  4 |  4 |                  112 bits                   |
+------ -+----+----+---------------------------------------------+
|11111111|flgs|scop|                  group ID                   |
+--------+----+----+---------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

......但是在第2.7.2节中它显示了这个:

|   8    |  4 |  4 |          80 bits          |     32 bits     |
+------ -+----+----+---------------------------+-----------------+
|11111111|flgs|scop|   reserved must be zero   |    group ID     |
+--------+----+----+---------------------------+-----------------+
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,Group ID字段的高80位是否可用?如果它们可用,是否仅在某些情况下(例如,当使用非以太网网络技术时?)如果我在通过以太网LAN进行多播时设置这些位,我应该遇到什么问题?

multicast ipv6

5
推荐指数
1
解决办法
2972
查看次数

如何验证ICMPv6校验和?(为什么我一直得到0x3fff的校验和?)

我正在开发一个接收IPv6路由器通告数据包的Linux用户空间程序.作为RFC4861的一部分,我需要验证ICMPv6校验和.基于我的研究,其中大部分指的是一般来说,如果你计算IPv6伪报头的补码校验和以及数据包内容,结果应该是0xffff,那么就是指IP校验和.但我一直得到0x3fff的校验和.

我的校验和实现有问题吗?Linux内核在将数据包传递给用户空间之前是否验证了ICMPv6校验和?是否有一个很好的参考源来测试已知良好的ICMPv6数据包?

uint16_t
checksum(const struct in6_addr *src, const struct in6_addr *dst, const void *data, size_t len) {
    uint32_t checksum = 0;
    union {
        uint32_t dword;
        uint16_t word[2];
        uint8_t byte[4];
    } temp;

    // IPv6 Pseudo header source address, destination address, length, zeros, next header
    checksum += src->s6_addr16[0];
    checksum += src->s6_addr16[1];
    checksum += src->s6_addr16[2];
    checksum += src->s6_addr16[3];
    checksum += src->s6_addr16[4];
    checksum += src->s6_addr16[5];
    checksum += src->s6_addr16[6];
    checksum += src->s6_addr16[7];

    checksum += dst->s6_addr16[0];
    checksum += dst->s6_addr16[1];
    checksum += dst->s6_addr16[2];
    checksum += dst->s6_addr16[3];
    checksum …
Run Code Online (Sandbox Code Playgroud)

c sockets linux ipv6 icmp

5
推荐指数
1
解决办法
2611
查看次数

TcpClient连接失败,IPv6Any

问题是,如果IPAddress.Any作为参数给出,以下代码可以正常工作,但如果使用`IPAddress.IPv6Any则抛出错误.

我收到错误#10057

套接字未连接.

不允许发送或接收数据的请求,因为套接字未连接(当使用sendto在数据报套接字上发送时)没有提供地址.任何其他类型的操作也可能返回此错误 - 例如,如果已重置连接,则setsockopt设置SO_KEEPALIVE.

为什么它不能像IPv6一样工作?我很确定它不是防火墙,因为端口保持不变并且它适用于IPv4(我的防火墙应该传递我的应用程序发出的任何请求).

要简化代码,它是这样的:

听众:

listener = new TcpListener(IPAddress.IPv6Any, portNr);
listener.AllowNatTraversal(true);
listener.Start();
listener.BeginAcceptTcpClient(this.AcceptClient, null);
Run Code Online (Sandbox Code Playgroud)

客户端:

client = new TcpClient();
client.NoDelay = true;            

try
{
    this.client.Connect(ip, port);  //ip = "localhost" when connecting as server
}
catch (Exception ex)
{
    FileLogger.LogMessage(ex);
    Disconnect();
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试建立TCP连接的"服务器端".

我所做的是我在localhost启动一个监听器,然后作为客户端连接到它(并允许其他人作为客户端加入).

我想要实现的是这个TCP服务器的直接可寻址性,遵循这篇文章:http://blogs.msdn.com/b/ncl/archive/2009/07/27/end-to-end-connectivity -with-NAT遍历-的.aspx

我这样做的原因是我希望人A能够在他们都在NAT路由器后面时连接到B人.

c# ipv6 tcpclient

5
推荐指数
1
解决办法
4403
查看次数

使用ioctl分配ipv6地址

我正在尝试使用ioctl为接口分配IPv6地址,但是徒劳无功.这是我使用的代码:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>             
#include <net/if.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/sockios.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define IFNAME "eth1"
#define HOST "fec2::22"
#define ifreq_offsetof(x)  offsetof(struct ifreq, x)

int main(int argc, char **argv) {
  struct ifreq ifr;
  struct sockaddr_in6 sai;
  int sockfd;                     /* socket fd we use to manipulate stuff with */
  int selector;
  unsigned char mask;

  char *p;

  /* Create a channel to the NET kernel. */
  sockfd = socket(AF_INET6, SOCK_DGRAM, …
Run Code Online (Sandbox Code Playgroud)

networking ipv6

5
推荐指数
1
解决办法
6077
查看次数

使用Boost Asio接受IPv6链接范围地址

我有一个使用Boost ASIO的TCP服务器.我注意到在Linux上使用链接范围的IPv6地址时我无法创建一个boost::asio::ip::tcp::acceptor没有抛出异常.使用全局IPv6地址或IPv4地址将正常工作.

我很确定问题是范围ID未正确设置但我无法弄清楚如何解决问题.

我正在使用ubuntu提供的boost 1.40.0库在Ubuntu 11.04 LTS上进行开发.这是我所拥有的服务器代码的一个非常愚蠢的版本,它显示了这个问题:

#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <string>

/* To Compile:
g++ -Wall -o ./asio-ipv6 ./asio-ipv6.cpp -lboost_system 
*/

typedef boost::shared_ptr<boost::asio::ip::tcp::socket>   TcpSocketPtr;
typedef boost::shared_ptr<boost::asio::ip::tcp::acceptor> TcpAcceptorPtr;
typedef boost::shared_ptr<boost::asio::ip::tcp::endpoint> TcpEndpointPtr;

class AsioServer{
public:
  AsioServer(boost::asio::io_service& io): io_(io){};

  //throws
  void accept(const std::string& ipString,unsigned short port){
    boost::asio::ip::address addr = boost::asio::ip::address::from_string(ipString);
    std::cout << "Valid IP address " << ipString << std::endl;

    this->endpoint_.reset(new boost::asio::ip::tcp::endpoint(addr,port));
    std::cout << "Created endpoint" << std::endl;

    //Will throw if a link local IPv6 …
Run Code Online (Sandbox Code Playgroud)

c++ boost ipv6 boost-asio

5
推荐指数
1
解决办法
4576
查看次数

$ _SERVER ['REMOTE_ADDR']的IPV6表示法

我有很多项目,依靠提供IP地址的功能$_SERVER['REMOTE_ADDR],$_SERVER['HTTP_X_FORWARDED_FOR']$_SERVER['CLIENT_IP'].

IPV4地址很容易匹配,因为我们总是以相同的格式接收它们:4个整数没有前导0,用点分隔..

IPV6地址可以压缩.例:FF01:0:0:0:0:0:0:101 - > FF01 :: 101

我一直在研究这个问题,但没有发现任何相关内容,所以我要求你的经验.正在$_SERVER['REMOTE_ADDR]使用的标准呢?假设它总是以压缩或未压缩的形式接收是否安全?

或者我应该在尝试测试之前压缩所有的IPV6字符串?

注意:

理想情况下,我希望将IPV6地址作为字符串而不是二进制结构来处理,以提高数据库/源代码的可读性并允许更容易的IP范围匹配.

php ipv6

5
推荐指数
1
解决办法
4609
查看次数

由于ipv6(Ubuntu)导致卷曲POST之前的10秒延迟

注意:我不想删除下面的任何历史记录,但我之前认为这是一个Heroku问题,但事实并非如此.我认为这是我的本地机器通过curl和ruby Net :: HTTP发送帖子的问题

我目前正在开始研究Heroku上的rails应用程序(免费),为了将一些测试数据输入应用程序,我有一个rake任务,它从我的DEV DB中获取测试数据并发布到JSON REST API上. heroku app就像这样:

uri = URI.parse("http://SITENAME.herokuapp.com")
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new("/users.json")
request.add_field('Content-Type', 'application/json')
request.body = {'user' => User.first.to_hash }.to_json
response = http.request(request)
Run Code Online (Sandbox Code Playgroud)

出于某种原因,每个请求几乎都需要10秒钟.然后我将顶线更改为:

uri = URI.parse("http://localhost:3000")
Run Code Online (Sandbox Code Playgroud)

......请求过程非常快.有人知道Heroku是否在免费版上放慢了POSTS的速度?(这是有意义的,因为他们希望你支付工作人员dyno)我最终会为付费版本付出代价,但是在这之前想要在我的DEV中稍微进一步.而且,如果他们没有故意放慢速度,我会有点犹豫不决,直到我知道为什么帖子花了这么长时间.需要10秒的线路是:

response = http.request(request)
Run Code Online (Sandbox Code Playgroud)

我确信这很明显,但我想我会提到它.

更新3/12 只是想从今天发布我的一些日志.所有请求都需要10秒钟:

1400
Before: 2013-03-12 21:30:33 UTC
After: 2013-03-12 21:30:43 UTC
1401
Before: 2013-03-12 21:30:43 UTC
After: 2013-03-12 21:30:54 UTC
1402
Before: 2013-03-12 21:30:54 UTC
After: 2013-03-12 21:31:04 UTC
1403
Before: 2013-03-12 21:31:04 UTC
After: 2013-03-12 21:31:14 UTC
1404
Before: …
Run Code Online (Sandbox Code Playgroud)

post json curl ipv4 ipv6

5
推荐指数
1
解决办法
1161
查看次数

Java中的IPv6支持

我正在尝试在具有Windows 7操作系统的本地系统上测试java程序以获得IPv6支持.我已经分配了IPv6地址,并在网络连接中禁用了IPv4.

当我执行ipconfig命令时,我得到IPv6地址作为输出.

但是,当我执行下面的java代码时,我得到的127.0.0.1是IPv4地址

System.setProperty("java.net.preferIPv6Stack","true");

InetAddress addr = InetAddress.getLocalHost();
System.out.println(addr.getHostAddress());
Run Code Online (Sandbox Code Playgroud)

根据我的理解,上面的代码应该打印出来0:0:0:0:0:0:0:1.

我错过了什么吗?

java ipv6

5
推荐指数
1
解决办法
4239
查看次数

有什么方法可以强制Segment JS客户端使用IPv6而不是IPv4?

我有一台同时具有IPv4和IPv6地址的设备。在我的rails应用程序中,请求通过Cloudflare发出,并且从中提取的IP地址X-Forwarded-For是IPv6地址。但是,当我从JS客户端发送跟踪事件时,默认情况下它使用IPv4。有什么方法可以使JS客户端使用IPv6而不是IPv4?

因为这个问题。我看到来自同一设备的事件来自两个不同的IP。我尝试将IPv4转换为IPv6。但是它们是两个不同的IP(不是同一IP的两个不同表示)。

javascript analytics ipv6 x-forwarded-for segment-analytics

5
推荐指数
0
解决办法
102
查看次数