Commit dda8dbff authored by 神楽坂玲奈's avatar 神楽坂玲奈

init

parents
/.idea/
\ No newline at end of file
dgram = require 'dgram'
assert = require 'assert'
http = require 'http'
server_port = 495
timeout = 10
regions = [
{id: 0, name: "default"},
{id: 1, name: "ap"},
{id: 2, name: "cn"}
]
gateways = {
2: {
2: {server_id: 2, region_id: 2, delay: 0, jitter: 0, reliability: 1}
},
3: {
0: {server_id: 3, region_id: 0, delay: 0.1, jitter: 0, reliability: 1},
1: {server_id: 3, region_id: 1, delay: 0, jitter: 0, reliability: 1}
},
4: {
0: {server_id: 4, region_id: 0, delay: 0, jitter: 0, reliability: 1}
},
6: {
2: {server_id: 6, region_id: 2, delay: 0, jitter: 0, reliability: 1}
},
7: {
0: {server_id: 7, region_id: 0, delay: 0.1, jitter: 0, reliability: 1},
1: {server_id: 7, region_id: 1, delay: 0, jitter: 0, reliability: 1}
}
}
servers = {
2: {id: 2, inbound_cost: 0, outbound_cost: 0.8},
3: {id: 3, inbound_cost: 0, outbound_cost: 0.05},
4: {id: 4, inbound_cost: 0, outbound_cost: 0.03},
6: {id: 6, inbound_cost: 0, outbound_cost: 0.8},
7: {id: 7, inbound_cost: 0, outbound_cost: 1},
}
sequence = 0
updating = null
timeout_timer = null
socket = dgram.createSocket('udp4')
caculate_metric = (delay, jitter, reliability, cost)->
assert(jitter >= 0)
assert(0 <= reliability <= 1, "reliability: #{reliability}")
assert(cost >= 0)
delay + (1 - reliability) * 6 + cost * 0.1
route_metric = (server_id, from, to, next_hop)->
#console.log "route_metric(#{server_id}, #{from}, #{to}, #{next_hop})"
# delay 由于涉及时差问题,对内、对外、补偿权重必须是一致的。
# 其他几个变量对内、对外权重可以不一致。
delay = 0
internal_reliability = 1
internal_jitter = 0
internal_cost = 0
external_reliability = 1
external_jitter = 0
external_cost = 0
current = server_id
next = next_hop
route = [current, next]
# 正向路由
while true
if next == 0 # from server_id to region_id 型路由到达出口
assert(from != 0)
quality = gateways[current][to]
return Number.POSITIVE_INFINITY if !quality or quality.reliability <= 0 # 网络不通,视为黑洞
#console.log '-gateway-', current, to, quality
delay += quality.delay
external_reliability *= Math.sqrt(quality.reliability)
external_jitter += quality.jitter / 2
external_cost += servers[current].outbound_cost
internal_reliability *= Math.sqrt(quality.reliability)
internal_jitter += quality.jitter / 2
internal_cost += servers[current].inbound_cost
if current == from # 出口直达
return caculate_metric(delay, internal_jitter + external_jitter, internal_reliability * external_reliability, internal_cost + external_cost)
next = servers[current].routes[0][from]
route = [current, next]
while true # 计算返程路线
# 计算网络质量
quality = servers[next].quality[current]
return Number.POSITIVE_INFINITY if !quality or quality.reliability <= 0 # 网络不通,视为黑洞
#console.log '-2-', current, next, quality
delay += quality.delay
internal_jitter += quality.jitter
internal_reliability *= quality.reliability
internal_cost += servers[current].outbound_cost + servers[next].inbound_cost
# 寻找下一跳
if next == from # 往返路径结束
return caculate_metric(delay, internal_jitter + external_jitter, internal_reliability * external_reliability, internal_cost + external_cost)
else
current = next
next = servers[current].routes[0][from]
assert(next?) # 返程的目标是server,相当于 from all to server_id 型路由,由于 server 两两相连,下一跳一定是存在的,最坏情况也是直达
if next in route # 环路
return Number.POSITIVE_INFINITY
else
route.push next
else
# 计算网络质量
quality = servers[next].quality[current]
return Number.POSITIVE_INFINITY if !quality or quality.reliability <= 0 # 网络不通,视为黑洞
#console.log '-3-', current, next, quality
delay += quality.delay
if from == 0 # 对内
internal_reliability *= quality.reliability
internal_jitter += quality.jitter
internal_cost += servers[current].outbound_cost + servers[next].inbound_cost
if next == to
return caculate_metric(delay, internal_jitter + external_jitter, internal_reliability * external_reliability, internal_cost + external_cost)
else
external_reliability *= quality.reliability
external_jitter += quality.jitter
external_cost += servers[current].outbound_cost + servers[next].inbound_cost
# 寻找下一跳
current = next
next = servers[current].routes[from][to]
if next?
if next in route # 环路
return Number.POSITIVE_INFINITY
else
route.push next
else
assert(from != 0) # from all to server_id 型路由,由于 server 两两相连,下一跳一定是存在的,最坏情况也是直达
return Number.POSITIVE_INFINITY # 对于from server_id to region 型路由,如果下一跳不存在,意味着出口没有已知路线可达,是黑洞
# 返程 (下行) 路由
#console.log '-2-', next
update_route = (server, from, to)->
current_next_hop = server.routes[from][to]
# 计算当前路线
if current_next_hop?
current_metric = route_metric(server.id, from, to, current_next_hop)
else
assert(from != 0) # from all to server_id 型路由,由于 server 两两相连,下一跳一定是存在的,最坏情况也是直达
current_metric = Number.POSITIVE_INFINITY # 对于from server_id to region 型路由,如果下一跳不存在,意味着出口没有已知路线可达,是黑洞
# 计算更优路线
best_next_hop = current_next_hop
best_metric = current_metric
for index, next_hop_server of servers when next_hop_server.id != current_next_hop and next_hop_server != server and next_hop_server.id != from
#console.log parseInt(next_hop), server.id
#console.log next_hop,current_next_hop
metric = route_metric(server.id, from, to, next_hop_server.id)
if metric < best_metric
best_next_hop = next_hop_server.id
best_metric = metric
if from != 0
metric = route_metric(server.id, from, to, 0)
if metric < best_metric
best_next_hop = 0
best_metric = metric
now = new Date().getTime() / 1000
if current_next_hop != best_next_hop and (current_metric is Number.POSITIVE_INFINITY or (current_metric - best_metric - 0.01) * (now - server.updated_at[from][to]) > 10)
console.log "update ##{sequence}: server#{server.id} from #{from} to #{to} next hop #{current_next_hop}(#{current_metric}) -> #{best_next_hop}(#{best_metric})"
server.routes[from][to] = best_next_hop
server.updated_at[from][to] = now
updating = setInterval ->
send_route(server, from, to, best_next_hop)
, 1000
send_route(server, from, to, best_next_hop)
timeout_timer = setTimeout ->
delete server.address
delete server.port
clearInterval(updating)
updating = null
console.log "server#{server.id} lost connection."
, timeout * 1000
return true
false
send_route = (server, from, to, next_hop)->
message = {sequence: sequence, from: from, to: to, next_hop: next_hop}
if server == from
gateway = server
while next_hop != 0
gateway = next_hop
next_hop = servers[gateway].routes[from][to]
message.gateway = gateway
message = JSON.stringify message
socket.send message, 0, message.length, server.port, server.address
reset_route = (server)->
now = new Date().getTime() / 1000
server.quality = {}
# 目标地址是 server 的 from all to server_id 型路由, routes[0][server_id], 对于直连目标节点的,next_hop = server_id
# 目标地址是 region 的 from server_id to region_id 型路由, routes[server_id][region_id], 对于直连出口的,next_hop = 0
server.routes = {}
server.updated_at = {}
server.routes[0] = {}
server.updated_at[0] = {}
for i,s of servers
server.routes[0][i] = parseInt(i)
server.updated_at[0][i] = now
server.routes[i] = {}
server.updated_at[i] = {}
for region_id, region of regions when gateways[server.id]? and gateways[server.id][region_id]?
server.routes[i][region_id] = 0
server.updated_at[i][region_id] = now
socket.on 'message', (message, rinfo) ->
message = JSON.parse(message)
#console.log message
server = servers[message.server_id]
return unless server?
if server.address != rinfo.address or server.port != rinfo.port # 重置 server 状态
server.address = rinfo.address
server.port = rinfo.port
console.log "server #{server.id} connected from #{server.address}:#{server.port}"
reset_route(server)
server.quality = message.quality
#console.log updating
if updating? and message.acknowledgement == sequence
#console.log "ack ##{sequence}: server#{server.id}"
clearInterval(updating)
clearTimeout(timeout_timer)
updating = null
sequence += 1
if !updating?
for server_id, server of servers when server.address?
for to of servers when to != server_id
return if update_route(server, 0, parseInt(to))
for from of servers
for region in regions
return if update_route(server, parseInt(from), region.id)
for server_id, server of servers
reset_route(server)
socket.bind server_port
http.createServer (req, res)->
res.writeHead 200, 'Content-Type': 'application/json'
res.end JSON.stringify(servers)
.listen server_port
\ No newline at end of file
This diff is collapsed.
{
"version": 3,
"file": "main.js",
"sourceRoot": "",
"sources": [
"main.coffee"
],
"names": [],
"mappings": "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"
}
\ No newline at end of file
{
"name": "application-name",
"version": "0.0.1"
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment