社区
网络编程 帖子详情 关于利用打洞技术进行P2P通信时为什么不能用TCP的疑问?我有一些理解,不知道对不对,请大家指正! sct 2005-08-26 11:11:31
网上关于UDP穿越NAT的主要中文资料:
1.P2P之UDP穿透NAT的原理与实现(shootingstars),
2.P2P communication across middleboxes那篇翻译稿
我看了好几遍,每次都有新得体会,
但是对其中为什么不能用TCP来进行(这两份资料中提得也比较少)
仍有不少疑问,请各位多多赐教,谢谢!
在那篇翻译稿中看到:
{ 绝大多数的TCP会话的建立,
都是通过一端先发送一个SYN包开始,另一方回发一个SYN-ACK包的过程。
如果一个NAT接收到一个来自私有网络外面的TCP SYN包,这个包想发起一个“引入”的TCP连接,
一般来说,NAT会拒绝这个连接请求并扔掉这个SYN包,或者回送一个TCP RST包给请求方。
但是,有一种情况,当这个接收到的SYN包中的源IP地址和端口、目标IP地址和端口都与NAT登记的一个已经激活的TCP会话中的地址信息相符时,NAT将会放行这个SYN包,让它进入NAT内部。
}
1.不知道一个内部网主机通过NAT打开一个“外出”的TCP会话跟打开一个UDP会话有什么不同?
NAT都会为会话分配一个[公网IP:端口]吧?
2.如果是的话,我们在利用UDP打动技术进行p2p通信的时候,
开始时,在A、B登陆服务器S时为什么不能用TCP进行连接?
假设
A[10.1.1.3:1234]在登陆S[18.181.0.31:1234]时(用TCP,标记为会话A1),
NAT a为其分配的[公网IP:端口]是[133.66.22.15:6200],
B[10.0.0.3:1234]在登陆S[18.181.0.31:1234]时(用TCP,标记为会话A1),
NAT b为其分配的[公网IP:端口]是[155.99.25.11:6200],
那么B向A的公网IP([133.66.22.15:6200])发打洞消息(用UDP,标记为会话B2)后,
A[10.1.1.3:1234]通过UDP(标记为会话A2)向B的公网IP([155.99.25.11:6200])发送的消息
还是可以通过NAT b啊?
为什么在A、B登陆S的时候不能用TCP呢?
是不是因为NAT a会为 会话A2 分配一个新的[公网IP:端口],比如[133.66.22.15:6201],
发送出去的消息以[133.66.22.15:6201]为源地址和端口,
而B向A的公网IP打洞时在NAT b上留下的是关于[133.66.22.15:6200]的标记,
所以消息将不能进入NAT b,是由于这个原因吗?
会话A2是不是绝对不可能使用[公网IP:端口][133.66.22.15:6200],
因为这是NAT a为会话A1(TCP的)分配的,而会话A2是UDP的,是这样吗?
3.写到这里,
又看了(P2P communication across middleboxes那篇翻译稿)中
关于同时开放TCP连接的一段话
{...两个客户端还是无法建立这个TCP直连,
因为它们无法预知对方的NAT会分配给新的会话的端口号是多少。
},
我突然想到,
是不是因为TCP是面向连接的,
所以对于A[10.1.1.3:1234]发起的每一个会话,NAT a都会为其分配一个新的[公网IP:端口],
就算NAT a是Cone NAT也是这样,
也就是说
{ 当建立了一个 [私有IP:端口]-[公网IP:端口] 端口绑定之后,
对于来自同一个[私有IP:端口]的会话,
Cone NAT允许发起会话的应用程序重复使用这个端口绑定 }只对UDP有效?
是这样的吗?
备注:用{}括起来的都是P2P communication across middleboxes那篇翻译稿中提到的。
...全文
650 15 打赏 收藏 关于利用打洞技术进行P2P通信时为什么不能用TCP的疑问?我有一些理解,不知道对不对,请大家指正! 网上关于UDP穿越NAT的主要中文资料: 1.P2P之UDP穿透NAT的原理与实现(shootingstars), 2.P2P communication across middleboxes那篇翻译稿 我看了好几遍,每次都有新得体会, 但是对其中为什么不能用TCP来进行(这两份资料中提得也比较少) 仍有不少疑问,请各位多多赐教,谢谢! 在那篇翻译稿中看到: { 绝大多数的TCP会话的建立, 都是通过一端先发送一个SYN包开始,另一方回发一个SYN-ACK包的过程。 如果一个NAT接收到一个来 复制链接
扫一扫 分享 转发到动态 举报 AI 作业
写回复 配置赞助广告取 消
确 定
用AI写文章 15 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 zhxk 2005-09-03 打赏举报 回复 刚才,经过一翻思考,Socket2是不能这么主动滴,这些任务交给Socket3吧,哈哈
关于Socket3,啊,你用原始的吧
英文资料在
http://www.andrew.cmu.edu/user/ggw/natblaster.pdf
祝你好运! zhxk 2005-09-03 打赏举报 回复 Socket2在适当的时候可不要偷懒哦,要Connect对向NAT啊
当然,这不是真正的Connect,只是在自己的NAT上戳一个洞,好让对向插进来啊(什么?给你插你还不赶快插?!,不插白不插!!)
哈哈 zhxk 2005-09-03 打赏举报 回复 可以滴.
两边先各开一个TCP的Listen Socket1指定port 等待外部的进攻
然后再各开一个TCP的Socket2手动绑定到同一个port,先按兵不动,等待机会.
再然后你再另开一个UDP Socket3从事间谍活动,连向Server情报局.
再再然后后呢,你用Socket2向Server发一个udp包,Server向对方的Socket3透漏情报
现在Socket2已经知道了,对方port相对外网的藏身之处,并向它发动一次致命的攻击.
哈哈,GaveOver.
你发我邮箱:nrt3303@sohu.com
我把资料发给你 areyoupig 2005-09-03 打赏举报 回复 UDP是无连接的,简单一些,TCP的是面向连接的,也能透过,不过复杂些 mynamelj 2005-09-02 打赏举报 回复 up mynamelj 2005-09-02 打赏举报 回复 up mengjj 2005-09-02 打赏举报 回复 mark shootingstars 2005-09-01 打赏举报 回复 呵呵,这种情况当然可以(客户端使用tcp连接服务器,客户端使用udp互相连接)
问题是客户端使用udp通信的时候必须自己处理可能遇到的包丢失,包错序等等问题。
我想现在大家主要是想直接使用tcp来直接连接两个NAT后的客户端吧。。。 sct 2005-08-31 打赏举报 回复 update sct 2005-08-31 打赏举报 回复 我还是有点不理解,有点糊涂了,
-----------------------------------------------------------------------
回复人: nuaawenlin(飘人) ( ) 信誉:105 2005-08-26 14:04:00 得分: 0
最主要的是当使用tcp连接服务器之后
服务器尽管知道了tcp的ip,port
但是一个socket不能同时作为connect,又同时listen
所以,当这个tcp关闭,从connect变为listen时。port又从新分配了
upd是无连接的,所以实现p2p比较简单
----------------------------------------------------------------------
我是想clientA和clientB都用TCP连接sever,然后再由clientB向A的公网IP和端口(比如123.23.21.23:2000)打洞,以使得A可以发送消息到B,
我不能这样做吗:
clientA与server之间的TCP连接一直连着,而B用UDP连到A的公网IP和端口123.23.21.23:2000,不是说UDP的端口和TCP的端口没有关系吗,那么我就可以在2000这个端口上既开TCP又开UDP啊?
我现在有点糊涂了,请大家不要见怪
gohappy_1999 2005-08-26 打赏举报 回复 我不懂,帮你顶 菲斯可儿 2005-08-26 打赏举报 回复 道理很简单,今天心情不好,可能说的不大清楚。
A通过TCP连接server时,nat开一个端口port1给A,A通过这个端口与server通信。
NAT为B开了port2。
假设这时,A要向B打洞,nat又为A开了一个新的端口port1',因为B还在用port2和server产生连接,所以,A是连不到port2的。
同样的情况,如果使用UDP,因为UDP是无连接的,所以,即便B正在与server通过port2通信,A同样可以发消息到port2上,并被B成功的接收到,这样,他们就建立起了一种联系,可以互相通信啦。
shootingstars 2005-08-26 打赏举报 回复 一:如楼上 nuaawenlin(飘人) 所说
二:UDP的端口和TCP的端口没有关系,NAT会分别对待。你不能使用UDP协议包去帮助TCP来打洞。
三:NAT对待TCP包的方式也不一样,首先NAT必须支持“同时打开”功能,其次即时支持此功能,也必须保证你的连接建立在对方的NAT发送的TCP RST发送回来之前。呵呵,时间必须拿捏很准才行哦。
nuaawenlin 2005-08-26 打赏举报 回复 最主要的是当使用tcp连接服务器之后
服务器尽管知道了tcp的ip,port
但是一个socket不能同时作为connect,又同时listen
所以,当这个tcp关闭,从connect变为listen时。port又从新分配了
upd是无连接的,所以实现p2p比较简单 BRAPH 2.0 is a comprehensive software package for the analys BRAPH 2.0 is a comprehensive software package for the analysis and visualization of brain connectivity data, offering flexible customization, rich visualization capabilities, and a platform for collaboration in neuroscience research..zip 光流法C++源代码 ### 光流法C++源代码解析与应用
#### 光流法原理
光流法是一种在计算机视觉领域中用于追踪视频序列中运动物体的方法。它基于亮度不变性假设,即场景中的点在时间上保持相同的灰度值,从而通过分析连续帧之间的像素变化来估计运动方向和速度。在数学上,光流场可以表示为像素位置和时间的一阶导数,即Ex、Ey(空间梯度)和Et(时间梯度),它们共同构成光流方程的基础。
#### C++实现细节
在给定的C++源代码片段中,`calculate`函数负责计算光流场。该函数接收一个图像缓冲区`buf`作为输入,并初始化了几个关键变量:`Ex`、`Ey`和`Et`分别代表沿x轴、y轴和时间轴的像素强度变化;`gray1`和`gray2`用于存储当前帧和前一帧的平均灰度值;`u`则表示计算出的光流矢量大小。
#### 图像处理流程
1. **初始化和预处理**:`memset`函数被用来清零`opticalflow`数组,它将保存计算出的光流数据。同时,`output`数组被填充为白色,这通常用于可视化结果。
2. **灰度计算**:对每一像素点进行处理,计算其灰度值。这里采用的是RGB通道平均值的计算方法,将每个像素的R、G、B值相加后除以3,得到一个近似灰度值。此步骤确保了计算过程的鲁棒性和效率。
3. **光流向量计算**:通过比较当前帧和前一帧的灰度值,计算出每个像素点的Ex、Ey和Et值。这里值得注意的是,光流向量的大小`u`是通过`Et`除以`sqrt(Ex^2 + Ey^2)`得到的,再乘以10进行量化处理,以减少计算复杂度。
4. **结果存储与阈值处理**:计算出的光流值被存储在`opticalflow`数组中。如果`u`的绝对值超过10,则认为该点存在显著运动,因此在`output`数组中将对应位置标记为黑色,形成运动区域的可视化效果。
5. **状态更新**:通过`memcpy`函数将当前帧复制到`prevframe`中,为下一次迭代做准备。
#### 扩展应用:Lukas-Kanade算法
除了上述基础的光流计算外,代码还提到了Lukas-Kanade算法的应用。这是一种更高级的光流计算方法,能够提供更精确的运动估计。在`ImgOpticalFlow`函数中,通过调用`cvCalcOpticalFlowLK`函数实现了这一算法,该函数接受前一帧和当前帧的灰度图,以及窗口大小等参数,返回像素级别的光流场信息。
在实际应用中,光流法常用于目标跟踪、运动检测、视频压缩等领域。通过深入理解和优化光流算法,可以进一步提升视频分析的准确性和实时性能。
光流法及其C++实现是计算机视觉领域的一个重要组成部分,通过对连续帧间像素变化的精细分析,能够有效捕捉和理解动态场景中的运动信息 Rust库,用于构建将C_C代码编译为Rust库的脚本_Rust library for build scripts t Rust库,用于构建将C_C代码编译为Rust库的脚本_Rust library for build scripts to compile C_C++ code into a Rust library.zip 微信小程序开发项目源码及效果演示资源 微信小程序作为腾讯推出的一种轻型应用形式,因其便捷性与高效性,已广泛应用于日常生活中。以下为该平台的主要特性及配套资源说明:
特性方面:
操作便捷,即开即用:用户通过微信内搜索或扫描二维码即可直接使用,无需额外下载安装,减少了对手机存储空间的占用,也简化了使用流程。
多端兼容,统一开发:该平台支持在多种操作系统与设备上运行,开发者无需针对不同平台进行重复适配,可在一个统一的环境中完成开发工作。
功能丰富,接口完善:平台提供了多样化的API接口,便于开发者实现如支付功能、用户身份验证及消息通知等多样化需求。
社交整合,传播高效:小程序深度嵌入微信生态,能有效利用社交关系链,促进用户之间的互动与传播。
开发成本低,周期短:相比传统应用程序,小程序的开发投入更少,开发周期更短,有助于企业快速实现产品上线。
资源内容:
“微信小程序-项目源码-原生开发框架-含效果截图示例”这一资料包,提供了完整的项目源码,并基于原生开发方式构建,确保了代码的稳定性与可维护性。内容涵盖项目结构、页面设计、功能模块等关键部分,配有详细说明与注释,便于使用者迅速理解并掌握开发方法。此外,还附有多个实际运行效果的截图,帮助用户直观了解功能实现情况,评估其在实际应用中的表现与价值。该资源适用于前端开发人员、技术爱好者及希望拓展业务的机构,具有较高的参考与使用价值。欢迎查阅,助力小程序开发实践。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除! 芋道ruoyi-vue-pro 工作流最新sql 芋道ruoyi-vue-pro 工作流最新sql 注意,bpm_process_definition_info表中deleted这个字段的默认值为0,并没有写手sql语句,请手劝添加!
网络编程
18,359
社区成员
64,186
社区内容
发帖 与我相关 我的任务 网络编程 VC/MFC 网络编程 复制链接
扫一扫 分享 确定 社区描述 VC/MFC 网络编程 c++c语言开发语言 技术论坛(原bbs) 社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告 试试用AI创作助手写篇文章吧
+ 用AI写文章