浅析 P2P 穿越 NAT 的原理、技术、方法 (上)

在介绍P2P穿越NAT的原理、技术、方法前,我们先来看看几个背景知识:

1. NAT和NAPT

网络地址转换(NAT,Network Address Translation),早期的NAT指的是Basic NAT(静态NAT),它在技术上比较简单一点,仅支持地址转换,不支持端口映射,这就需要对每一个当前连接都要对应一个IP地址,因此要维护一个公网的地址池。我们可以看出,Basic NAT一个比较明显的缺陷就是:同一时刻只能少量位于NAT后面的机器能够和外部交互(要看NAT有几个外网IP)。后期的NAT基本都指的是NAPT(网络地址端口转换)了,这种方式支持端口的映射并允许多台主机共享一个公用IP地址,这样就可以支持同时多个位于NAT后面的机器和外部进行交互了。支持端口转换的NAT又可以分为两类:源地址转换(SNAT)和目的地址转换NAT(DNAT)。下面说的NAT都是指NAPT。

2. NAT带来的问题

NAT在缓解IPv4地址资源的紧张的同时,也带来了不少问题:

[1] NAT使IP会话的保持时效变短。
[2] NAT在实现上将多个内部主机发出的连接复用到一个IP上,这就使依赖IP进行主机跟踪的机制都失效了
[3] NAT工作机制依赖于修改IP包头的信息,这会妨碍一些安全协议的工作
[4] NAT限制了使用一些高层协议(FTP、Quake、SIP)的Peer两端的P2P通信

对于问题1,其主要原因是,NAT设备建立的内网IP、端口到外网IP、端口的映射的表项是有一个保活期的。如果在一个超时时间内,该映射上没有实际数据的传输,那么NAT会过期并回收这个映射表项给其他通信链路用(IP和端口资源有限,通信的链路是无限)。为了避免这种通信链路提前被NAT中断的情况,很多应用层协议在设计的时候就考虑了一个连接保活的机制,即在一段时间没有数据需要发送时,主动发送一个NAT能感知到而又没有实际数据的保活消息,这么做的主要目的就是重置NAT的会话定时器。

对于问题2,其主要原因是,对于NAT后面的N多主机,在外部看来都是同一个主机(NAT设备),于是来之同一个IP的数据包一定是来之同一个主机的前提判断就会不准确了,这样一下基于这个前提的机制(例如:TCP的TIME_WAIT的回收和重用)都会有问题。

对于问题3,其主要原因是,NAT篡改了IP地址、传输层端口号和校验和。

对于问题4,其主要原因是,一般情况下,NAT是不允许外部的Peer节点主动连接或发送数据包给NAT后面的主机的(这里的主动指的是,在一段时间内,首先发送数据包的一方为主动方)。NAT表现出这样的行为,主要基于下面的几点考虑:

[1] 出于安全考虑,避免来自网络外部的攻击,隐藏并保护网络内部的计算机
[2] 位于NAT后面的很多主机,对于主动进来的数据包,NAT一般不知道该路由给内部的哪个主机(NAT设备上没有相关转发表项)。

由于NAT这种特性,那么在NAT环境下,实现P2P通信的完整解决方案包括几个部分呢?相关的原理、方法、技术有哪些?对于一个完整的P2P通信解决方案,其实现包括下面两个步骤:

[1] 首先在Server的协助下,通信两端Peer尝试相互连接,如果两端Peer在尝试互联不成功后,那么就将失败结果反馈给Server转入步骤[2]
[2] 这个步骤比较简单粗暴了,就是relay(服务器中转),简单的来讲就是Peer1将要发给Peer2的数据发给Server,然后由Server帮忙转发给Peer2,同样对于Peer2来说也一样。

对于实现P2P通信,步骤1是大家下功夫最多的,其原因比较简单,就是步骤2需要消耗较多的服务器资源,成本比较高。步骤1实现P2P两个节点间的直接通信,在资源消耗和效率上都是比较好的。

3. P2P通信穿越NAT的技术、方法

目前常见的P2P通信穿越NAT的技术、方法主要有:

[1] 应用层网关
[2] 中间件技术
[3] 打洞技术(Hole Punching)
[4] Relay(服务器中转)技术

3.1 应用层网关

应用层网关(ALG)是解决NAT对应用层协议无感知的一个最常用方法,已经被NAT设备厂商广泛采用,成为NAT设备的一个必需功能。

3.1.1 原理

利用带有ALG功能的NAT对特定应用层协议的支持和理解,在一个NAT网关检测到新的连接请求时,需要判断是否为已知的应用类型,这通常是基于连接的传输层端口信息来识别的。在识别为已知应用时,再调用相应功能对报文的深层内容进行检查,当发现任何形式表达的IP地址和端口时,将会把这些信息同步转换,并且为这个新连接创建一个附加的转换表项。这样,当报文到达公网侧的目的主机时,应用层协议中携带的信息就是NAT网关提供的地址和端口。例如:下图,对于使用主动模式的FTP协议(PORT方式),就需要AGL的支持了。

由于FTP协议通信需要两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。如上图,位于NAT后面的FTP client(192.168.1.2)首先发起一个TCP连接(命令链路)连上外网FTP Server(8.8.8.1),然后发送PORT报文(192.168.1.2,1084)说自己在1084端口接收数据,然后进过ALG处理PORT报文变成(8.8.8.1,12487),同NAT建立其一条(192.168.1.2,1084 <—>8.8.8.1,12487)映射。这样FTP Server发往(8.8.8.1,12487)的数据就会被转到(192.168.1.2,1084),从而实现数据传输(如果没经过ALG处理,那么FTP Server直接连接192.168.1.2,1084是无法连接上的)。

3.1.2 限制

ALG技术是利用NAT本身的支持来进行NAT的穿越,这个方案有很大限制,主要的原因是ALG都是为特定协议的特定规范版本而开发的,然而不管是协议本身,还是协议的数量都在变化,这就使得ALG适应性不强。

3.2 中间件技术

这是一种通过开发通用方法解决NAT穿越问题的努力。与前者不同之处是,AGL技术中NAT网关是这一解决方案的唯一参与者,而中间件技术中客户端会参与网关公网映射信息的维护。UPnP就是这样一种方法,UPnP中文全称为通用即插即用,是一个通用的网络终端与网关的通信协议,具备信息发布和管理控制的能力。

3.2.1 原理

NAT只要理解客户端的请求并按照要求去分配响应的映射转换表,不需要自己去分析客户端的应用层数据。网关映射请求可以为客户动态添加映射表项。此时,NAT不再需要理解应用层携带的信息,只转换IP地址和端口信息。而客户端通过控制消息或信令发到公网侧的信息中,直接携带公网映射的IP地址和端口,接收端可以按照此信息建立数据连接。NAT网关在收到数据或连接请求时,按照UPnP建立的表项只转换地址和端口信息,不关心内容,再将数据转发到内网。

3.2.2 限制

这种方案需要网关、内部主机和应用程序都支持UPnP技术,且组网允许内部主机和NAT网关之间可以直接交换UPnP信令才能实施。

3.3 打洞技术(Hole Punching)

Hole Punching技术是工作在运输层的技术,可以屏蔽上层应用层的差异,并且不需要NAT网关特定的支持,因此其通用性比较强,应用性也比较广。

3.3.1 原理

打洞技术的原理比较简单,就是NAT内网的节点需要在NAT上建立自己的一条转发映射关系(这就是所谓的在NAT上打下一个洞),然后外网的节点就通过这个”洞”来进行通信。为描述方便,我们将一对IP地址和端口信息的组合称之为一个Endpoint,打洞原理可以简化为下面三个过程:

[1] 首先位于NAT后的Peer1节点需要向外发送数据包,以便让NAT建立起内网Endpoint1(IP1、PORT1)和外网Endpoint2(IP2、PORT2)的映射关系;
[2] 然后通过某种方式将映射后的外网Endpoint2通知给对端节点Peer2;
[3] 最后Peer2往收到的外网Endpoint2发送数据包,然后该数据包就会被NAT转发给内网的Peer1

上面三个过程比较简单,然而细心的同学会有些疑问:

(1)步骤[1]中的映射关系的建立有什么规律的么?怎样才能获取到映射关系呢?
(2)通知对端节点Peer2的方式一般是怎么样的?
(3)步骤[3]一定可以实现么?也就是Peer2往收到的外网Endpoint2发送数据包,就一定能够被NAT转发给内网的Peer1吗?

