ipv6路由器存储多个路由作为n地址的第一位.2000年,研究人员在1500条ipv6路线中发现只有14种不同的前缀长度.传入数据包根据最长前缀匹配路由到不同的传出端口,因此如果数据包x的前8位与8位路由匹配,但同一数据包的前48位与48位路由匹配,则路由器必须选择48位路线.
我的路由器正在处理如此多的数据包,因此查找路由表的内存速度是一个限制因素.在路由表中找到最长匹配前缀的好算法是什么?
我正在尝试理解选择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进行多播时设置这些位,我应该遇到什么问题?
我正在开发一个接收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) 问题是,如果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人.
我正在尝试使用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) 我有一个使用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) 我有很多项目,依靠提供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范围匹配.
注意:我不想删除下面的任何历史记录,但我之前认为这是一个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) 我正在尝试在具有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.
我错过了什么吗?
我有一台同时具有IPv4和IPv6地址的设备。在我的rails应用程序中,请求通过Cloudflare发出,并且从中提取的IP地址X-Forwarded-For是IPv6地址。但是,当我从JS客户端发送跟踪事件时,默认情况下它使用IPv4。有什么方法可以使JS客户端使用IPv6而不是IPv4?
因为这个问题。我看到来自同一设备的事件来自两个不同的IP。我尝试将IPv4转换为IPv6。但是它们是两个不同的IP(不是同一IP的两个不同表示)。