【工作必备知识】Linux系统网络诊断与netstat命令

2024-06-12 05:28

本文主要是介绍【工作必备知识】Linux系统网络诊断与netstat命令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【工作必备知识】Linux系统网络诊断与netstat命令

大家好,我叫秋意零。

今天分享一篇Linux系统中与网络相关的干货(包含相关面试题),有可能对你理解网络有一定帮助。同时工作中网络诊断也时常使用,对排查问题有帮助,绝对干货。

如果有帮助记得点赞三连呀。

netstat 命令

netstat 网络连接状态查看命令,同时也是强大的强大的网络诊断工具,广泛应用于各种网络管理和故障排查场景中。

它还可以查看网络中的传输层(TCP、UDP)信息。所以你首先需要知道传输层对应的相关知识(此处不做过多介绍),由此我们可以引出TCP三次握手和四次挥手。

TCP三次握手

**简单介绍:**TCP三次握手是数据传输时采用的一种可靠性连接方式(建立连接形象比喻为握手🤝)。

服务器端对应的服务端口一直进入LISTEN监听状态,等待客户端连接。客户端和服务器端最后经过三次握手达到可靠性连接。可能会问:为啥是三次握手,而不是二次握手?后面有介绍哦。

**本篇重点:**TCP三次握手中客户端或服务器端,每次发送请求后都会进入某种状态(记住这些状态如图),这些状态我们在 Linux 系统中可以通过 netstat 命令进行查看,有助于对网络理解。

相关面试题:为什么TCP客户进程最后还要发送普通的TCP确认报文段呢?是否多余,或者是否可以使用两报文握手建立连接呢?

答案: 并不多余,不能简化为“两报文握手”

场景: 首先我们客户端发送TCP连接请求报文,如果该请求因为网络原因导致卡在了路上服务端没收到,造成了超时重传这时客户端需要重新发送TCP连接请求报文,这次服务器端收到信息后,进入ESTABLISHED 连接已建立状态

于是返回信息给客户端,同时客户端进入 ESTABLISHED 连接已建立状态,这时就可以传输数据了,数据传输完毕后进行关闭连接;

关闭连接后,这时服务器端收到了第一次TCP连接请求报文,于是服务器端进去ESTABLISHED 连接已建立状态,接着返回给客户端,但是客户端就懵逼了,说我没有发送连接请求,于是不理睬。这就导致服务器端一直进入连接状态并发送连接给客户端,导致资源浪费

解决方案: 如果采用三次握手就不会出现这种情况,因为服务器端接受到TCP连接请求后是进入SY-RCVD 同步已接受状态,而不是二次握手的 ESTABLISHED 连接已建立状态,SY-RCVD如果没有继续接受到对应的确认连接确认请求,根据超时策略是会中止的。

一句话总结: TCP采用三次握手,是为了防止已失效的连接请求报文段突然又传送到了TCP服务器端进程,导致资源的浪费和错误。

TCP四次挥手

**简单介绍:**TCP四次挥手是TCP建立连接之后需要进行释放连接的过程(释放建立连接形象比喻为挥手👋拜拜)。

TCP四次挥手同TCP三次握手中客户端或服务器端,每次发送请求后都会进入某种状态(记住这些状态如图),这些状态我们在 Linux 系统中可以通过 netstat 命令进行查看,有助于对网络理解。

**相关面试题:**TCP客户进程在发送完最后一个确认报文段后,为什么不直接进入关闭状态,而是要进入2MSL时间等待状态,2MSL后才进入关闭状态,这是否有必要呢?

答案:有必要

场景: 假设,这时服务器端进入了 CLOSE-WAIT关闭等待状态

接着客户端进入FIN-WAIT-2终止等待2状态(等待服务器端将剩下的数据传输完毕);

服务器端数据传输完毕后,发送通知给客户端,同时服务器端进入LAST-ACK最后关闭确认状态(等待客户端确认关闭请求信息);

客户端收到数据传输完毕通知后,发送关闭确认请求信息同时进入CLOSED关闭状态,这时因为网络出现故障,导致最后的关闭确认请求没有到达服务器端,从而服务器TCP连接未被关闭。然而服务器端因为超时发送最后的TCP释放连接请求,然而客户端已然进入了CLOSED关闭状态不理睬该请求,从而导致TCP连接无法正常关闭。

解决方案: 当客户端收到数据传输完毕通知后,发送关闭确认请求信息同时进入TIME-WAIT时间等待状态(一半是2MSL,2分钟),这个时间等待状态就是为了确保最后的关闭确认请求能顺利通知到服务器端;如果在这个等待时间之内没有收到服务器端,因为超时发送最后的TCP释放连接请求时,则视为TCP连接关闭成功。