对于疑问(3),如果全部会被转发给内网Peer1,那会不会太不安全了,只要知道内网Peer1的映射后的外网Endpoint2,就可以给穿透NAT给内网Peer1发送数据,这样内网Peer1不就很容易遭到攻击了?如果全部都不转发给内网Peer1,这样Peer1只能向外发数据,而无法收到外面的数据,严重影响Peer1的正常通信。那么,这就比较明了了,我们需要的是一部分可以转发,另外一部分不转发。这就涉及到NAT对外来数据包的一个过滤规则了,而疑问(1)提到的映射关系建立的规则,这涉及到NAT的Endpoint的映射规则。那么问题来了,有什么方法可以知道NAT的Endpoint映射规则和对外来数据包的过滤规则呢?

3.3.2 方法

由上面原理的讨论我们知道,要实现打洞穿越NAT,首先需要知道NAT的行为规则(NAT的Endpoint映射规则和对外来数据包的过滤规则),这样才能更好地实现打洞穿越。那NAT有哪些行为类型?有什么办法来侦测NAT的行为呢?

3.3.2.1 NAT行为类型与侦测方法

NAT的行为类型和侦测方法是由STUN(首先在RFC3489中定义,英文全称是Simple Traversal of UDP Through NATs)协议来描述的,STUN协议包括了RFC3489、RFC5389、RFC5780、RFC5769几个系列文档。早期的STUN协议是由RFC3489(经典的STUN)来描述,其定义的NAT行为类型如下:

[1] Full Cone NAT - 完全锥形NAT
所有从同一个内网IP和端口号Endpoint1发送过来的请求都会被映射成同一个外网IP和端口号Endpoint2,并且任何一个外网主机都可以通过这个映射的Endpoint2向这台内网主机发送包。也就是外网所有发往Endpoint2的数据包都会被NAT转发给Endpoint1。由于对外部请求的来源无任何限制,因此这种方式虽然足够简单,但却不安全。

[2] Restricted Cone NAT - 限制锥形NAT
它是Full Cone的受限版本:所有来自同一个内网Endpoint1的请求均被NAT映射成同一个外网Endpoint2,这与Full Cone相同。但不同的是,只有当内网Endpoint1曾经发送过报文给外部主机(假设其IP地址为IP3)后,外部主机IP3发往Endpoint2的数据包才会被NAT转发给Endpoint1。这意味着,NAT设备只向内转发那些来自于当前已知的外部主机的数据包,从而保障了外部请求来源的安全性

[3] Port Restricted Cone NAT - 端口限制锥形NAT
它是Restricted Cone NAT的进一步受限版,与限制锥形NAT很相似,只不过它包括端口号PORT。只有当内网Endpoint1曾经发送过报文给外部Endpoint3(包括IP和端口了),Endpoint3发往Endpoint2的数据包才会被NAT转发给Endpoint1。端口号PORT这一要求进一步强化了对外部报文请求来源的限制,从而较Restrictd Cone更具安全性。

[4] Symmetric NAT - 对称NAT
上面的[1][2][3]所有的Cone NAT中,映射关系只和内网的源Endpoint1相关,只要源Endpoint1不变其都会被映射成同一个Endpoint2。而对称NAT的映射关系不只与源Endpoint1相关,还与目的Endpoint3相关。也就是源Endpoint1发往目的Endpoint30的请求被映射为Endpoint20,而源Endpoint1发往目的Endpoint31的请求,则被映射为Endpoint21了。此外,只有收到过内网主机发送的数据的外网主机才可以反过来向内网主机发送数据包。

经典 STUN 定义的 NAT 行为类型是将NAT的Mapping Behavior (映射规则)和Filtering Behavior(过滤规则)统一来归类的,这样对Symmetric NAT类型的归类过于笼统,使得许多 NAT 不完全符合由它定义的类型。于是后来,RFC3489被废弃并由RFC5389来替代,在RFC5389中,将Mapping Behavior (映射规则)和Filtering Behavior(过滤规则)分开来,定义了3种Mapping Behavior (映射规则)和3种Filtering Behavior(过滤规则),一共有9种组合。为什么是3种呢?其实理由很简单,对于一个特定的内网源Endpoint1,影响其映射关系的因素不外乎就4种情况:

[1] 目的IP和目的端口PORT都无关
[2] 目的IP和目的端口PORT都相关
[3] 仅仅目的IP相关
[4] 仅仅目的PORT相关

对于4仅仅考虑一下PORT信息有点鸡肋,基本和1差不多,于是把4去掉了。同样,对于过滤规则也一样。3种Mapping Behavior (映射规则)和 Filtering Behavior(过滤规则)如下:

