简单说一下 TCP打洞和UDP打洞
1, TCP协议通信:
现在有两台电脑A和B。在
假设A的地址为 192.168.0.100
假设B的地址为 192.168.0.102
A想给B发送一个字符串Hello, 如果A,B之间采用TCP协议,那么B收到Hello的过程是怎样的呢?
首先建立连接(3次握手成功之后,A和B的链接才算成功),然后A在给B发送数据。
如果A,B不在一个局域网内,A,B通信就需要打洞了。
假设A通过路由器S1上网。B通过路由器S2上网。
S1的外网IP:114.66.5.211 本地IP:192.168.0.1
S2的外网IP:14.153.27.47 本地IP:192.168.1.1
A的本地地址:192.168.0.100
B的本地地址:192.168.1.102
先暂时不说A和B的通信。我们来说一下A访问www.baidu.com
发送的源地址就是192.168.0.100 ,目标地址就是61.135.169.105(www.baidu.com经过DNS解析之后的地址)。
由于A的网内没有这个61.135.169.105地址,所以会把数据发给默认网关。这里的默认网关地址就是192.168.0.1(路由器S1的本地地址)
路由器S1拿到数据之后,会做什么事情呢?
他会做NAT映射,然后把之前的源地址192.168.0.100换成外网IP:114.66.5.211.
它是怎么映射的呢?
他会把192.168.0.1:22124转换成一个外网端口号。假设转换的端口号为1481。
22124为A电脑从哪个端口发出去的。1481为路由器计算出来的值,具体计算方法不需要知道,只需要知道这个值在NAT表中,是唯一的。
如下表:
那么发给百度服务器的内容是 源IP为114.66.5.211:1481 目标IP为61.135.169.105:8080。 百度收到请求后,把源IP换成目标IP发送数据。
最终数据会传到路由器S1. 传到路由器之后,它开始根据端口号查NAT表。如果这个端口号在表中存在,那么就把src的值取出,并把数据中的目标地址
替换为src的值。这样A就收到了百度服务器的数据。
根据这个思路,可以得出,A,B要想通信,路由器S1必须知道,B在路由器S2中的映射。同样的,路由器S2必须知道A在S1中的映射。
平常做法是需要借助一台服务器T,A和B都去访问服务器T,那么T会得到A和B在各自路由器中的映射,然后把B在路由器S2中的映射发给S1。
把A在路由器S1中的映射发给S2.这样A和B就可以直接通信了。
简单说一下 TCP打洞和UDP打洞的更多相关文章
- TCP打洞和UDP打洞的区别 (转)
为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现? 假设现在有内网客户端A和内网客户端B,有公网服务端S. 如果A和B想要进行UD ...
- TCP打洞与UDP打洞的差别
为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现? 如果如今有内网clientA和内网clientB.有公网服务端S. 如果A和B ...
- TCP打洞和UDP打洞的区别 (相互直接访问)
为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现? 假设现在有内网客户端A和内网客户端B,有公网服务端S. 如果A和B想要进行UD ...
- Kcptun 是一个非常简单和快速的,基于KCP 协议的UDP 隧道,它可以将TCP 流转换为KCP+UDP 流
本博客曾经发布了通过 Finalspeed 加速 Shadowsocks 的教程,大家普遍反映能达到一个非常不错的速度.Finalspeed 虽好,就是内存占用稍高,不适合服务器内存本来就小的用户:而 ...
- Python实现简单的udp打洞(P2P)
UDP穿越NAT的具体设计 首先,Client A登录服务器,NAT 1为这次的Session分配了一个端口60000,那么Server S收到的Client A的地址是200.0.0.132:600 ...
- UDP打洞、P2P组网方式研究
catalogue . NAT概念 . P2P概念 . UDP打洞 . P2P DEMO . ZeroNet P2P 1. NAT概念 在STUN协议中,根据内部终端的地址(LocalIP:Local ...
- udp打洞( NAT traversal )的方法介绍
http://www.cnblogs.com/whyandinside/archive/2010/12/08/1900492.html http://www.gzsec.com/oldversion/ ...
- Udp打洞原理和源代码。
所谓udp打洞就是指客户端A通过udp协议向服务器发送数据包,服务器收到后,获取数据包,并且 可获取客户端A地址和端口号.同样在客户端B发送给服务器udp数据包后,服务器同样在收到B发送过来 的数据包 ...
- NAT穿透(UDP打洞)
1.NAT(Network Address Translator)介绍 NAT有两大类,基本NAT和NAPT. 1.1.基本NAT 静态NAT:一个公网IP对应一个内部IP,一对一转换 动态NAT:N ...
随机推荐
- xpath中双斜杠的作用// double slash
https://stackoverflow.com/questions/36019544/if-double-slash-is-used-2-times-in-xpath-what-does-it-m ...
- 关于intent传递对象后是传递的对象的地址还是对象的拷贝?
var intent = Intent(activity,SingleColorControlActivity::class.java); var bundle = Bundle()// bundle ...
- JEDEC标准(JESD216)S FDP对串行Flash在系统中的应用
摘要:JEDEC标准(JESD216)Serial Flash Discoverable Parameter (SFDP)[1]是在串行Flash中建立一个可供查询的描述串行Flash功能的参数表.文 ...
- Gym 100548K Last Defence (数论)
题意:给定两个数,然后从第三个开始,每个数都是前两个数的差的绝对值,问这个序列中有多少个不同的元素. 析:这个和辗转相除法差不多,假设a > b那么a-b之间就有a/b个数,然后再计算a%b- ...
- idea设置控制台不打印日志
这样做的好处是当想打印数据到控制台查看就特别方便,这个在大数据spark sql使用的多.当然如果代码报错也会打印,这个不必担心. 方案Ⅰ 方法是将这个log日志文件放到idea的资源目录里即可 lo ...
- 洛谷P3833 [SHOI2012]魔法树(树链剖分)
传送门 树剖板子…… 一个路径加和,线段树上打标记.一个子树询问,dfs的时候记录一下子树的区间就行 // luogu-judger-enable-o2 //minamoto #include< ...
- 我的周记6——"不破楼兰誓不还“
周6 2019-06-13 天气:雨 这张照片是我那天中午回家的时候拍的,下着中雨.这是谁的孩子,又是谁的妈妈.看到这样的场景心里还是蛮有触动的, 因为我现在是离家千里的孩子,思念着故乡也想念着亲人 ...
- 微信支付接口调用问题(android正常,iphone调不起)
转自:http://blog.csdn.net/tt123123/article/details/53897035 碰到的问题 :根据微信提供的示例代码(ASP.NET),配置好一切后, 用andro ...
- USACO Training刷题记录 By cellur925
Section 1.1 Your Ride Is Here 貌似没啥可说 Greedy Gift Givers 上来就想stl map映射,有两个坑:如果送给别人的人数为0,那么需要特判一下,防止整数 ...
- Windows 程序设计 笔记
知识点 双字节字符集和Unicode字符集有何区别?采用双字节字符集有何问题 双字节字符集(DBCS)编码是0-255,DBCS含有1字节代码与2字节代码,而Unicode是统一的16位系统,这样就允 ...