简介
套接字这个词经常出现在正常的网络编程和netty 中,套接字允许客户端建立到服务器的连接并与客户端通信。客户端和服务器端的通信,那么socket有哪些类别呢?
Socket是什么
socket的中文翻译是socket。就我个人而言,我认为很多人第一次听到套接字这个词时都会感到困惑。
那么什么是套接字呢?套接字是不同程序之间进行进程通信的一种方法,这些程序可以驻留在同一台服务器上,也可以驻留在不同的服务器上。
建立套接字连接的基础是IP协议。 IP 协议用于在通过网络发送数据之前对数据进行封装和分组。这种类型的套接字依赖于IP协议,也称为网络套接字。
客户端和服务器之间的连接可以通过网络套接字建立。客户端和服务器通过套接字地址发现对方。
我们以Java为例,看一下SocketAddress的定义。
public Abstract class SocketAddressimplements java.io.Serializable { staticfinallongserialVersionUID=5215720748342549866L;} 可以看到SocketAddress只是一个通用的定义,其中包括TCP、UDP等发送协议。您还必须包括IP 地址和连接端口。
IP地址和端口定义连接对象,协议定义连接方法。
根据不同的协议可以衍生出不同类型的socket。例如,依赖于TCP 协议的称为流套接字,依赖于UDP 协议的称为数据报套接字,依赖本地文件发送数据的称为Unix 域套接字。
下面详细介绍这些协议在UNIX 系统上的使用。
在进入详细示例之前,我们需要使用网络命令(ss、nc、socat)。
本文使用的是centOS系统,因此可以使用以下命令安装:
yum install iproute2 netcat-openbsd socat
Stream Socket
什么是流套接字?正如套接字连接一词所暗示的那样,在流式传输时,必须首先建立稳定的网络连接。控制协议)是最常用且非常有效的协议。
对于流套接字,数据包必须通过网络从一个地址传输到另一个地址,这一过程通常使用TCP 协议。
TCP协议可以保证数据的稳定性和有序性,TCP数据包可以保证发送到物理网络接口的数据包的顺序。 如果网络接口接收到的数据包顺序不正确,网络适配器和操作系统会确保数据包以正确的顺序重新组装以供应用程序使用。
常见的基于TCP的流套接字就是我们经常访问的http和https服务。处理http 和https 服务的服务器通常具有如下所示的流套接字地址:
124.225.141.53:80124.225.141.53:443 上面我们使用的是网易IP地址。 80代表http,443代表https。
使用socat创建一个TCP服务器
常用的TCP服务器是Apache或nginx。为简单起见,我们选择使用socat 来创建TCP 服务器。
什么是索卡特? SOcket CAT,可以用来模拟TCP服务器。
socat 命令相当复杂。下面我们简单介绍一下它的应用。
socat -hsocat 作者:Gerhard Rieger 和贡献者- www.dest-unreach.orgUsage:socat [options] bi-address bi-address 从上面的结果我们可以看到socat 接受一些地址并且可以添加一些选项。
在这里,我们将使用socat 创建两个连接(TCP6 和TCP4)。 Socat 有两个选项来运行此作业。
tcp-connect:host: 端口组=FD、SOCKET、CHILD、RETRY、IP4、IP6、TCP tcp-listen: 端口组=FD、SOCKET、LISTEN、CHILD、RETRY、RANGE、IP4、IP6、TCP tcp4-connect:host: 端口组=FD、 SOCKET, CHILD,RETRY,IP4,TCP tcp4-listen:port group=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE,IP4,TCP tcp6-connect:host:port group=FD,SOCKET,CHILD,RETRY,IP6,TCP tcp6-listen: 端口组=FD,SOCKET ,LISTEN,CHILD,RETRY,RANGE,IP6,TCP 我们只需要创建两个监听TCP 的服务,因此我们使用以下命令:
socat TCP4-LISTEN:8888, fork /dev/null socat TCP6-LISTEN:8888, ipv6only=1, fork /dev/null 上述命令监控端口8888 上的TCP4 和TCP6 连接信息。 fork参数表示程序已经收到了。如果您继续运行而不分叉,程序将自动终止。
Socat 最初后面跟着一个双地址。这里我们使用/dev/null。这意味着丢弃所有收入信息。
TCP6-LISTEN 有一个特殊参数,称为ipv6only。这意味着接收到的数据包不应发送到IPv4 映射的IPv6 地址。
什么是IPv4映射的IPv6地址?简单来说,就是IPv4映射到IPv6地址。
运行上述命令将给出以下输出:
[1] 30877[2] 30885 返回在后台运行的进程ID。
使用ss检查TCP连接
ss是一个非常强大的命令,可以用来监控TCP套接字信息。
ss -hUsage: ss [ OPTIONS ] ss [ OPTIONS ] [ FILTER ] 检查以下常用参数。
-4, –ipv4 只显示IP 版本4 套接字-6, –ipv6 只显示IP 版本6 套接字-t, –tcp 只显示TCP 套接字-l, –listening 监听-n, –numeric don 因为我们只监听ipv4和ipv6数据,我们无法解析服务名,所以这里我们使用两个参数-4和-6。
另外,我们只需要监听TCP 套接字,因此需要使用-t 参数。
由于我们正在监视,因此我们使用-l 参数。最后,我们希望看到一个具体的数字,而不是将其解析为服务名称,因此我们在这里使用-n 参数。
让我们使用以下命令查看结果:
这是ss -4 -tln 的结果:
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 5 *:8888 *:* 表示端口8888 正在被监控。 当然,如果服务器上还有其他进程,可能还有除此之外的其他数据。
上述命令仅监视IPv4。我们来看看IPv6。
ss -6 -tln 可能会得到以下输出:
ss -6 -tlnState Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 5 :8888 :* 与Ipv4 非常相似,表示您正在侦听IPv6 上的端口8888。
使用nc连接socket
我构建了一个服务器来监视TCP 连接。接下来,尝试使用nc 命令进行连接。
nc代表Ncat,它是一个非常有用的网络工具,可以做很多事情。我们来看看这个例子中使用的参数。
-4 仅使用IPv4 -6 仅使用IPv6 -v, –verbose 设置详细级别(可多次使用) -z 零I/O 模式,仅报告连接状态IPv4 和IPv6,因此-4 和-6 参数是必要的。
此外,-v 参数是必需的,因为我们需要打印详细信息。最后,建立直接连接,不发送任何数据。那么我们这里使用-z参数来看看效果。
nc -4 -vz 127.0.0.1 8888 查看以下输出。
nc -4 -vz 127.0.0.1 8888Ncat: 版本7.50 (https://nmap.org/ncat)Ncat: 连接到127.0.0.1:8888.Ncat: 0 个字节发送,0 个字节接收0.01 秒nc 成功建立连接并发送0 我明白。内容字节。
同样,建立与IPv6 的连接。
nc -6 -vz :1 8888 :1 这里代表IPv6本地地址。输出是:
Ncat: Version 7.50 ( https://nmap.org/ncat )Ncat: 连接到:1:8888.Ncat: 发送0 字节,接收0 字节
总结
至此,我们已经介绍了套接字的基本分类,即流Soc 的含义。 socket,这个工具构建socket服务器和客户端。当然,这可以用来了解Stream Socket的流程。
本文包含在http://www.flydean.com/15-stream-socket/中。
最流行的解读、最深刻的资讯、最简洁的教程以及许多你不知道的小技巧等你来发现。
请关注我的公众号:“节目事宜”。如果你懂技术,你就会更懂我。
原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/85361.html