Mapping Behavior:
[1] Endpoint-Independent Mapping
对于一个内网的EndpointP,其映射的外网EndpointG是基本固定的,不会随着通信外部主机的不同而变化。

[2] Address and Port-Dependent Mapping
对于一个内网的EndpointP,如果与之通信的外部为EndpointGB1,那么EndpointP就会被NAT映射成EndpointG1;如果与之通信的外部为EndpointGB2,那么EndpointP就会被NAT映射成EndpointG2。也就是只要之通信的外部为EndpointGB发生变化,那么映射的外网EndpointG就会变化。

[3] Address-Dependent Mapping
对于一个内网的EndpointP,如果与之通信的外部为EndpointGB1,那么EndpointP就会被NAT映射成EndpointG1;如果与之通信的外部为EndpointGB2(如果EndpointGB2的IP和EndpointGB1的相同),那么EndpointP同样会被NAT映射成EndpointG1,否则就会被NAT映射成EndpointG2。也就是只要之通信的外部为EndpointGB的IP发生变化,那么映射的外网EndpointG就会变化。

Filtering Behavior:
[1] Endpoint-Independent Filtering
对于这种过滤类型,NAT在在自己的一个外网EndpointG1收到数据包,只要找到与之对应的内网EndpointP1,NAT就会转发这个数据包给相应的内网EndpointP1,不管这个数据包的来源是那里。(一般来说,这样过滤规则的NAT是比较少的,因为这样的安全系数比较低)

[2] Address and Port-Dependent Filtering
对于这种过滤类型,NAT在自己的一个外网EndpointG1收到来源是EndpointGA1数据包,这个时候NAT要判断自己是否曾经通过自己的EndpointG1给EndpointGA1发送过数据包,如果曾经发过,那么NAT就允许该数据包通过NAT并路由给内网与之对于的内网EndpointP1;如果没发过,那么NAT会不允许该数据包通过NAT。

[3] Address-Dependent Filtering
对于这种过滤类型,NAT在自己的一个外网EndpointG1收到来源是EndpointGA1数据包,这个时候NAT要判断自己是否曾经通过自己的EndpointG1给和EndpointGA1的IP相同的机器发送过数据包(这里会忽略端口),如果曾经发过,那么NAT就允许该数据包通过NAT并路由给内网与之对于的内网EndpointP1;如果没发过,那么NAT会不允许该数据包通过NAT。

RFC5389只是定义了协议的相关属性、机制、报文结构以及一些相关的安全注意点等等,并有没对怎么进行完整的NAT类型侦测做介绍。而对完整NAT类型侦测过程主要由RFC5780这个文档来描述。完整的NAT类型侦测的过程主要在RFC5780文档的4.3和4.4节,主要分为NAT映射规则(Determining NAT Mapping Behavior)和NAT过滤规则(Determining NAT Filtering Behavior),下面对具体的侦测过程做介绍:

要进行NAT类型的侦测,需要一个具有双公网IP的服务器来协助侦测,我们称该服务器为STUN Server。假设STUN Server的双IP分别为IP_SA(125.227.152.3)和IP_SB(125.227.152.4) 监听的两个端口分别为PORT_SA(4777)和PORT_SB(4888),客户端A的内网和端口分别为IP_CA(10.70.142.12)和PORT_CA(1234)。

[1] 客户端A以IP_CA:PORT_CA给STUN Server的IP_SA:PORT_SA发送一个bind请求,STUN server以IP_SA:PORT_SA给客户端A的IP_CA:PORT_CA回复响应,响应内容大体为:(NAT映射后的IP地址和端口为:IP_MCA1:PORT_MCA1,STUN Server的另外一个IP地址和端口为:IP_SB:PORT_SB)。这个时候客户端判断,如果IP_CA:PORT_CA == IP_MCA1:PORT_MCA1,那么该客户端是拥有公网IP的,NAT类型侦测结束。

[2] 客户端A以IP_CA:PORT_CA给STUN server的IP_SB:PORT_SA(相对步骤1 ip改变了)发送一个bind请求,STUN server以IP_SB:PORT_SA给客户端A的IP_CA:PORT_CA回复响应,响应内容大体为:(NAT映射后的IP地址和端口为:IP_MCA2:PORT_MCA2)。这个时候客户端判断,如果IP_MCA1:PORT_MCA1 == IP_MCA2:PORT_MCA2,那么NAT是Endpoint Independent Mapping的映射规则,也就是同样的内网地址IP_CA:PORT_CA经过这种NAT映射后的IP_M:PORT_M是固定不变的;如果IP_MCA1:PORT_MCA1 != IP_MCA2:PORT_MCA2,那么就要进行下面的第3步测试。

