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打洞的更多相关文章

  1. TCP打洞和UDP打洞的区别 (转)

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

  2. TCP打洞与UDP打洞的差别

    为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现?     如果如今有内网clientA和内网clientB.有公网服务端S.     如果A和B ...

  3. TCP打洞和UDP打洞的区别 (相互直接访问)

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

  4. Kcptun 是一个非常简单和快速的,基于KCP 协议的UDP 隧道,它可以将TCP 流转换为KCP+UDP 流

    本博客曾经发布了通过 Finalspeed 加速 Shadowsocks 的教程,大家普遍反映能达到一个非常不错的速度.Finalspeed 虽好,就是内存占用稍高,不适合服务器内存本来就小的用户:而 ...

  5. Python实现简单的udp打洞(P2P)

    UDP穿越NAT的具体设计 首先,Client A登录服务器,NAT 1为这次的Session分配了一个端口60000,那么Server S收到的Client A的地址是200.0.0.132:600 ...

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

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

  7. udp打洞( NAT traversal )的方法介绍

    http://www.cnblogs.com/whyandinside/archive/2010/12/08/1900492.html http://www.gzsec.com/oldversion/ ...

  8. Udp打洞原理和源代码。

    所谓udp打洞就是指客户端A通过udp协议向服务器发送数据包,服务器收到后,获取数据包,并且 可获取客户端A地址和端口号.同样在客户端B发送给服务器udp数据包后,服务器同样在收到B发送过来 的数据包 ...

  9. NAT穿透(UDP打洞)

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

随机推荐

  1. linux进程编程入门

    1.进程的创建与操作 任务描述: 在父进程中创建一个全局变量,一个局部变量,并赋予初始值,用fork函数创建子进程.在子进程中对父进程的变量进行自加操作,并且输出变量值,然后父进程睡眠一段时间 各进程 ...

  2. 织梦万能调用LOOP标签!

    1,安装DEDE织梦程序时候,数据库名称设置独立的一个.   2,雨田SEOER这里用的是在织梦本地文件夹中新建myblog文件夹,然后里面装入emlog_5.3.0的安装文件.URL地址栏输入htt ...

  3. bzoj 4543 HOTEL 加强版

    题目大意: 求树上取三个点这三个点两两距离相等的方案数 思路: 远古时候的$n^2$做法是换根 但那样无法继续优化了 学习了一波长链剖分 考虑如何在一棵树上进行dp 设$f[i][j]$表示以$i$为 ...

  4. BZOJ_2844_albus就是要第一个出场_线性基

    BZOJ_2844_albus就是要第一个出场_线性基 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S ...

  5. WIN8系统的远程桌面漏洞 利用QQ拼音纯净版实现提权

    前言 发现这个漏洞的时候, 笔者正在机房上课.正想用3389远程桌面去控制宿舍电脑的时候,因为重做系统忘记自己的IP地址,因此就随手扫描了一下IP段开3389端口的电脑. 没想到就随手扫描到一台WIN ...

  6. python编写九九乘法表代码

    打印九九乘法表 代码: #!/usr/bin/env python # -*- coding: UTF-8 -*- # 项目二: # 1.要求:编写九九乘法表 # 2.分析: # 根据九九乘法表的样式 ...

  7. 【正睿多校联盟Day4 T4 简单的数论题】

    题目名有毒 由于并没有系统地开始学习数论,所以数论题基本靠暴力. 然鹅本题的题解相当简单: emmm....我当你没说 一个简单易懂的方法是这样的: 1. 欧拉定理的推论 若正整数a,n互质,则对于任 ...

  8. java String, StringBuffer ,StringBulider 区别

    1. String 是不可变的(immutable): 创建后不能修改: 2. StringBuffer 线程安全的,可变字符串: 3. StringBuilder 线程不安全,所以性能比较高

  9. 题解报告:hdu 1406 完数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1406 Problem Description 完数的定义:如果一个大于1的正整数的所有因子之和等于它的 ...

  10. ASP.NET MVC 实现伪静态

    1  什么是伪静态? 现在很多门户网站或者各大电商平台的网站的链接最后都是.htm或者.htm结尾,那么他们的网页真的是静态的html吗?拿京东来说,有无数个页面都都Html,在商品每时每刻都可能被更 ...