如何实现两台普通计算机之间的跨网通信【linux】(zzze)

如何实现两台普通计算机之间的跨网通信

比如我的PC和我朋友的PC之间想要进行跨网通信,方法有两种。
第一种:通过服务器中转
第二种:直接通信

通过服务器中转

基于TCP实现的服务器

进行TCP通信的时候必须要有服务器,这是由TCP本身的特点来决定的。

我们举例子时,直接举跨网通信的例子。
如何实现两台普通计算机之间的跨网通信【linux】(zzze)

基于UDP实现的服务器

基于UDP实现的服务器,并不是UDP本身的特点决定的,而是由应用程序自己搭建,和UDP协议本身没有关系。

如何实现两台普通计算机之间的跨网通信【linux】(zzze)

那么如果服务器如何知道转发给谁呢?
服务器会建立一个链表,把所有客户的IP和端口都进行记录,当服务器收到数据之后就会在链表中查找目标客户端的IP和端口调用sendto函数把数据发送给目标客户端。

直接通信

PC之间如果要直接通信的话,只能使用UDP通信。
因为TCP必须要有服务器,如果进行点对点的直接通信则必须使用UDP通信。

不过如果PC之间要进行UDP直通的话,也必须要有服务器程序的参与,否者PC1根本不能知道PC2的公网IP和端口。

服务器的实现有两种

UDP服务器方式

如何实现两台普通计算机之间的跨网通信【linux】(zzze)

首先这两个主机同时向服务器发送数据,发送数据的时候服务器会建立一个链表记录客户端的IP和端口,UDP服务器是我们应用程序自己搭建的,在进行UDP通信的时候,服务器和客户端的通信仍然是点对点的通信。

PC1向服务器发送数据,有两个作用,打通PC1和服务器之间的连接,UDP服务器也会记录PC1客户端的IP和端口。

PC2和PC1相同。

此时如果PC1想要和PC2通信,只要向服务器询问到PC2的IP和端口就可以实现通过广域网PC1和PC2的直接点对点进行UDP通信。

那么同样的PC2主机也可以通过上面方法给PC1发送数据进行通信或者直接在接收PC1数据的时候直接记录PC1的IP和端口进行通信。

注意:PC1和PC2的点对点通信只能使用UDP通信,因为TCP通信必然要有服务器,只有UDP才能实现点对点通信。

TCP服务器方式

如何实现两台普通计算机之间的跨网通信【linux】(zzze)

PC1 客户端通过TCP通信和TCP服务器进行通信,TCP服务器应用程序创建链表记录PC1 客户端的IP和端口。

PC2 客户端通过TCP通信和TCP服务器进行通信,TCP服务器应用程序创建链表记录PC2 客户端的IP和端口。

PC1通过TCP通信向TCP服务器询问PC2的IP和端口,TCP服务器通过TCP通信返回给PC1。

PC1有了PC2的IP和端口就可以直接通过UDP进行点对点通信。

PC2给PC1发送数据进行通信可以通过TCP通信向TCP服务器询问PC1的IP和端口,也可以在进行UDP点对点通信的时候记录PC1发送端的IP和端口。

TCP服务器方式和UDP服务器方式的实现原理相同。

实际上QQ的实现使用的就是TCP/UDP相联合的实现方式。

TCP:用于管理所有的用户信息,以及转发文字聊天信息。

UDP:当客户双方进行视频通话时,由于视频通话的数据量太大,所以客户双方此时就使用UDP来点对点直接通信。

进行视频通信时,如果使用TCP服务器进行转发,就会比较麻烦,并且服务器负担会非常重,因为视频通话所需要转发的数据量非常,所以进行视频通话的时候使用UDP的点对点进行通信。