[3] 客户端A以IP_CA:PORT_CA给STUN server的IP_SB:PORT_SB(相对步骤1 ip和port改变了)发送一个bind请求,STUN server以IP_SB:PORT_SB给客户端A的IP_CA:PORT_CA回复响应,响应内容大体为:(NAT映射后的IP地址和端口为:IP_MCA3:PORT_MCA3)。这个时候客户端判断,如果IP_MCA2:PORT_MCA2== IP_MCA3:PORT_MCA3,那么NAT是Address Dependent Mapping的映射规则,也就是只要是目的IP是相同的,那么同样的内网地址IP_CA:PORT_CA经过这种NAT映射后的IP_M:PORT_M是固定不变的;如果IP_MCA2:PORT_MCA2!= IP_MCA3:PORT_MCA3,那么NAT是Address and Port Dependent Mapping,只要目的IP和PORT中有一个不一样,那么同样的内网地址IP_CA:PORT_CA经过这种NAT映射后的IP_M:PORT_M是不一样的。

以上三个步骤是进行Mapping Behavior的侦测,下面两个步骤是进行Filtering Behavior侦测

[4] 客户端A以IP_CA:PORT_CA给STUN server的IP_SA:PORT_SA发送一个bind请求(请求中带CHANGE-REQUEST attribute来要求stun server改变IP和PORT来响应),STUN server以IP_SB:PORT_SB给客户端A的IP_CA:PORT_CA回复响应。如果客户端A能收到STUN server的响应,那么NAT是Endpoint-Independent Filtering的过滤规则,也就是只要给客户端A的IP_CA:PORT_CA映射后的IP_MCA:PORT_MCA地址发送数据都能通过NAT到达客户端A的IP_CA:PORT_CA(这种过滤规则的NAT估计很少)。如果不能收到STUN server的响应,那么需要进行下面的第五步测试。

[5] 客户端A以IP_CA:PORT_CA给STUN server的IP_SA:PORT_SA发送一个bind请求(请求中带CHANGE-REQUEST attribute来要求stun server改变PORT来响应),STUN server以IP_SA:PORT_SB给客户端A的IP_CA:PORT_CA回复响应。如果客户端A能收到STUN server的响应,NAT是Address-Dependent Filtering的过滤规则,也就是只要之前客户端A以IP_CA:PORT_CA给IP为IP_D的主机发送过数据,那么在NAT映射的有效期内,IP为IP_D的主机以任何端口给客户端A的IP_CA:PORT_CA映射后的IP_MCA:PORT_MCA地址发送数据都能通过NAT到达客户端A的IP_CA:PORT_CA;如果不能收到响应,NAT是Address and Port-Dependent Filtering的过滤规则,也即是只有之前客户端A以IP_CA:PORT_CA给目的主机的IP_D:PORT_D发送过数据,那么在NAT映射的有效期内,只有以IP_D:PORT_D给客户端A的IP_CA:PORT_CA映射后的IP_MCA:PORT_MCA地址发送数据才能通过NAT到达客户端A的IP_CA:PORT_CA。

通过以上5个步骤就能完成完整的NAT类型侦测。将NAT映射规则和过滤规则组合起来就形成9中不同的NAT行为类型。

[1] Endpoint Independent Mapping和Endpoint-Independent Filtering组合对应于RFC3489中的Full Cone NAT
[2]Endpoint Independent Mapping和Address-Dependent Filtering组合对应于RFC3489中的Restricted Cone NAT。
[3] Endpoint Independent Mapping和Address and Port-Dependent Filtering组合对应于RFC3489中的Port Restricted Cone NAT。
[4] Address and Port-Dependent Mapping和Address and Port-Dependent Filtering组合是RFC3489中所说的Symmetric NAT。

可见RFC3489只描述了9种NAT组合行为类型中的4种。最后一个文档rfc5769,定义了一些STUN协议的测试数据用于测试STUN server的正确性。

3.3.2.2 NAT打洞过程

“打洞”方式穿越NAT有两种形式:TCP”打洞”和UDP”打洞”。原理上,TCP”打洞”与UDP”打洞”是没有本质的区别的。然而在实现上,TCP”打洞”的成功率远没UDP”打洞”的成功率高,其主要原因有三:

[1] 有些NAT防火墙策略对TCP协议不是很友好
有些NAT的防火墙策略不允许来路不明的外部向内网机器发起TCP连接。由于TCP是有连接的,NAT比较容易分清哪些是NAT    内网机器主动进行通信的外部节点,这样防火墙策略比较明确。而UDP是无连接的,没有连接来标明一个数据流,协议比较简单,这样NAT支持的比较多。

[2] TCP协议本身
由于TCP的TIME_WAIT状态引起,同一个NAT后面的其他主机发起的连接被误判。具体可以看下面的文章
http://km.oa.com/group/25569/articles/show/246068

[3] TCP协议的实现API
因为标准的Berkeley sockets API是围绕C/S编程而设计的。这个API通过connect()允许一个TCP流套接字初始化一个向外的连接,通过listen()和 accept()监听一个外入的连接,一个套接字不能既用来监听又用来初始化向外的连接。更进一步讲, TCP套接字通常与本地主机上的TCP端口一一对应:一个套接字绑定到本地主机机上的某个端口后,另一个套接字就不能再绑定到该端口。然而TCP打洞要成功,需要一个本地的TCP端口既可以监听外入的连接,同时又可以发起多个向外的连接。幸运的是,所有主流的操作系统都支持一个特殊的socket选项SO_REUSEADDR,它运行应用程序绑定多个设置了该选项的套接字到同一端口。BSD系统引入了SO_REUSEPORT选项来控制端口重用,从而把端口重用和地址重用相分离。在这样的系统中,两个选项都需要被设置。尽管如此,要进行TCP打洞需要进行TCP三次握手的同时打开,但是有些TCP/IP的实现,可能不支持这种同时打开的情况,这样也就无法建立TCP连接了。

下面就几种网络拓扑情况下,NAT打洞步骤进行逐一介绍。为了方便描述,假设通信的两个节点分别为Client A和Client B,而辅助NAT穿越的STUN Server为Server S。下面的所有方法都要求Client A、Client B都与Server S保持一条长连接,或者周期性连上Server S,以便能够接收Server S的相关指令,我们称这两个连接分别为ConnectA1,ConnectB1.

接《浅析 P2P 穿越 NAT 的原理、技术、方法 ( 下 )

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏V站

php中常用的Rc4/Des/AuthCode可逆加密函数

首先是AuthCode可逆加密函数,在dz论坛等各大程序的数据传输和登陆验证都有用到。

1895
来自专栏后台及大数据开发

CentOS下redis集群安装

环境: 一台CentOS虚拟机上部署六个节点,创建3个master,3个slave节点

572
来自专栏JadePeng的技术博客

kgtemp文件转mp3工具

kgtemp文件是酷我音乐软件的缓存文件,本文从技术层面探讨如何解密该文件为mp3文件,并通过读取ID3信息来重命名。 kgtemp解密 kgtemp文件前10...

4579
来自专栏后台及大数据开发

CentOS下redis集群安装

环境: 一台CentOS虚拟机上部署六个节点,创建3个master,3个slave节点

612
来自专栏安富莱嵌入式技术分享

【RL-TCPnet网络教程】第23章 RL-TCPnet之地址解析协议ARP

本章节为大家讲解ARP(Address Resolution Protocol,地址解析协议),通过前面章节对TCP和UDP的学习,需要大家对ARP也有个基础的...

825
来自专栏逸鹏说道

Email系列(QQ邮箱 + 含附件的邮箱案例 + 项目实战)上

平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html 邮箱系列:https...

2735
来自专栏owent

ECDH椭圆双曲线(比DH快10倍的密钥交换)算法简介和封装

前面有几篇blog就提到我有计划支持使用ECDH密钥交换。近期也是抽空把以前的DH密钥交换跨平台适配从atgateway抽离出来,而后接入了ECDH流程。

913
来自专栏北京马哥教育

TCP洪水攻击(SYN Flood)的诊断和处理

SYN Flood介绍 前段时间网站被攻击多次,其中最猛烈的就是TCP洪水攻击,即SYN Flood。 SYN Flood是当前最流行的DoS(拒绝服务攻击)与...

3065
来自专栏情情说

让数据传输更安全

在阅读RabbitMQ数据传输安全的章节时,提到了ssl协议,用了很大篇幅介绍使用openssl生成一些列秘钥和证书,如果没有相关基础,会不太好理解,本篇就来总...

3587
来自专栏用户画像

JAVA 枚举 String-int

392

扫码关注云+社区