diff --git a/cdn-anycast.dot b/cdn-anycast.dot new file mode 100644 index 0000000..1c8d92b --- /dev/null +++ b/cdn-anycast.dot @@ -0,0 +1,44 @@ +digraph G { + node [ shape=box ] + rankdir=LR; + + label="Anycasting\nAll locations announce same IPs\nRouting based traffic shaping" + + internet [ label="The internet" shape=oval ] + internet->upstreamrouter1 [ label="Forward traffic for A.B.C.D/24" ] + internet->upstreamrouter2 [ label="Forward traffic for A.B.C.D/24" ] + internet->upstreamrouter3 [ label="Forward traffic for A.B.C.D/24" ] + + subgraph cluster_pop1 { + label="PoP 1" + router1 [ label="Our router" ]; + upstreamrouter1 [ label="Upstream router" ]; + router1->upstreamrouter1 [ label="Announces A.B.C.D/24" ] + } + clients1 [ label="Client set 1" ] + clients1->internet [ label="Access via Internet" ] + clients1->router1 [ label="Using PoP 1\nGeographic location not guaranteed to be nearest" style=dashed ] + + subgraph cluster_pop2 { + label="PoP 2" + router2 [ label="Our router" ]; + upstreamrouter2 [ label="Upstream router" ]; + router2->upstreamrouter2 [ label="Announces A.B.C.D/24" ] + } + clients2 [ label="Client set 2" ] + clients2->internet [ label="Access via Internet" ] + clients2->router2 [ label="Using PoP 2\nGeographic location not guaranteed to be nearest" style=dashed ] + + subgraph cluster_pop3 { + label="PoP 3" + router3 [ label="Our router" ]; + upstreamrouter3 [ label="Upstream router" ]; + router3->upstreamrouter3 [ label="Announces A.B.C.D/24" ] + } + clients3 [ label="Client set 3" ] + clients3->internet [ label="Access via Internet" ] + clients3->router3 [ label="Using PoP 3\nGeographic location not guaranteed to be nearest" style=dashed ] + + + +} diff --git a/cdn-geodns.dot b/cdn-geodns.dot new file mode 100644 index 0000000..0533dca --- /dev/null +++ b/cdn-geodns.dot @@ -0,0 +1,44 @@ +digraph G { + node [ shape=box ] + rankdir=LR; + + label="GeoDNS\nAnswering DNS based on Source IP of the clients\nUsually different IPs per Pop" + + geodns [ label="DNS server with GeoDNS policies enabled" shape=oval ] + + subgraph cluster_pop1 { + label="Pop 1" + router1 [ label="Our router" ]; + upstreamrouter1 [ label="Upstream router" ]; + router1->upstreamrouter1 [ label="Announces A.B.1.D/24" ] + } + clients1 [ label="Client set 1" ] + clients1->geodns [ label="Q: Where is domain example.com?" ] + geodns->clients1 [ label="A: On an IP of Pop 1" ] + clients1->router1 [ label="Using Pop 1 via pop specific IPs" ] + + subgraph cluster_pop2 { + label="Pop 2" + router2 [ label="Our router" ]; + upstreamrouter2 [ label="Upstream router" ]; + router2->upstreamrouter2 [ label="Announces A.B.2.D/24" ] + } + clients2 [ label="Client set 2" ] + clients2->geodns [ label="Q: Where is domain example.com?" ] + geodns->clients2 [ label="A: On an IP of Pop 2" ] + clients2->router2 [ label="Using Pop 2 via pop specific IPs" ] + + subgraph cluster_pop3 { + label="Pop 3" + router3 [ label="Our router" ]; + upstreamrouter3 [ label="Upstream router" ]; + router3->upstreamrouter3 [ label="Announces A.B.3.D/24" ] + } + clients3 [ label="Client set 3" ] + clients3->geodns [ label="Q: Where is domain example.com?" ] + geodns->clients3 [ label="A: On an IP of Pop 3" ] + clients3->router3 [ label="Using Pop 3 via pop specific IPs" ] + + + +} diff --git a/cdn-geoip.dot b/cdn-geoip.dot new file mode 100644 index 0000000..6db8065 --- /dev/null +++ b/cdn-geoip.dot @@ -0,0 +1,31 @@ +digraph G { + node [ shape=box ] + rankdir=LR; + + label="GeoIP\nThe CDN decides what to do based on the source IP\nAn inside CDN decision" + + clients1 [ label="Client set 1" ] + clients1->edgenode1 [ label="Access content served by CDN" ] + clients2 [ label="Client set 2" ] + clients2->edgenode2 [ label="Access content served by CDN" ] + clients3 [ label="Client set 3" ] + clients3->edgenode3 [ label="Access content served by CDN" ] + + subgraph cluster_pop1 { + label="Any Pop" + edgenode1 [ label="Edge Node" ] + rules1 [ label="Tenant/Domain specific rules" shape=oval ] + edgenode1->rules1 [ label="Q: What to do with IP of client set 1?" ] + rules1->edgenode1 [ label="A: (f.i.) Display \"Not available in this country\"" ] + + edgenode2 [ label="Edge Node" ] + edgenode2->rules1 [ label="Q: What to do with IP of client set 2?" ] + rules1->edgenode2 [ label="A: (f.i.) Display \"Server from a particular origin\"" ] + + edgenode3 [ label="Edge Node" ] + edgenode3->rules1 [ label="Q: What to do with IP of client set 3?" ] + rules1->edgenode3 [ label="A: (f.i.) Display \"Server content as usual\"" ] + + } + +}