一句话总结: 确保TCP服务器端进程,可以收到最后一个TCP确认报文段而进入关闭状态。另外,TCP客户进程在发送完最后一个TCP确认报文段后,再经过2MSL时长,就可以使本次连接持续时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的TCP连接,不会出现在旧连接中。

netstat 命令应用

netstat 命令详解,看我这篇:netstat 命令的详解

链接:https://www.qiuyl.com/2024/03/03/121

基础应用

1)查看SSH远程连接的监听状态

$ netstat -tulnpa
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      44841/docker-proxy
tcp        0      0 192.168.200.7:22        192.168.200.1:53570     ESTABLISHED 44987/sshd: root@pt
tcp        0      0 192.168.200.7:22        192.168.200.1:52043     ESTABLISHED 3284/sshd: root@pts
tcp6       0      0 :::9090                 :::*                    LISTEN      2901/prometheus
udp        0      0 192.168.200.7:68        192.168.200.1:67        ESTABLISHED 784/NetworkManager
udp        0      0 0.0.0.0:111             0.0.0.0:*                           1/systemd
udp        0      0 0.0.0.0:5355            0.0.0.0:*                           557/systemd-resolve
udp        0      0 127.0.0.1:323           0.0.0.0:*                           624/chronyd
...
...

上面第二行:tcp 0 0 192.168.200.7:22 192.168.200.1:53570 ESTABLISHED 44987/sshd: root@pt

可以看到,这是我们SSH远程连接所建立的TCP连接信息;本端地址192.168.200.7:22,远端地址192.168.200.1:53570,以及连接状态ESTABLISHED

PS:这里使用的VMware虚拟机,远端地址192.168.200.1是我宿主机NAT网卡的地址

2)统计tcp连接状态

$ netstat -ant | awk '{print $NF}' | sort | uniq -c1 established)3 ESTABLISHED9 LISTEN1 State1 TIME_WAIT

3)判断服务使用了什么协议

在不是-n参数时就能看到,服务使用的协议

  • -n:以数字形式显示地址和端口号,如果不加则以协议名称显示

相关面试题

1)建立连接的TCP链路,如果客户端主动断开连接,netstat如何查看链路连接状态

netstat -ant | grep "TIME_WAIT"

2)打印本机与9.110.120.130机器的连接信息、及连接数量

# 连接信息,这里以192.168.200.1为例
$ netstat -ant | grep 192.168.200.1 | grep  ESTABLISHED
tcp        0      0 192.168.200.7:22        192.168.200.1:52375     ESTABLISHED
tcp        0     36 192.168.200.7:22        192.168.200.1:52371     ESTABLISHED
# 连接数量
$ netstat -ant | grep 192.168.200.1 | grep  ESTABLISHED  | awk '{print $NF}' | uniq -c2 ESTABLISHED
更多应用场景
  1. 查看活动连接:使用 -a--all 选项,可以显示所有当前的TCP和UDP连接,包括监听状态的端口,这对于检查哪些服务正在运行和它们的连接状态非常有用。
  2. 监控网络状态:结合 -c--continuous 选项,netstat 可以周期性地输出网络连接信息,帮助实时监控网络状态的变化,比如检测是否有新的连接建立或旧的连接断开。
  3. 诊断端口问题:当服务无法启动或客户端无法连接到服务时,使用 -an--numeric-all 查看占用端口的进程ID(PID)和详细信息,有助于定位端口冲突或服务未正确绑定的问题。
  4. 统计网络流量和连接:通过 -s--statistics 选项,可以获得每个协议的统计信息,如TCP连接的建立、终止数量,以及数据包的发送、接收、丢失情况,有助于分析网络性能和瓶颈。
  5. 检查路由表:使用 -r--route 选项,可以显示IP路由表,这对于理解数据包如何在网络中转发以及排查路由问题至关重要。
  6. 多播和组播诊断:使用 -g--groups 选项可以显示多播组成员关系,对于诊断多播服务或应用的问题很有帮助。
  7. 接口统计信息:通过 -i--interfaces,可以查看各个网络接口的发送、接收字节数、错误率等信息,有助于评估网络接口的健康状况。
  8. 检测SYN洪水攻击:观察处于SYN_RECV状态的连接数量,如果异常增多,可能表明系统正遭受SYN洪水攻击。

End

这篇关于【工作必备知识】Linux系统网络诊断与netstat命令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1053319

相关文章

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa