您当前的位置:首页 > 电脑百科 > 站长技术 > 服务器

linux服务器开发中网络数据分析与故障排查

时间:2020-04-25 18:45:08  来源:  作者:

一、 操作系统提供的网络接口

为了能更好的排查网络通信问题,我们需要熟悉操作系统提供的以下网络接口函数,列表如下:

linux服务器开发中网络数据分析与故障排查

 

注意:这里以bekeley提供的标准为例,不包括特定操作系统上特有的接口函数(如windows平台的WSASend,linux的accept4),也不包括实际与网络数据来往不相关的函数(如select、linux的epoll),这里只讨论与tcp相关的接口函数,像与udp相关的函数sendto/recvfrom等函数与此类似。

下面讨论一下以上函数的一些使用注意事项:

1、以上函数如果调用出错后,返回值均为-1;但是返回值是-1,不一定代表出错,这还得根据对应的套接字模式(阻塞与非阻塞模式)。

2、默认使用的socket函数创建的套接字是阻塞模式的,可以调用相关接口函数将其设置为非阻塞模式(Windows平台可以使用ioctlsocket函数,linux平台可以使用fcntl函数,具体设置方法可以参考这里。)。阻塞模式和非阻塞模式的套接字,对服务器的连接服务器和网络数据的收发行为影响很大。详情如下:

阻塞模式下,connect函数如果不能立刻连上服务器,会导致执行流阻塞在那里一会儿,直到connect连接成功或失败或网络超时;而非阻塞模式下,无论是否连接成功connect将立即返回,此时如果未连接成功,返回值将是-1,错误码是EINPROGRESS,表示连接操作仍然在进行中。Linux平台后续可以通过使用select/poll等函数检测该socket是否可写来判断连接是否成功。

阻塞套接字模式下,send函数如果由于对端tcp窗口太小,不足以将全部数据发送出去,将阻塞执行流,直到出错或超时或者全部发送出去为止;同理recv函数如果当前协议栈系统缓冲区中无数据可读,也会阻塞执行流,直到出错或者超时或者读取到数据。send和recv函数的超时时间可以参考下文关于常用socket选项的介绍。

非阻塞套接字模式下,如果由于对端tcp窗口太小,不足以将数据发出去,它将立刻返回,不会阻塞执行流,此时返回值为-1,错误码是EAGAIN或EWOULDBLOCK,表示当前数据发不出去,希望你下次再试。但是返回值如果是-1,也可能是真正的出错了,也可能得到错误码EINTR,表示被linux信号中断了,这点需要注意一下。recv函数与send函数情形一样。

3、send函数虽然名称叫“send”,但是其并不是将数据发送到网络上去,只是将数据从应用层缓冲区中拷贝到协议栈内核缓冲区中,具体什么时候发送到网络上去,与协议栈本身行为有关系(socket选项nagle算法与这个有关系,下文介绍常见套接字选项时会介绍),这点需要特别注意,所以即使send函数返回一个大于0的值n,也不能表明已经有n个字节发送到网络上去了。同样的道理,recv函数也不是从网络上收取数据,只是从协议栈内核缓冲区拷贝数据至应用层缓冲区,并不是真正地从网络上收数据,所以,调用recv时,操作系统的协议栈已经将数据从网络上收到自己的内核缓冲区中了,recv仅仅是一次数据拷贝操作而已。

4、由于套接字实现是收发全双工的,收和发通道相互独立,不会相互影响,shutdown函数是用来选择关闭socket收发通道中某一路(当然,也可以两路都关闭),其how参数取值一般有三个:SHUT_RD/SHUT_WR/SHUT_RDWR,SHUT_RD表示关闭收消息链路,即该套接字不能再收取数据,同理SHUT_WR表示关闭套接字发消息链路,但是这里有个问题,有时候我们需要等待缓冲区中数据发送完后再关闭连接怎么办?这里就要用到套接字选项LINGER,关于这个选项请参考下文常见的套接字选项介绍。最后,SHUT_RDWR同时关闭收消息链路和发消息链路。通过上面的分析,我们得出结论,shutdown函数并不会要求操作系统底层回收套接字等资源,真正会回收资源是close函数,这个函数会要求操作系统回收相关套接字资源,并释放对ip地址与端口号二元组的占用,但是由于tcp四次挥手最后一个阶段有个TIME_WAIT状态(关于这个状态下文介绍tcp三次握手和四次回收时会详细介绍),导致与该socket相关的端口号资源不会被立即释放,有时候为了达到释放端口用来复用,我们会设置套接字选项SOL_REUSEPORT(关于这个选项,下文会介绍)。综合起来,我们关闭一个套接字,一般会先调用shutdown函数再调用close函数,这就是所谓的优雅关闭:

