为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现?

假设现在有内网客户端A和内网客户端B,有公网服务端S。

如果A和B想要进行UDP通信,则必须穿透双方的NAT路由。假设为NAT-A和NAT-B。

A发送数据包到公网S,B发送数据包到公网S,则S分别得到了A和B的公网IP,

S也和A B 分别建立了会话,由S发到NAT-A的数据包会被NAT-A直接转发给A,

由S发到NAT-B的数据包会被NAT-B直接转发给B,除了S发出的数据包之外的则会被丢弃。

所以:现在A B 都能分别和S进行全双工通讯了,但是A B之间还不能直接通讯。

解决办法是:A向B的公网IP发送一个数据包,则NAT-A能接收来自NAT-B的数据包

并转发给A了(即B现在能访问A了);再由S命令B向A的公网IP发送一个数据包,则

NAT-B能接收来自NAT-A的数据包并转发给B了(即A现在能访问B了)。

以上就是“打洞”的原理。

但是TCP和UDP在打洞上却有点不同。这是因为伯克利socket(标准socket规范)的

API造成的。

UDP的socket允许多个socket绑定到同一个本地端口,而TCP的socket则不允许。

这是这样一个意思:A B要连接到S,肯定首先A B双方都会在本地创建一个socket,

去连接S上的socket。创建一个socket必然会绑定一个本地端口(就算应用程序里面没写

端口,实际上也是绑定了的,至少java确实如此),假设为8888,这样A和B才分别建立了到

S的通信信道。接下来就需要打洞了,打洞则需要A和B分别发送数据包到对方的公网IP。但是

问题就在这里:因为NAT设备是根据端口号来确定session,如果是UDP的socket,A B可以

分别再创建socket,然后将socket绑定到8888,这样打洞就成功了。但是如果是TCP的

socket,则不能再创建socket并绑定到8888了,这样打洞就无法成功。

http://www.cnblogs.com/key-ok/p/4367386.html

java 打洞_TCP打洞和UDP打洞的区别 (相互直接访问)相关推荐

  1. NAT穿透(UDP打洞)

    1.NAT(Network Address Translator)介绍 NAT有两大类,基本NAT和NAPT. 1.1.基本NAT 静态NAT:一个公网IP对应一个内部IP,一对一转换 动态NAT:N ...

  2. UDP 打洞 java demo

    UDP打洞的具体原理就不细说了文章还是很多,说下我的网络环境,家里台式电脑网线连的家里路由器(移动宽带),公司台式电脑网线连的公司路由器(电信宽带),一台有公网IP的华为云主机(我是试用一个月的) 1 ...

  3. UDP打洞、P2P组网方式研究

    catalogue 1. NAT概念 2. P2P概念 3. UDP打洞 4. P2P DEMO 5. ZeroNet P2P 1. NAT概念 在STUN协议中,根据内部终端的地址(LocalIP: ...

  4. UDP打洞(UDP Hole Punching)原理

    一. NAT分类 根据STUN协议(RFC3489),NAT大致分为下面四类: 1) Full Cone 这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端 ...

  5. TCP打洞和UDP打洞的区别

    为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现?      假设现在有内网客户端A和内网客户端B,有公网服务端S.      如果A和B想要进行 ...

  6. TCP 打洞和UDP打洞

    为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现?假设现在有内网客户端A和内网客户端B,有公网服务端S.如果A和B想要进行UDP通信,则必须穿透双 ...

  7. UDP打洞NAT大致分为下面四类 P2P

    NAT大致分为下面四类 1) Full Cone 这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口的UDP数据报都可以到达A.不管是不是C发过来的. 例 ...

  8. UDP打洞程序包的源码

    C#实现UDP打洞 转自:http://hi.baidu.com/sdfiyon/blog/item/63a6e039155e02f23a87ceb1.html 下面是UDP打洞程序包的源码: //W ...

  9. pwnat——一种无需第三方服务器就能完成NAT点对点P2P穿透的基于UDP打洞技术的新方法

    pwnat--一种无需第三方服务器就能完成NAT点对点P2P穿透的基于UDP打洞技术的新方法 简介 传统的udp打洞 UDP 打洞原理及过程 pwnat技术,无需第三方服务器! pwnat用法 pwn ...

最新文章

  1. MATLAB【四】 ————批量适配图片信息与excel/txt等文档信息,批量移动拷贝图片,批量存图片中点和方框
  2. linux pps 包 网卡,linux下安装PPS
  3. linux下给php安装pdo_mysql和zlib以及测试模式的选择(禅道安装过程中遇到的问题)...
  4. 2021年春季学期-信号与系统-第三次作业参考答案-第十道题
  5. 每日一皮:当最棒的程序员遇见了 Bug ...
  6. Android系统所有版本源码Kernel源码
  7. JavaScript中常用的事件代码及实例
  8. PHP Uploadify+jQuery.imgAreaSelect插件+AJAX 实现图片上传裁剪 仿微博头像上传功能
  9. 树莓派 pip安装mysql_树莓派 pip 手动安装
  10. 初次接触 Lottie
  11. 高级工计算机操作试题及答案,计算机系统操作高级工试题和答案[1]
  12. spring单例的bean是单例还是原型
  13. oppo计算机锁屏快捷键,oppo一键锁屏方法【图文教程】
  14. Windows10清理C盘的恶意软件
  15. 单细胞测序的入门操作
  16. MySQL报错:Duplicate entry ‘xxx‘ for key ‘xxx‘
  17. HTML5实时显示摄像头视频
  18. C#毕业设计——基于C#+asp.net+sqlserver的工作计划流程管理系统设计与实现(毕业论文+程序源码)——流程管理系统
  19. 力扣122题:买卖股票的最佳时机 II
  20. 缺失数据的Bootstrap与Jackknife方法:《Statistical Analysis with Missing Data》习题5.1 5.2

热门文章

  1. 【神器】Adobe Illustrator-作图利器
  2. FactoryIO立体仓库仿真实验程序 使用简单的梯形图与SCL语言编写,通俗易懂,写有详细注释
  3. 杰里之TWS实际连接流程【篇】
  4. echarts画立体圆柱形图表
  5. 详解请求转发和重定向
  6. 我所认为的极客精神(一)
  7. 刷题之恼人的青蛙java(百练2812)
  8. 用python编写!!!网页病毒!!!
  9. leetcode第152周赛
  10. 在html里面处理菱形元素的各种情况