网络协议之:socket协议详解之Datagram Socket

简介: 网络协议之:socket协议详解之Datagram Socket

目录



简介


上一篇文章我们讲解了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 successfully
Ncat: 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 successfully
Ncat: 1 bytes sent, 0 bytes received in 2.02 seconds.


表示UDP连接成功。


总结



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

相关文章
|
6月前
|
数据采集 算法 数据挖掘
模块化控制协议(MCP)在网络中增强智能体执行效率的研究
随着Web3技术的迅速发展,去中心化应用和智能体在各种领域的应用逐渐增多。MCP(Modularized Control Protocol,模块化控制协议)作为一种增强智能体执行能力的关键技术,为Web3场景中的智能体提供了更强的灵活性和可扩展性。本文将探讨如何利用MCP技术提升智能体在Web3场景中的执行能力,并通过实例代码展示其实现路径。
510 22
|
3月前
|
监控 负载均衡 安全
WebSocket网络编程深度实践:从协议原理到生产级应用
蒋星熠Jaxonic,技术宇宙中的星际旅人,以代码为舟、算法为帆,探索实时通信的无限可能。本文深入解析WebSocket协议原理、工程实践与架构设计,涵盖握手机制、心跳保活、集群部署、安全防护等核心内容,结合代码示例与架构图,助你构建稳定高效的实时应用,在二进制星河中谱写极客诗篇。
WebSocket网络编程深度实践:从协议原理到生产级应用
|
4月前
|
运维 架构师 安全
二层协议透明传输:让跨域二层协议“无感穿越”多服务商网络
简介:本文详解二层协议透明传输技术,适用于企业网工、运营商及架构师,解决LLDP/LACP/BPDU跨运营商传输难题,实现端到端协议透传,提升网络韧性与运维效率。
|
8月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
236 18
|
9月前
|
安全 网络安全 定位技术
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
279 22
|
9月前
|
网络协议 数据安全/隐私保护 网络架构
|
10月前
|
缓存 网络协议 API
掌握网络通信协议和技术:开发者指南
本文探讨了常见的网络通信协议和技术,如HTTP、SSE、GraphQL、TCP、WebSocket和Socket.IO,分析了它们的功能、优劣势及适用场景。开发者需根据应用需求选择合适的协议,以构建高效、可扩展的应用程序。同时,测试与调试工具(如Apipost)能助力开发者在不同网络环境下优化性能,提升用户体验。掌握这些协议是现代软件开发者的必备技能,对项目成功至关重要。
|
11月前
|
人工智能 自然语言处理 决策智能
智能体竟能自行组建通信网络,还能自创协议提升通信效率
《一种适用于大型语言模型网络的可扩展通信协议》提出创新协议Agora,解决多智能体系统中的“通信三难困境”,即异构性、通用性和成本问题。Agora通过标准协议、结构化数据和自然语言三种通信格式,实现高效协作,支持复杂任务自动化。演示场景显示其在预订服务和天气预报等应用中的优越性能。论文地址:https://arxiv.org/pdf/2410.11905。
395 6
|
前端开发 网络协议 安全
【网络原理】——HTTP协议、fiddler抓包
HTTP超文本传输,HTML,fiddler抓包,URL,urlencode,HTTP首行方法,GET方法,POST方法
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
775 3