Linux TCP6监听详解 (linux tcp6 listen)

在 Linux 系统中,TCP6 监听是指通过 IPv6 协议监听本地的一个端口,以接受远程客户端的网络请求。TCP6 监听被广泛应用于服务器程序的开发中,它可以让服务器程序成为一个网络服务,提供对客户端的响应和处理。

本文将从以下几个方面详细介绍 Linux TCP6 监听的工作原理和使用方法。

一、TCP6 监听的工作原理

TCP6 监听是通过创建一个基于 IPv6 协议的套接字来实现的。在 Linux 中,我们可以使用 socket() 系统调用创建一个 IPv6 套接字,并使用 bind() 系统调用将套接字绑定到一个本地端口上。绑定完成后,我们可以使用 listen() 系统调用让套接字开始监听客户端连接请求。

当一个客户端连接请求到达套接字时,系统会将这个请求放入一个称为”待处理连接列表“的队列中。这个队列中存储着所有已经建立连接但还未被服务器程序 accept() 的连接。服务器程序调用 accept() 系统调用时,会从待处理连接列表中取出一个连接,并将该连接返回给用户程序。用户程序可以使用这个连接来和客户端进行通信。

如果待处理连接列表已满,那么新的连接请求将被系统拒绝。在 Linux 中,我们可以使用 sysctl 命令来调整系统对待处理连接列表的大小。

二、TCP6 监听的使用方法

在 Linux 中,我们可以使用 C 语言编写程序来实现 TCP6 监听功能。以下是一个简单的示例程序:

“`c

#include

#include

#include

#include

#include

#include

#include

#define PORT 12345

#define MAX_PENDING_CONNECTIONS 10

int mn() {

int server_sockfd, client_sockfd;

struct sockaddr_in6 server_address, client_address;

socklen_t client_address_len;

char buf[1024];

// create a IPv6 TCP socket

if ((server_sockfd = socket(AF_INET6, SOCK_STREAM, 0))

perror(“fled to create server socket”);

exit(EXIT_FLURE);

}

// bind the socket to a local address

memset(&server_address, 0, sizeof(server_address));

server_address.sin6_family = AF_INET6;

server_address.sin6_port = htons(PORT);

server_address.sin6_addr = in6addr_any;

if (bind(server_sockfd, (struct sockaddr*) &server_address,

sizeof(server_address))

perror(“fled to bind server socket to port”);

exit(EXIT_FLURE);

}

// listen for incoming connections

if (listen(server_sockfd, MAX_PENDING_CONNECTIONS)

perror(“fled to listen on server socket”);

exit(EXIT_FLURE);

}

printf(“Listening on port %d…\n”, PORT);

while (1) {

// accept a new client connection

client_address_len = sizeof(client_address);

if ((client_sockfd = accept(server_sockfd,

(struct sockaddr*) &client_address,

&client_address_len))

perror(“fled to accept client connection”);

exit(EXIT_FLURE);

}

printf(“Accepted a new client connection.\n”);

// read data from client

memset(buf, 0, sizeof(buf));

if (read(client_sockfd, buf, sizeof(buf))

perror(“fled to read from client”);

exit(EXIT_FLURE);

}

printf(“Received data from client: %s”, buf);

// write data back to client

if (write(client_sockfd, “Hello, world!\n”, 14)

perror(“fled to write to client”);

exit(EXIT_FLURE);

}

printf(“Sent data back to client.\n”);

// close the connection

close(client_sockfd);

}

// close the server socket

close(server_sockfd);

return EXIT_SUCCESS;

}

“`

这个程序实现了一个简单的 TCP6 服务器,它通过监听本地的 12345 端口,接受客户端连接,并向客户端发送”Hello, world!“的消息。程序的主要流程如下:

– 创建一个基于 IPv6 的 TCP 套接字;

– 将套接字绑定到本地 12345 端口上;

– 启动监听功能,开始等待客户端连接请求;

– 当一个客户端连接上来时,使用 accept() 函数接受连接,并读取从客户端发送来的数据;

– 向客户端发送一条欢迎消息,并关闭连接。

三、

相关问题拓展阅读:

linux怎样查看安装的apache

root@raykaeso ~># netstat -ntlp //查看服务器运行的进程服务和监听端口

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp.0.0.1:8005 0.0.0.0:* LISTEN 16725/java

tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN 16725/裤陪java

tcp.0.0.1:.0.0.0:* LISTEN 2138/mongod

tcp 0 0 0.0.0.0:8010 0.0.0.0:* LISTEN 14335/java

tcp 0 0 0.0.0.0:.0.0.0:* LISTEN 859/memcached

tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 16725/java

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 872/耐森httpd

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 873/sshd

tcp6 0 0 :::3306 :::* LISTEN 23443/mysqld

tcp6 0 0 :::11211 :::* LISTEN 859/memcached

tcp6 0 0 :::22 :::* LISTEN 873/昌纯亩sshd

