对于UDP通信的分析【linux】(zzzd)

时间:2024-04-07 22:07:13

分析UDP的几种通信情况

本机UDP通信

对于UDP通信的分析【linux】(zzzd)
由于 A,B 进程在同一台计算机上,所以两个程序共用相同的TCP/IP协议栈。

进程 A 在发送数据的时候会把数据和发送对方的IP和端口一起封装发送给UDP传输层。

UDP传输层封装传输层包套发送给IP网络层。

IP网络层封装网络层包头,最重要的是封装源IP和源端口,目标IP和目标端口。
目标IP和目标端口来自于应用层,应用层在调用sendto函数的时候会指定目标IP和目标端口,也就是发送给对方的IP和端口。

在IP网络层发现源IP和目标IP相同就判断了数据是发送给本机的,数据到达IP层之后会直接返回,返回到UDP传输层之后,UDP传输层会直接把数据发送给B程序。

数据之所以能够通过UDP传输层直接发送给B进程是因为不同的应用程序通过不同的端口号进行区分和识别。

通过UDP通信发送数据,不管对方有没有收到,对方都不会进行回答。

局域网内UDP跨机通信

对于UDP通信的分析【linux】(zzzd)
我们已 A 进程发送数据,B进程接收数据进行说明。
A 进程和 B 进程在同一个网段,也就是在同一个局域网中。

sendto把数据和对方的IP和端口发送给UDP传输层。

UDP封装传输层包头发送给IP网络层。

IP网络层封装网络层包头,在这个过程中封装源IP和源端口,封装目标IP和目标端口,然后交给链路层。

链路层封装链路层包头然后交给A网卡。

A网卡把数据发送给交换机。

交换机把数据发送给B主机的网卡。

B主机的网卡对于数据不断向上发送进行拆包,最终recvfrom函数收到数据。

这个过程不会涉及到三次握手,UDP 所做的知识把数据发送出去,发送主机不会考虑目标主机能否收到数据,目标主机也不会对于发送主机进行回答。

UDP通信过路由器,跨网通信

UDP跨网通信的前提是,必须要知道对方的公网ip,暂时先假设发送者本来就知道。
对于UDP通信的分析【linux】(zzzd)
A 程序调用 sendto函数 把数据和对方的公网IP和端口发送给UDP传输层。

UDP封装传输层包头发送给IP网络层。

IP网络层封装网络层包头,在这个过程中封装源私网IP和源端口,封装目标公网IP和目标端口,然后交给链路层。

链路层封装链路层包头然后交给A网卡。

A网卡把数据发送给交换机。

交换机把数据发送给路由器。

路由器进行nat转换,把源ip从私网ip转换为公网ip。

路由器把数据发送给广域网交换机。

然后交给对方主机所在的路由器。

路由器进行nat转换把目标ip从公网ip转换为私网ip,然后把数据发送给交换机。

交换机把数据发送给B主机的网卡。

B主机的网卡对于数据不断向上发送进行拆包,最终目标主机的recvfrom函数接收到数据。

B主机可以从数据包中提取源公网IP和源端口。

注意:
进行UDP跨网通信时:
A程序绑定的IP,
B程序绑定的IP,
数据包中的源IP,
数据包中的目标IP,
都是公网IP。

传输过程中没有三次握手建立连接,发送数据的时候也没有回答的过程。

使用UDP通信搭建出服务器

有读者可能会有疑问说,不对啊,不是说UDP是“对等通信”,没有服务器吗?,怎么还可以使用UDP搭建服务器呢?

我们说UDP没有服务器,这是站在UDP协议角度来说,但是并不是说我们自己写的“应用程序”,不能基于UDP来实现服务器。

应用程序基于UDP实现服务器的时候,服务器的实现者是应用程序,而不是UDP协议。

对于UDP通信的分析【linux】(zzzd)
能够实现的前提是:充当服务器的IP和端口一定是固定的,所有的客户端必须直到服务器的ip和端口。

不同的主机给同一台主机发送数据就可以实现客户机和服务器,其他客户端主机给服务器端主机发送数据时,服务器可以知道和记录客户端的IP和端口,服务器可以建立一个链表把所有发送方客户端的IP和端口全部记录下来以便于对客户端进行回答,当服务器想要和其中一个客户端进行通信的时候就对于链表进行查找,找到对应客户端的IP和端口就可以进行通信。

总之,使用UDP实现服务器时,服务器是由应用程序本身来构建的,而不是UDP协议,就算搭建出了服务器,但是使用UDP来实现“服务器”和“客户”的通信时,站在UDP协议的角度来说,任然还是对等通信。

服务器如何同时与n多个客户通信

多线程

多进程

多路IO