最近学习了一些p2p的知识,这里做一些笔记。p2p首先要区分网络类型,不同的网络类型有不同的打洞的方式。
1、完全锥形
所谓的完全锥形其实表达得很形象,就是内网机器在局域网内打了一个洞,然后通过这个洞与外网通信。内网机器将数据发到网关时,路由器自动替换掉数据包中的源ip和源端口。并且将这个替换记录下来,记录在 一个表格中。
对外端口 | 源ip | 源端口 |
8080 | xxxx.xxxx.xxxx.xxxx | xxxx |
这样,在外网发送数据到外网ip的对外端口时,就能够根据之前转发出去的表,查找出这个数据包应该发送到哪台机器的哪个端口。
这里发现,只要知道了 内网机器某个进程在网中的ip和端口,任意一台机器都可以和这台机器通信。
2.对称nat
对称nat会为内网机器的每个网络进程分配一个地址 与端口,如果有多张对外的网卡的话是可以分配不同的ip地址的。也就是说,每次内网机器往外发送数据都可能使用不同的ip地址或者是端口,那么里面应该是会记录这样的一张表。
对外ip | 对外端口 | 内网ip | 内网端口 |
xxxx.xxxx.xxxx.xxxx | xxxx | yyyy.yyyy.yyyy.yyyy | yyyy |
这样根据这张表格,就能够记录下来发送包出去的路径,这样如果有回应包的话,也能根据这张表找到回包要发送到哪台内网机器上。
在处理回应包的时候,路由器还可能会对回应包的ip端口作检查,查看这个包是不是自己的应答包。
3.限制锥形
这个完全锥形的区别在路由器于会对回包做检查,只有是发送包的目标机器回应的包才能被转发给内网机器。那么在路由中应该有这样的记录
源ip | 源端口 | 目标ip |
xxxx.xxxx.xxxx.xxxx | xxxx | yyyy.yyyy.yyyy.yyyy |
这种情况下,即使知道了内网机器在公网中暴露的ip端口,也只有先收到该机器的包之后才能正常给该机器发包,不然的话包会被路由器丢弃。
4.端口限制锥形nat
这个与限制锥形nat的区别在于即使是同一台机器对内网机器发送回应数据包,也只有通过同一端口发送的数据包才能被路由器转发。