玩一玩Rawsocket

玩一玩Rawsocket

ip包与icmp包之间的关系图

什么是rawsocket

我们一般做应用编程的时候其实关注的socket是udpsocket或者是tcpsocket,也就是协议层的东西是确定的

但是rawsocket不是,他可以让你自定义协议层的内容,比如自己顶一个YCPSocket,只要不被路由器丢弃就可以被对方机器接受

操作rawsocket的好玩的事情

因为能够操作到协议层,就能做一些有意思的事情,比如可以探测出从本机到(任意)IP间经过路由器的ip地址,或者是做ICMP攻击用

如何做

比如我可以指定ip包的ttl,使得经过特定次数路由器后包被丢弃,同时丢弃的路由器返回ICMPv4TypeTimeOut的响应,此时就可以获取到RemoteAddr,逐次记录Ip直到返回ICMPv4TypeEchoReply,此时就可以获取到指定IP的完整链路

如果是攻击行为只要将IP协议中的src更改成一个特定地址,则可以是的特定地址的服务器被DDoS攻击

Golang相关

因为要操作的层级很低,这个时候需要有些过程式的说明,

首先要创建RawSocket需要理解,我们其实是要直接向硬件写自己构造的数据,那么在描述的时候这个过程如下

获取操作硬件的指针/句柄/文件地址

将其指针赋予RawSocket,并指定每次操作socket时候写包的参数

创建好socket后就可以直接写我们创建的二进制数据了

自用动态dns(Server/Client)

断断续续的做了一个月(主要是懒)

完成了

Server负责接受并返回Client的公网IP

Client负责定时轮询Server并在IP更新至阿里的DNS服务器

Client

Sever

在client和Sever,go build main.go

client的启动参数分别为 accessKey accessId severAccessKey severIP:port

server启动参数为

severAccessKey

下一步将domain和RR放在配置文件中

如何写socket通信

为了抛弃花生壳就自己写了个动态IP发现动态IP发现

不同于应用层,在Socket需要自己封装自己的协议,要自己决定如何传输数据

因为在整个网络的层次比较中间的位置,能给予开发者很大的灵活性

比如:

我需要用socket维持一个心跳链接

我的数据封装为如下格式

type lease struct{
  lenght int
  content []byte
}

lenght代表整个传输的长度,可以用于校验传输正确性

content就是整个需要传输的心跳内容

有时候需要更多的校验可以在lease的前后添加不同的结束符或者连接符,用于处理粘包等状态

相比较于Http层协议socket比较不爽的在于会造成业务和发送的逻辑交织

多态的实现优劣/Go/Java

Go:从语法层面不是一个完备的OO语言,其实现多态用了类似this指针的做法,模拟了OO

Java:完备的OO语法,类是一等公民(java8之后default开始略扭转了趋势)

 

差异:因为OO的完备性需要包含对象与对象之间的关系,所以在JAVA编程中经常蛋疼在对象多态的海洋中(C++更惨)

Go把类之间的关系简化了,只有关系,没有所谓的继承.抛弃了需要大量思考压力的继承体系,Go中的面向对象编程实质上得到了简化(代码上没有…其实完备的OOP在设计上就必须关注…只不过写成代码之后只需要关注是否有关系就好了)

修改:

1.知乎上看到一个观点说的挺不错的,多态等是为了解决归一性,通过归一性来应对可能的修改,也就是抽象

用Golang实现OO编程

package simpleBlog

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
)

type BlogOperations interface {
	Persistence()
	Delete()
}
type Blog struct {
	Author  string
	Header  string
	Content string
}

func (blog *Blog) Persistence() {
	result, err := DB.Exec("INSERT INTO blog.blog (author, header, content)VALUES (?,?,?)", blog.Author, blog.Header, blog.Content)
	if nil != err {
		fmt.Println(result, err)
	}
	fmt.Println("persistence", blog)
}
func (blog *Blog) Delete() {
	DB.Exec("DELETE FROM blog.blog WHERE header=?", blog.Header)
	fmt.Println("delete", blog)
}

OO三要素:类=数据+方法

后来想想C也能实现OO编程

只要相应的函数传入一个struct的指针….

后来又想想…Python不就是这么实现的么…有一个内置的this指针(虽然觉得是奇技淫巧…)

这么看来C也能实现OO编程,技巧在于传入一个隐式指针指向一个数据结构

那么再回想一下OO三要素,类=数据+方法

也就是通过this/struct指针来实现数据和方法的关联

Golang.Sort

package main

import "fmt"

func main() {
	var nums = [] int{5, 4, 3, 2, 1, 4, 5, 3}
	sort(nums, len(nums))
	fmt.Println(nums)
}
func sort(nums []int, length int) {
	for i := 0; i < length; i++ {
		for j := 0; j < length; j++ {
			if (nums[i] > nums[j]) {
				swap(&nums[i], &nums[j])
			}
		}
	}
}
func swap(a *int, b *int) {
	*a, *b = *b, *a
}

 

Golang/HelloWorld

就是简单的输出一些字符串,用以学习Go的package和实际的path的关系

package main

import (
	"fmt"
	"HelloWorld/heelo"
)

func main() {
	p()
}
func p() {
	fmt.Println("Hello", "HelloTat")
	heelo.Hehe()
}
package heelo

import "fmt"

func Hehe() {
	fmt.Println("this is Hello2")
}