linux服务器开发中网络数据分析与故障排查

 

5、常见的套接字选项

严格意义上说套接字选项是有不同层级的(level),如socket级别、TCP级别、IP级别,这里我们不区分具体的级别。

  • SO_SNDTIMEO与SO_RCVTIMEO

这两个选项用于设置阻塞模式下套接字,SO_SNDTIMEO用于在send数据由于对端tcp窗口太小,发不出去而最大的阻塞时长;SO_RCVTIMEO用于recv函数因接受缓冲区无数据而阻塞的最大阻塞时长。如果你需要获取它们的默认值,请使用getsockopt函数。

  • TCP_NODELAY

操作系统底层协议栈默认有这样一个机制,为了减少网络通信次数,会将send等函数提交给tcp协议栈的多个小的数据包合并成一个大的数据包,最后再一次性发出去,也就是说,如果你调用send函数往内核协议栈缓冲区拷贝了一个数据,这个数据也许不会马上发到网络上去,而是要等到协议栈缓冲区积累到一定量的数据后才会一次性发出去,我们把这种机制叫做nagle算法。默认打开了这个机制,有时候我们希望关闭这种机制,让send的数据能够立刻发出去,我们可以选择关闭这个算法,这就可以通过设置套接字选项TCP_NODELAY,即关闭nagle算法。

  • SO_LINGER

linger这个单词本身的意思,是“暂停、逗留”。这个选项的用处是用于解决,当需要关闭套接字时,协议栈发送缓冲区中尚有未发送出去的数据,等待这些数据发完的最长等待时间。

  • SO_REUSEADDR/SO_REUSEPORT

一个端口,尤其是作为服务器端端口在四次挥手的最后一步,有一个为TIME_WAIT的状态,这个状态一般持续2MSL(MSL,maximum segment life, 最大生存周期,RFC上建议是2分钟)。这个状态存在原因如下:1. 保证发出去的ack能被送达(超时会重发ack)2. 让迟来的报文有足够的时间被丢弃,反过来说,如果不存在这个状态,那么可以立刻复用这个地址和端口号,那么可能会收到老的连接迟来的数据,这显然是不好的。为了立即回收复用端口号,我们可以通过开启套接字SO_REUSEADDR/SO_REUSEPORT。

  • SO_KEEPALIVE

默认情况下,当一个连接长时间没有数据来往,会被系统防火墙之类的服务关闭。为了避免这种现象,尤其是一些需要长连接的应用场景下,我们需要使用心跳包机制,即定时从两端定时发一点数据,这种行为叫做“保活”。而tcp协议栈本身也提供了这种机制,那就是设置套接字SO_KEEPALIVE选项,开启这个选项后,tcp协议栈会定时发送心跳包探针,但是这个默认时间比较长(2个小时),我们可以继续通过相关选项改变这个默认值。

二、常用的网络故障排查工具

1.ping

ping命令可用于测试网络是否连通。

2.telnet

命令使用格式:

telnet ip或域名 port

例如:

telnet 120.55.94.78 8888

telnet www.baidu.com 80

结合ping和telnet命令我们就可以判断一个服务器地址上的某个端口号是否可以对外提供服务。

由于我们使用的开发机器以windows居多,默认情况下,windows系统的telnet命令是没有打开的,我们可以在【控制面板】- 【程序】- 【程序和功能】- 【打开或关闭Windows功能】中打开telnet功能。

linux服务器开发中网络数据分析与故障排查

 

3.host命令

host 命令可以解析域名得到对应的ip地址。例如,我们要得到www.baidu.com这个域名的ip地址,可以输入:

linux服务器开发中网络数据分析与故障排查

 

得到www.google.com的ip地址可以输入:

linux服务器开发中网络数据分析与故障排查

 

4 .netstat命令

常见的选项有:

-a (all)显示所有选项,netstat默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。(重要)
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名(macOS中表示协议 -p protocol)
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计 (重要)
-c 每隔一个固定时间,执行该netstat命令。

5. lsof命令

lsof,即list opened filedescriptor,即列出当前操作系统中打开的所有文件描述符,socket也是一种file descriptor,常见的选项是:

-i 列出系统打开的socket fd

