简介

上一篇文章咱们解说了Socket的分类和最罕用到的Stream Socket,Stream Socket个别是基于TCP协定的,所以咱们常常在web服务中可能看到他们的身影。当然TCP协定有个孪生兄弟叫做UDP,那么基于UDP来做传输协定的socket协定就叫做Datagram Socket,明天咱们一起来具体理解一下Datagram Socket。

什么是Datagram Socket

和有连贯的Stream Socket不同,Datagram Socket是无连贯的。有连贯的Stream Socket表明这个socket是稳固牢靠的,所以咱们能够在Stream socket中进行稳固的数据传输,当然这个稳固是说数据包不会失落,然而并不一定可能确保数据包不被篡改。

Datagram Socket这种无连贯的通常被用在答应数据局部失落的场景,比方语音、视频等等,无连贯的益处就是不须要TCP那样简单的建设连贯的步骤,所以相对而言更加简略。

Datagram Socket通常应用的就是UDP协定作为底层的数据传输协定。

对于UDP来说,因为UDP协定自身并不会保证数据的程序和数据异样的解决,这些都须要在应用程序中本人实现。

常见的UDP利用有DNS(Domain Name System)服务,NTP(Network Time Protocol)服务等等。

在JDK的java.net包中提供了对Datagram Socket的封装,在其中定义了三个连贯的状态:

class DatagramSocket implements java.io.Closeable {    ...    static final int ST_NOT_CONNECTED = 0;    static final int ST_CONNECTED = 1;    static final int ST_CONNECTED_NO_IMPL = 2;    ...}

别离示意没有建设连贯,建设了连贯和建设了连贯,然而还没有到实现的level。

另外,在DatagramSocket中还蕴含了一个连贯的地址和端口:

InetAddress connectedAddress = null;int connectedPort = -1;

应用socat来创立UDP服务

留神,在应用后续的命令之前,须要在unix环境中执行装置命令:yum install iproute2 netcat-openbsd socat

和之前的Stream Socket一样,咱们也能够应用socat命令,来建设一个UDP服务器,咱们须要用到socat的上面几个参数:

      udp4-listen:<port>        groups=FD,SOCKET,LISTEN,CHILD,RANGE,IP4,UDP      udp6-listen:<port>        groups=FD,SOCKET,LISTEN,CHILD,RANGE,IP6,UDP

咱们须要监听udp4和udp6的数据,所以这里应用 udp4-listen和udp6-listen两个参数。

前面的端口号能够自定义,这里咱们还是应用同样的8888端口,对应的命令如下:

socat UDP4-LISTEN:8888,fork /dev/null&socat UDP6-LISTEN:8888,ipv6only=1,fork /dev/null&

下面的命令,咱们在8888端口上监听UDP4和UDP6的连贯信息,其中fork参数示意程序在接管到程序包之后持续运行,如果不必fork,那么程序会主动退出。

socat前面原本要接一个bi-address,这里咱们应用/dev/null,示意抛弃掉所有的income信息。

UDP6-LISTEN有个非凡的参数叫做ipv6only,示意收到的数据包不要发送到IPv4-mapped IPv6 addresses。

什么是IPv4-mapped IPv6 addresses? 简略点说就是将IPv4映射到了IPv6的地址中。

执行上述命令,咱们会失去上面的输入:

[1] 16174[2] 16184

因为是后盾执行,所以咱们返回了过程的ID。

应用ss命令来监控Datagram Sockets

ss命令能够用来查看socket的状态,这里咱们须要用到ss的这样几个参数:

   -4, --ipv4          display only IP version 4 sockets   -u, --udp           display only UDP sockets   -l, --listening     display listening sockets   -n, --numeric       don't resolve service names

因为咱们只监听ipv4和ipv6的数据,所以这里咱们用-4和-6这两个参数。

另外因为只须要监听udp sockets,所以须要应用-u参数。

因为是监听,所以应用-l参数,最初咱们心愿看到具体的数字,而不是被解析成了服务名,所以这里应用-n参数。

咱们应用上面的命令看看后果:

ss -4 -uln

能够失去上面的后果:

State       Recv-Q Send-Q                      Local Address:Port                                     Peer Address:Port              UNCONN      0      0                                       *:8888                                                *:*  

下面的命令只监听了Ipv4,咱们再看看Ipv6:

ss -6 -uln

能够失去上面的后果:

State       Recv-Q Send-Q                      Local Address:Port                                     Peer Address:Port              UNCONN      0      0                                      :::8888                                               :::*  

和Ipv4的很相似,示意咱们在Ipv6上监听到了端口8888。

应用nc建设和UDP Socket的连贯

咱们曾经建设好了了监听UDP连贯的服务器,接下来咱们尝试应用nc命令来进行连贯。

nc是Ncat的简称,是一个十分小并且高效的网络工具。咱们来看下本例子中会用到的参数:

  -4                         Use IPv4 only  -6                         Use IPv6 only  -u, --udp                  Use UDP instead of default TCP  -v, --verbose              Set verbosity level (can be used several times)  -z                         Zero-I/O mode, report connection status only

因为须要连贯到Ipv4和Ipv6,所以须要-4和-6参数。

默认状况下nc应用的是TCP协定,如果要应用udp则须要应用-u这个参数。

另外咱们须要输入具体的信息,所以须要-v参数,最初咱们间接建设连贯,并不发送任何数据,所以这里应用-z参数,咱们执行一下来看看成果:

nc -4 -u -vz 127.0.0.1 8888

看看上面的输入后果:

Ncat: Version 7.50 ( https://nmap.org/ncat )Ncat: Connected to 127.0.0.1:8888.Ncat: UDP packet sent successfullyNcat: 1 bytes sent, 0 bytes received in 2.02 seconds.

示意UDP连贯胜利。

同样的,咱们能够应用上面的命令来连贯到UDP socket:

nc -6 -u -vz ::1 8888

其中::1示意的是本机的ipv6地址.

能够失去上面的后果:

Ncat: Version 7.50 ( https://nmap.org/ncat )Ncat: Connected to ::1:8888.Ncat: UDP packet sent successfullyNcat: 1 bytes sent, 0 bytes received in 2.02 seconds.

示意UDP连贯胜利。

总结

本文解说了datagram socket的基本概念,并且应用一些unix的根本命令来构建了udp服务器和客户端,不便大家了解。

本文已收录于 http://www.flydean.com/16-datagram-socket/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」,懂技术,更懂你!