<返回更多

IPv6学习笔记

2019-10-28    
加入收藏
IPv6学习笔记

 

IPv6协议

IPv6学习笔记

 

整体来看,IPv6协议相比IPv4, 格式上简洁很多:

IPv6的地址语法

IPv6学习笔记

 

一个IPv6的地址使用冒号十六进制表示方法:128位的地址每16位分成一段,每个16位的段用十六进制表示并用冒号分隔开,例如一个普通公网IPv6地址:

2001:0D12:0000:0000:02AA:0987:FE29:9871

IPv6地址支持压缩前导零的表示方法,例如上面的地址可以压缩表示为:

2001:12:0:0:2AA:987:FE29:9871

为了进一步精简IPv6地址,当冒号十六进制格式中出现连续几段数值0的位段时,这些段可以压缩为双冒号的表示,例如上面的地址还可以进一步精简表示为:

2001:12::2AA:987:FE29:9871

又例如IPv6的地址FF80:0:0:0:FF:3BA:891:67C2可以进一步精简表示为:

FE80::FF:3BA:891:67C2

这里值得注意的是:双冒号只能出现一次。

IPv6地址前缀表示法

IPv6支持子网前缀标识方法,类似于IPv4的无分类域间路由CIDR机制(注意:IPv6没有子网掩码mask的概念)。

使用IPv6地址/前缀长度表示方法,例如:

2001:C3:0:2C6A::/64表示一个子网;

而2001:C3:0:2C6A:C9B4:FF12:48BC:1A22/64表示该子网下的一个节点地址。

IPv6寻址模式

IPv6没有广播地址,用组播地址实现广播的功能。

IPv6单播地址

面向IPv6的应用开发

Golang服务端

package main
import (
	"fmt"
	"net"
	"net/http"
)
func main() {
	var err error
	http.Handle("/", &helloHandler{})
	// 监听本地IPv4地址的8083端口
	// err = http.ListenAndServe(":8083", nil)
	// 监听指定IPv6地址的8083端口
	// err = http.ListenAndServe("[2604:180:3:dd3::276e]:8083", nil)
	// 同时监听本地IPv4和IPv6地址的8083端口
	err = ListenAndServe(":8083", nil)
	if err != nil { 		
 fmt.Println(err)
	}
}

Curl客户端

curl "http://[2604:180:3:dd3::276e]:8083"
curl -g -6 'http://[2604:180:3:dd3::276e]:8083/'

Python UDP服务端:

import socket
UDP_IP = "::" # = IPv4 0.0.0.0
UDP_PORT = 5005
sock = socket.socket(socket.AF_INET6, # Internet
						socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
while True:
	data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
	print "received message:", data

Python UDP客户端:

import socket
UDP_IP = "::1" # localhost
UDP_PORT = 5005
MESSAGE = "Hello, World!"
print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE
sock = socket.socket(socket.AF_INET6, # Internet
					socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>