-P 不要显示端口号别名

-n 不要显示ip地址别名(如localhost会用127.0.0.1来代替)

+c w 程序列名称最大可以显示到w个字符。

常见的选项组合为lsof –i –Pn:

linux服务器开发中网络数据分析与故障排查

 

可以看到列出了当前侦听的socket,和连接socket的tcp状态。

6.pstack

严格意义上来说,这个不算网络排查故障和调试命令,但是我们可以利用这个命令来查看某个进程的线程数量和线程调用堆栈是否运行正常。指令使用格式:

pstack pid

即,pstack 进程号,如:

linux服务器开发中网络数据分析与故障排查

 

7.nc命令

即netcat命令,这个工具在排查网络故障时非常有用,因而被业绩称为网络界的“瑞士军刀”。常见的用法如下:

  • 模拟服务器端在指定ip地址和端口号上侦听

nc –l 0.0.0.0 8888

  • 模拟客户端连接到指定ip地址和端口号

nc 0.0.0.0 8888

我们知道客户端连接服务器一般都是操作系统随机分配一个可用的端口号连接到服务器上去,这个指令甚至可以指定使用哪个端口号连接,如:

nc –p 12345 127.0.0.1 8888

客户端使用端口12345去连接服务器127.0.0.1::8888。

  • 使用nc命令发消息和发文件

客户端

linux服务器开发中网络数据分析与故障排查

 

服务器

linux服务器开发中网络数据分析与故障排查

 

8 .tcpdump

这个是linux系统自带的抓包工具,功能非常强大,默认需要开启root权限才能使用。

linux服务器开发中网络数据分析与故障排查

 

其常见的选项有:

-i 指定网卡

-X –XX 打印十六进制的网络数据包

-n –nn 不显示ip地址和端口的别名

-S 以绝对值显示包的ISN号(包序列号)

常用的过滤条件有如下形式:

tcpdump –i any ‘port 8888’
tcpdump –i any ‘tcp port 8888’
tcpdump –i any ‘tcp src port 8888’
tcpdump –i any ‘tcp src port 8888 and udp dst port 9999’
tcpdump -i any 'src host 127.0.0.1 and tcp src port 12345' -XX -nn -vv

关于tcpdump命令接下来将会以对tcp三次握手和四次挥手的包数据进行抓包来分析。

三、 tcp三次握手和四次挥手过程解析

熟练地掌握tcp三次握手和四次挥手过程的每一个细节是我们排查网络问题的基础。

linux服务器开发中网络数据分析与故障排查

 

下面我们来通过tcpdump抓包能实战一下三次握手的过程,假设我的服务器端的地址是 127.0.0.0.1 : 12345,使用nc命令创建一个服务器程序并在这个地址上进行侦听:

nc –v -l 127.0.0.0.112345

linux服务器开发中网络数据分析与故障排查

 

然后在客户端机器上开启tcpdump工具:

linux服务器开发中网络数据分析与故障排查

 

然后在客户端使用nc命令创建一个客户端去连接服务器:

linux服务器开发中网络数据分析与故障排查

 

我们抓到的包如下:

linux服务器开发中网络数据分析与故障排查

 

图片看不清,可以放大来看。上面我们需要注意的是:

三次握手过程是客户端先给服务器发送一个SYN,然后服务器应答一个SYN+ACK,应答的序列号是递增1的,表示应答哪个请求,即从4004096087递增到4004096088,接着客户端再应答一个ACK。这个时候,我们发现发包序列号和应答序列号都变成1了,这是tcpdump使用相对序号,我们加上-S选项后就变成绝对序列号了。

linux服务器开发中网络数据分析与故障排查

 

这是正常的tcp三次握手,假如我们连接的服务器ip地址存在,但监听端口号并不存在,我们看下tcpdump抓包结果:

linux服务器开发中网络数据分析与故障排查

 

这个时候客户端发送SYN,服务器应答ACK+RST:

linux服务器开发中网络数据分析与故障排查

 

这个应答包会导致客户端的connect连接失败。

还有一种情况就是客户端访问一个很遥远的ip,或者网络繁忙,服务器对客户端发送的网络SYN报文没有应答,会出现什么情况呢?

linux服务器开发中网络数据分析与故障排查

 

我们先将防火墙的已有规则都清理掉: iptables -F

然后给防火墙的INPUT链上增加一个规则,丢弃本地网卡lo(也就是127.0.0.1这个回环地址)上的所有SYN包。

linux服务器开发中网络数据分析与故障排查

 

接着,我们看到tcpdump抓到的数据包如下:

linux服务器开发中网络数据分析与故障排查

 

连接不上,一共重试了5次,重试的时间间隔是1秒,2秒,4秒,8秒,16秒,最后返回失败。这个重试次数在/proc/sys/net/ipv4/tcp_syn_retries 内核参数中设置,默认为6。

四次挥手与三次握手基本上类似,这里就不贴出tcpdump抓包的详情了。实际的网络开发中,尤其是高QPS的服务器程序,可能在在服务器程序所在的系统上留下大量非ESTABLISHED的中间状态,如CLOSE_WAIT/TIME_WAIT,我们可以使用以下指令来统计这些状态信息:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

得到结果可能类似:

linux服务器开发中网络数据分析与故障排查

 

让我们再贴一张tcp三次握手和四次挥手更清晰的图吧。

linux服务器开发中网络数据分析与故障排查

 

下面看下一般比较关心的三种TCP状态

  • SYN_RECV

服务端收到建立连接的SYN没有收到ACK包的时候处在SYN_RECV状态。有两个相关系统配置:

1、net.ipv4.tcp_synack_retries,整形,默认值是5

对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是三次握手机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。通常我们不对这个值进行修改,因为我们希望TCP连接不要因为偶尔的丢包而无法建立。

2、net.ipv4.tcp_syncookies

一般服务器都会设置net.ipv4.tcp_syncookies=1来防止SYN Flood攻击。假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟)。这些处在SYNC_RECV的TCP连接称为半连接,并存储在内核的半连接队列中,在内核收到对端发送的ack包时会查找半连接队列,并将符合的requst_sock信息存储到完成三次握手的连接的队列中,然后删除此半连接。大量SYNC_RECV的TCP连接会导致半连接队列溢出,这样后续的连接建立请求会被内核直接丢弃,这就是SYN Flood攻击。能够有效防范SYN Flood攻击的手段之一,就是SYN Cookie。SYN Cookie原理由D. J. Bernstain和 Eric Schenk发明。SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到SYN包并返回SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。观测服务上SYN_RECV连接个数为:7314,对于一个高并发连接的通讯服务器,这个数字比较正常。

  • CLOSE_WAIT

发起TCP连接关闭的一方称为client,被动关闭的一方称为server。被动关闭的server收到FIN后,但未发出ACK的TCP状态是CLOSE_WAIT。出现这种状况一般都是由于server端代码的问题,如果你的服务器上出现大量CLOSE_WAIT,应该要考虑检查代码。

  • TIME_WAIT

根据三次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态。TIME_WAIT状态将持续2MSL。TIME_WAIT状态下的socket不能被回收使用。 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务。TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证。和TIME_WAIT状态有关的系统参数有一般由3个,本机设置如下:

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_fin_timeout,默认60s,减小fin_timeout,减少TIME_WAIT连接数量。

net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

我们这里总结一下这些与tcp状态的选项:

u net.ipv4.tcp_syncookies=1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookie来处理,可防范少量的SYN攻击。默认为0,表示关闭。

u net.ipv4.tcp_tw_reuse=1 表示开启重用。允许将TIME-WAIT套接字重新用于新的TCP连接。默认为0,表示关闭。

u net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT套接字的快速回收。默认为0,表示关闭。

u net.ipv4.tcp_fin_timeout=30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

u net.ipv4.tcp_keepalive_time=1200 表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,这里改为20分钟。

u net.ipv4.ip_local_port_range=1024 65000 表示向外连接的端口范围。默认值很小:32768~61000,改为1024~65000。

u net.ipv4.tcp_max_syn_backlog=8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

u net.ipv4.tcp_max_tw_buckets=5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数 字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。

注意

上文中用加粗字体标识出来的两个参数:

net.ipv4.tcp_tw_recycle
net.ipv4.tcp_tw_reuse

在实际linux内核参数调优时并不建议开启。至于原因,我会单独用一篇文章来介绍。

四、 关于跨系统与跨语言之间的网络通信连通问题

如何在JAVA语言中去解析C++的网络数据包,如何在C++中解析Java的网络数据包,对于很多人来说是一件很困难的事情,所以只能变着法子使用第三方的库。其实使用tcpdump工具可以很容易解决与分析。

首先,我们需要明确字节序列这样一个概念,即我们说的大端编码(big endian)和小端编码(little endian),x86和x64系列的cpu使用小端编码,而数据在网络上传输,以及Java语言中,使用的是大端编码。那么这是什么意思呢?