【tcp】为什么 netstat 对某些服务只显示了 tcp6 监听端口?

在 Linux 中,默认情况下,AP_ENABLE_V4_MAPPED 是 1,那么 httpd 就会直接监听 ipv6, 因为此罩汪时 ipv6 的 socket 能够处理 ipv4 的请求;

另外,bind() 系统调用会对用户空间的进程透明处理 ipv6 没有开启的情况,此时会监听到 ipv4。

netstat 只是很真实的显示监听的端口而已,但是需要注意 ipv6 实际上在 Linux 上也支枣闷冲持 ipv4。

解决tcp6问题

Linux中tcp与tcp6区别是什么?

为什么 netstat 对某些服务只显示了 tcp6 监听端凳歼口?

怎么样在终端上查看vnc在linux服务器上的端口号

一个概念:在Linux只有只读文件、只读目录,没有只读用户。迅改

要实现你这一点,得修改整个系统文件和目录都为只读,这样很不好,危险:

chmod -R/

同时把登录用户(例如:user1)的目录(目录是:/home/user1)的权限改成:

chmod -R/home/user1

这样的话user1用户就只有对这个系统的只读权限了,只是登录这个举灶用户面临着一大堆的警告/错误提正昌扮示。

#netstat -lp|grep -i vnc

(Not all processes could be identified, non-owned process info

will not be shown, you would have to be root to see it all.)

tcp 0 *:*:*LISTEN/Xvnc

tcp 0 *:*:*LISTEN/Xvnc

tcp 0 *:*:*LISTEN/Xvnc

unix STREAM LISTENING07/码烂Xvnc@/tmp/大模绝.X11-unix/X1

unix STREAM LISTENING07/Xvnc/tmp/.X11-unix/滚姿X1

对于 Linux 系统管理员来说,清楚某个服务是否正确地绑定或监听某个端口,是至关重要的。如果你需要处理端口相关的问题.

端口是 Linux 系统上特定进程之间逻辑连接的标识,包括物理端口和软件端口。由于 Linux 操作系统是一个软件,因此本文只讨论软件端口。软件端口始终与主机的 IP 地址和相关的通信协议相关联,因此端口常用于区分应用程序。大部分涉及到网络的服务都必须打开一个套接字来监听传入的网络请求,而每个服务都使用一个独立的套接字。

方法 1:使用 ss 命令

ss 一般用于转储套接字统计信息。它能够输出类似于 netstat 输出的信息,但它可以比其它工具显示更多的 TCP 信息和状态信息。

它还埋册可以显示所有类型的套接字统计信息,包括 PACKET、TCP、UDP、DCCP、RAW、Unix 域等。

# ss -tnlp | grep sshLISTEN*:22 *:* users:((“sshd”,pid=997,fd=3))LISTEN:::22 :::* users:((“sshd”,pid=997,fd=4))

也可以使用端口号来检查。

# ss -tnlp | grep “:22″LISTEN*:22 *:* users:((“sshd”,pid=997,fd=3))LISTEN:::22 :::* users:((“sshd”,pid=997,fd=4))

方法 2:使用 netstat 命令

netstat 能够显弯裤宏示网络连接、路由表、接口统计信息、伪装连接以及多播成员。

默认情况下,netstat 会列出打开的套接字。如果不指定任何地址族,则会显示所有已配置地址族的活动套接字。但 netstat 已经过时了,一般会使用 ss 来替代。

# netstat -tnlp | grep sshtcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 997/sshd

tcp6 0 0 :::22 :::* LISTEN 997/sshd

也可以使用端口号来检查。

# netstat -tnlp | grep “:22″tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1208/sshd

tcp6 0 0 :::22 :::* LISTEN 1208/sshd

方法 3:使用 lsof 命令

lsof 能够列出打开的文件,并列出系统上被进程打开的文件的相关信息。

# lsof -i -P | grep sshCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

sshdroot 3u IPvt0 TCP *:22 (LISTEN)sshdroot 4u IPvt0 TCP *:22 (LISTEN)sshdroot 3u IPvt0 TCP vps.2daygeek.com:ssh->103.5.134.167:49902 (ESTABLISHED)

也可以使用端口号来检查。

# lsof -i tcp:22COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

sshd 1208 root 3u IPvt0 TCP *:ssh (LISTEN)sshd 1208 root 4u IPvt0 TCP *:ssh (LISTEN)sshdroot 3u IPvt0 TCP vps.2daygeek.com:ssh->103.5.134.167:49902 (ESTABLISHED)

方法 4:使用 fuser 命令

fuser 工具会将本地系统上打开了文件的进程的进程 ID 显示在标准输出中纯清。

# fuser -v 22/tcpUSER PID ACCESS COMMAND22/tcp: root 1208 F…. sshd

rootF…. sshd

rootF…. sshd

方法 5:使用 nmap 命令

nmap(“Network Mapper”)是一款用于网络检测和安全审计的开源工具。它最初用于对大型网络进行快速扫描,但它对于单个主机的扫描也有很好的表现。

