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表中,是唯一的。

如下表:

 

简单说一下 TCP打洞和UDP打洞_编程语言

那么发给百度服务器的内容是 源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就可以直接通信了。