我们举个例子,看一个x64机器上的32位数值在内存中的存储方式:

linux服务器开发中网络数据分析与故障排查

 

i在内存中的地址序列是0x003CF7C4~ 0x003CF7C8,值为40 e2 01 00。

linux服务器开发中网络数据分析与故障排查

 

十六进制0001e240正好等于10进制123456,也就是说小端编码中权重高的的字节值存储在内存地址高(地址值较大)的位置,权重值低的字节值存储在内存地址低(地址值较小)的位置,也就是所谓的高高低低。

相反,大端编码的规则应该是高低低高,也就是说权值高字节存储在内存地址低的位置,权值低的字节存储在内存地址高的位置。

所以,如果我们一个C++程序的int32值123456不作转换地传给Java程序,那么Java按照大端编码的形式读出来的值是:十六进制40E20100 = 十进制1088553216。

所以,我们要么在发送方将数据转换成网络字节序(大端编码),要么在接收端再进行转换。

下面看一下如果C++端传送一个如下数据结构,Java端该如何解析(由于Java中是没有指针的,也无法操作内存地址,导致很多人无从下手),下面利用tcpdump来解决这个问题的思路。

我们客户端发送的数据包:

linux服务器开发中网络数据分析与故障排查

 

其结构体定义如下:

linux服务器开发中网络数据分析与故障排查

 

利用tcpdump抓到的包如下:

linux服务器开发中网络数据分析与故障排查

 

放大一点:

linux服务器开发中网络数据分析与故障排查

 

我们白色标识出来就是我们收到的数据包。这里我想说明两点:

  • 如果我们知道发送端发送的字节流,再比照接收端收到的字节流,我们就能检测数据包的完整性,或者利用这个来排查一些问题;
  • 对于Java程序只要按照这个顺序,先利用java.net.Socket的输出流java.io.DataOutputStream对象readByte、readInt32、readInt32、readBytes、readBytes方法依次读出一个char、int32、int32、16个字节的字节数组、63个字节数组即可,为了还原像int32这样的整形值,我们需要做一些小端编码向大端编码的转换。


Tags:linux服务器   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
今日总监说32 服务器 磁盘占用率 超过80%多了 。不对啊 之前才清理过df -h 查看了一番 果然40g 用了33g。看了下历史会爆目录 也就5.3G 之前是服务生成临时下载的附件多。...【详细内容】
2021-12-10  Tags: linux服务器  点击:(17)  评论:(0)  加入收藏
在Linux系统下如何分享文件呢,你可能会想到用scp、rsync此类的命令,但都需要给出服务器密码,不安全。或者搭建一个ftp、nfs或samba的服务,分配个账号或划分个权限给其它人共享文...【详细内容】
2021-12-08  Tags: linux服务器  点击:(17)  评论:(0)  加入收藏
远程登录介绍目前是虚拟化、云计算的时代,今后的运维工作大概率接触不到物理服务器,因为大部分中小型互联网公司出于节省成本、便捷性等因素考虑会直接购买阿里云、腾讯云等云...【详细内容】
2021-10-21  Tags: linux服务器  点击:(96)  评论:(0)  加入收藏
Linux目录结构说明谈到Linux文件管理,首先我们需要了解的是要对文件做些什么事情,其实无非就是对一个文件进行创建、复制、移动、查看、编辑、压缩、查找、删除等等。 例如我...【详细内容】
2021-10-12  Tags: linux服务器  点击:(50)  评论:(0)  加入收藏
案例:100W 的客户端,每三分钟上传一次数据。数据库如何设计?能够查询所有记录? 官方 MySQL 集群方案MySQL ReplicationMySQL Replication 是 mysql 自带的功能,主从复制是通过重...【详细内容】
2021-08-05  Tags: linux服务器  点击:(68)  评论:(0)  加入收藏
在我们平常使用的开发或者测试环境,由于系统日志通常是debug级别,难免会碰到磁盘满的情况,这时候怎么办呢? 01—查找大文件一般来说,我们的系统或者应用通常部署在/opt目录...【详细内容】
2021-03-26  Tags: linux服务器  点击:(246)  评论:(0)  加入收藏
本文在分析服务器集群实现虚拟网络服务的相关技术上,详细描述了LVS集群中实现的三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR)的工作原理,以及它们的优缺点。1.前言我们先分析实现...【详细内容】
2021-03-11  Tags: linux服务器  点击:(104)  评论:(0)  加入收藏
重装服务器必备安装-精Linux查看版本当前操作系统内核信息 uname -a cat /proc/versionLinux查看当前操作系统版本信息3、 cat /etc/issue 或cat /etc/redhat-release(看CentO...【详细内容】
2020-09-01  Tags: linux服务器  点击:(98)  评论:(0)  加入收藏
1、账号安全基本使用:1 )用 户 信 息 文 件 /etc/passwd root:x:0:0:root:/root:/bin/bashaccount:password:UID:GID:GECOS:directory:shell用户名:密码:用户ID:组ID:用户说明:家目...【详细内容】
2020-08-15  Tags: linux服务器  点击:(157)  评论:(0)  加入收藏
一、RedHat/CentOS包管理1. 包管理工具RPM(1) 简介最早用在 RedHat的包管理器,现在已经成为Linux常见的包管理系统。RPM包有两种类型: 二进制RPM包 源码RPM包可以在www.rpmfi...【详细内容】
2020-08-12  Tags: linux服务器  点击:(90)  评论:(0)  加入收藏
▌简易百科推荐
阿里云镜像源地址及安装网站地址https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b111kK44P更新源之前把之前的国外的镜像先备份一下 切换到yumcd...【详细内容】
2021-12-27  干程序那些事    Tags:CentOS7镜像   点击:(1)  评论:(0)  加入收藏
前言在实现TCP长连接功能中,客户端断线重连是一个很常见的问题,当我们使用netty实现断线重连时,是否考虑过如下几个问题: 如何监听到客户端和服务端连接断开 ? 如何实现断线后重...【详细内容】
2021-12-24  程序猿阿嘴  CSDN  Tags:Netty   点击:(12)  评论:(0)  加入收藏
一. 配置yum源在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repovim /etc/yum.repos.d/google-chrome.repo按i进入编辑模式写入如下内容:[google-chrome]name=googl...【详细内容】
2021-12-23  有云转晴    Tags:chrome   点击:(7)  评论:(0)  加入收藏
一. HTTP gzip压缩,概述 request header中声明Accept-Encoding : gzip,告知服务器客户端接受gzip的数据 response body,同时加入以下header:Content-Encoding: gzip:表明bo...【详细内容】
2021-12-22  java乐园    Tags:gzip压缩   点击:(9)  评论:(0)  加入收藏
yum -y install gcc automake autoconf libtool makeadduser testpasswd testmkdir /tmp/exploitln -s /usr/bin/ping /tmp/exploit/targetexec 3< /tmp/exploit/targetls -...【详细内容】
2021-12-22  SofM    Tags:Centos7   点击:(7)  评论:(0)  加入收藏
Windows操作系统和Linux操作系统有何区别?Windows操作系统:需支付版权费用,(华为云已购买正版版权,在华为云购买云服务器的用户安装系统时无需额外付费),界面化的操作系统对用户使...【详细内容】
2021-12-21  卷毛琴姨    Tags:云服务器   点击:(6)  评论:(0)  加入收藏
参考资料:Hive3.1.2安装指南_厦大数据库实验室博客Hive学习(一) 安装 环境:CentOS 7 + Hadoop3.2 + Hive3.1 - 一个人、一座城 - 博客园1.安装hive1.1下载地址hive镜像路径 ht...【详细内容】
2021-12-20  zebra-08    Tags:Hive   点击:(9)  评论:(0)  加入收藏
以下是服务器安全加固的步骤,本文以腾讯云的CentOS7.7版本为例来介绍,如果你使用的是秘钥登录服务器1-5步骤可以跳过。1、设置复杂密码服务器设置大写、小写、特殊字符、数字...【详细内容】
2021-12-20  网安人    Tags:服务器   点击:(7)  评论:(0)  加入收藏
项目中,遇到了一个问题,就是PDF等文档不能够在线预览,预览时会报错。错误描述浏览器的console中,显示如下错误:nginx代理服务报Mixed Content: The page at ******** was loaded...【详细内容】
2021-12-17  mdong    Tags:Nginx   点击:(7)  评论:(0)  加入收藏
转自: https://kermsite.com/p/wt-ssh/由于格式问题,部分链接、表格可能会失效,若失效请访问原文密码登录 以及 通过密钥实现免密码登录Dec 15, 2021阅读时长: 6 分钟简介Windo...【详细内容】
2021-12-17  LaLiLi    Tags:SSH连接   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条