nmap 使用原始 IP 数据包来确定网络上可用的主机,这些主机的服务(包括应用程序名称和版本)、主机运行的操作系统(包括操作系统版本等信息)、正在使用的数据包过滤器或防火墙的类型,以及很多其它信息。

# nmap -sV -p 22 localhostStarting Nmap 6.40 ( ) at:36 ISTNmap scan report for localhost (127.0.0.1)Host is up (0.000089s latency).Other addresses for localhost (not scanned): 127.0.0.1PORT STATE SERVICE VERSION22/tcp open ssh OpenSSH 7.4 (protocol 2.0)Service detection performed. Please report any incorrect results at .Nmap done: 1 IP address (1 host up) scanned in 0.44 seconds

方法 6:使用 systemctl 命令

systemctl 是 systemd 系统的控制管理器和服务管理器。它取代了旧的 SysV 初始化系统管理,目前大多数现代 Linux 操作系统都采用了 systemd。

# systemctl status sshd● sshd.service – OpenSSH server daemonLoaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)Active: active (running) since Sun:08:56 EDT; 6h 11min agoDocs: man:sshd(8)man:sshd_config(5)Main PID:(sshd)CGroup: /system.slice/sshd.service└─11584 /usr/in/sshd -DSep 23 02:08:56 vps.2daygeek.com systemd: Starting OpenSSH server daemon…Sep 23 02:08:56 vps.2daygeek.com sshd: Server listening on 0.0.0.0 port 22.Sep 23 02:08:56 vps.2daygeek.com sshd: Server listening on :: port 22.Sep 23 02:08:56 vps.2daygeek.com systemd: Started OpenSSH server daemon.Sep 23 02:09:15 vps.2daygeek.com sshd: Connection closed by 103.5.134.167 portSep 23 02:09:41 vps.2daygeek.com sshd: Accepted password for root from 103.5.134.167 portssh2

以上输出的内容显示了最近一次启动 sshd 服务时 ssh 服务的监听端口。但它不会将最新日志更新到输出中。

# systemctl status sshd● sshd.service – OpenSSH server daemonLoaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)Active: active (running) since Thu:40:59 IST; 2 weeks 3 days agoDocs: man:sshd(8)man:sshd_config(5)Main PID: 1208 (sshd)CGroup: /system.slice/sshd.service├─ 1208 /usr/in/sshd -D├─23951 sshd: └─23952 sshd: Sep 23 12:50:36 vps.2daygeek.com sshd: Invalid user pi from 95.210.113.142 port 51666Sep 23 12:50:36 vps.2daygeek.com sshd: input_userauth_request: invalid user pi Sep 23 12:50:37 vps.2daygeek.com sshd: pam_unix(sshd:auth): check pass; user unknownSep 23 12:50:37 vps.2daygeek.com sshd: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=95.210.113.142Sep 23 12:50:37 vps.2daygeek.com sshd: pam_unix(sshd:auth): check pass; user unknownSep 23 12:50:37 vps.2daygeek.com sshd: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=95.210.113.142Sep 23 12:50:39 vps.2daygeek.com sshd: Failed password for invalid user pi from 95.210.113.142 portssh2Sep 23 12:50:39 vps.2daygeek.com sshd: Failed password for invalid user pi from 95.210.113.142 portssh2Sep 23 12:50:40 vps.2daygeek.com sshd: Connection closed by 95.210.113.142 portSep 23 12:50:40 vps.2daygeek.com sshd: Connection closed by 95.210.113.142 port

大部分情况下,以上的输出不会显示进程的实际端口号。这时更建议使用以下这个 journalctl 命令检查日志文件中的详细信息。

# journalctl | grep -i “openssh\|sshd”Sep 23 02:08:56 vps138235.vps.ovh.ca sshd: Received signal 15; terminating.Sep 23 02:08:56 vps138235.vps.ovh.ca systemd: Stopping OpenSSH server daemon…Sep 23 02:08:56 vps138235.vps.ovh.ca systemd: Starting OpenSSH server daemon…Sep 23 02:08:56 vps138235.vps.ovh.ca sshd: Server listening on 0.0.0.0 port 22.Sep 23 02:08:56 vps138235.vps.ovh.ca sshd: Server listening on :: port 22.Sep 23 02:08:56 vps138235.vps.ovh.ca systemd: Started OpenSSH server daemon.

via:

IIS7服务器管理工具是一款vnc软件,它可以批量管理、定时上传下载、同步操作、数据备份、到期提醒、自动更新。

IIS7服务器管理工具

linux tcp6 listen的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux tcp6 listen,Linux TCP6监听详解,linux怎样查看安装的apache,【tcp】为什么 netstat 对某些服务只显示了 tcp6 监听端口?,怎么样在终端上查看vnc在linux服务器上的端口号的信息别忘了在本站进行查找喔。


数据运维技术 » Linux TCP6监听详解 (linux tcp6 listen)