TCP详解与网络命令
TCP详解与网络命令
[TOC]
前言

SYN:建立连接 ACK:确认收到答复 FIN:断开连接
PSH:数据传输 RST:连接重置
- tcp之所以称为稳定的,可靠的
- 是因为建立连接的时候要经历三次握手!
- 与端口建立连接
下面的三次握手,四次挥手都是基于TCP实现的
- udp没有三次握手,不稳定
01.三次握手
流程

- 第一次seq的值都是随机的
- ack的值就是上一步seq的值加1
表明,上一个seq已经收到了,下一次seq的值就为我发的ack的值
- 当客户端再次发送seq的时,为上一步接收到的ack的值
发了两次seq,第一次的已经收到,第二次为上一步指定的ack的值
小写的ack是加减的数字,表示的随机序列
而大写的ACK是标识符,SYN同理
⚠️ 注意:三次握手过程中,并没有任何数据的传输。三次握手之后,数据才开始传输

wireshark

- 常用于Windows,或者kali

- 指定协议的同时,指定端口
- https没有办法直接过滤,要过滤tsl

- 这里是两个等号,src源,dst目标



抓包复现
nc -kl
这个命令选项强大之处,在于可以创建指定的端口

tcp.port == 12306 # 过滤指定端口- 抓包过程中,记得关闭防火墙和selinux



还有一个包,可以盲猜到。ack=seq(服务端)+1=7910seq=ack=7307 # 因为他已发过一次seq了ACK标识符,建立连接。面试题
为什么要三次握手?
(1)避免旧的重复的SYN请求突然到达服务端,造成错误连接
可能因为网络的延迟,或者波动,SYN请求到的晚
- 错误连接后,会持续占用服务器资源
- 防止服务器错误连接后,浪费资源
(2)同步初始序列号,为后续可靠传输打基础
(3)确认双方收发能力,通过”你发我收、我发你收”的交互
- 确认客户端和服务端的发送和接收能力都正常
✅ 简记:防旧连、同步号、验能力
状态变化


判断客户端还是服务端的依据?
不是说Linux一定就是服务端。你得看是谁访问谁,比如我们的Linux访问百度,那么我们的Linux就是客户端
02.四次挥手
断开连接

- 客户端可以提出断开连接,当然也可以是服务端
男生可以主动提出分手,当然女生也可以提出分手
- 这里是客户端断开连接


因为是断开连接嘛,也就是说他们之前是经历过三次握手的
- 假设当时seq=667,ack=1000
- 客户端的seq为上一次ack想要的序列号1000=seq
- ack为下一次想要的序列号=上一次seq序列号+1=667+1=668=ack
- 服务端的seq为上一次ack想要的序列号668=seq
- ack为下一次想要的序列号=上一次seq序列号+1=1000+1=1001=ack
- 客户端发送seq为上一次ack,1001=seq
- ack=上一次seq序列号+1=669=ack
抓包复现
客户端可以提出断开连接,当然也可以是服务端我们在还原这个过程时候,我们是在服务端直接断开连接的- 主动断开连接的是服务端,所以和上面的有些不同,了解即可!





面试题
为什么要四次挥手?
TCP 四次挥手是为了可靠地断开连接,确保双方都完成数据传输并安全关闭
(1)TCP 是全双工通信:连接两端可同时收发数据,因此每方需独立关闭自己的发送通道
(2)确保数据完整传输:主动关闭方(A)发送 FIN 表示”我发完了”,被动方(B)收到后可继续发送剩余数据,再发自己的 FIN
(3)防止数据丢失:通过 ACK 确认机制,保证 FIN 被正确接收
✅ 简记:全双工、分步关、保可靠
状态变化

为什么TIME_WAIT 状态还需要等2MSL秒之后才能返回到CLOSED 状态呢?*
在最后发送ACK的时候,对方可能因为网络延迟或者波动,没有收到
- 无法保证最后发送的ACK报文一定会被对方收到
对方没收到ACK就无法关闭连接,就会再一次发送FIN 我们再次收到FIN后,说明刚发的ACK丢了,需要再次发送
- 重发可能丢失的ACK报文

异常状态

服务端在发送ACK时丢包了,结果客户端只收到了FIN,它发送了最后的ACK
在这个异常的状态中,服务端是没有任何影响的,完美的到达了CLOSED

🧣访问百度的全过程


03.常用网络命令

yum install -y net-tools lsof nethogs iftop telnet nc nmap tcpdump iftop# 我们先来安装一些常见的命令tcpdump
常用于Linux抓包
# 常用选项[root@oldboyedu ~]# yum -y install tcpdump
-i # 监听哪一个网卡-n # 不把ip解析成主机名-nn # 不把端口解析成应用层协议-c # 指定抓包的数量-S # 不把随机序列和确认序列解析成绝对值-w # 将流量保存到文件中,文件中的信息是无法直接查看的-r # 读取文件中的内容-v # 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息-vv # 输出详细的报文信息
# 常用组合-nnvvi ens33
# 保存到文件中[root@oldboy:~]# tcpdump -w 1.txt -nnvvi ens33 host www.baidu.com# 别忘了host
# 查看文件中的内容[root@oldboy:~]# tcpdump -r 1.txt过滤主机:
tcpdump -i eth1 host 192.168.1.1 # 抓取所有经过eth1,目的或源地址是192.168.1.1的网络数据tcpdump -i eth1 src host 192.168.1.1 # 指定源地址tcpdump -i eth1 dst host 192.168.1.1 # 指定目的地址过滤端口:
tcpdump -i eth1 port 80 # 抓取所有经过eth1,目的或源端口是80的网络数据tcpdump -i eth1 src port 80 # 指定源端口tcpdump -i eth1 dst port 80 # 指定目的端口协议过滤:
tcpdump -i eth1 arptcpdump -i eth1 iptcpdump -i eth1 tcptcpdump -i eth1 udptcpdump -i eth1 icmp
# 抓tcp某端口的数据包tcpdump -i eth0 tcp port 21 -nn # 端口和协议的组合常用表达式:
非:! or "not"且:&& or "and"或:|| or "or"
# 案例tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
实例
企业中遇到无法远程连接排错流程:IDC机房服务器 / 云服务器
能ping通,但无法ssh远程连接。通过云服务器管理页面或者跑去机房连接服务器抓包:tcpdump -nnvvi ens33 port 12345
在公司电脑使用telnet连接测试:Xshell窗口 --> telnet 服务器IP地址 12345
结果:先去查看自己公司的公网IP地址,对比是否和抓包的源IP一致- 如果服务端可以看到来源公网IP地址并一致,说明服务端做的限制(安全工具,比如防火墙)- 如果服务端来源IP地址不是公司公网IP地址,则需要放行抓取到的公网(打电话解决) 说明中间做了二次NAT,转为别的公网IP了- 如果服务端收不到任何信息,说明是公司网络问题nmap
网络嗅探,搜寻开放端口

- 可以以空格的方式,来写多个域名

-p 用来指定端口
[root@oldboy ~]# nmap www.baidu.com
Starting Nmap 7.92 ( https://nmap.org ) at 2026-01-08 17:50 CSTNmap scan report for www.baidu.com (39.156.70.239)Host is up (0.0069s latency).
Not shown: 995 filtered tcp ports (no-response)PORT STATE SERVICE25/tcp open smtp80/tcp open http110/tcp open pop3143/tcp open imap443/tcp open httpsnetstat
查看当前系统中运行了哪些服务端口
# 常用选项-l # 只显示监听套接字-n # 不做名字解析-t # 显示tcp端口-u # 显示udp端口-p # 显示pid和服务名字-r # 显示路由表-a # 显示所有的套接字
# 用于显示所有 TCP 和 UDP 的监听端口、进程 PID 和服务名,且不进行域名解析[root@oldboy ~]# netstat -lntupActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program nametcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1047/sshd: /usr/sbitcp6 0 0 :::22 :::* LISTEN 1047/sshd: /usr/sbitcp6 0 0 :::21 :::* LISTEN 1053/vsftpdudp 0 0 127.0.0.1:323 0.0.0.0:* 757/chronydudp6 0 0 ::1:323 :::* 757/chronyd
# 用于显示路由表[root@oldboy ~]# netstat -rnKernel IP routing tableDestination Gateway Genmask Flags MSS Window irtt Ifacedefault _gateway 0.0.0.0 UG 0 0 0 ens3310.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33ss命令
两者参数和概念高度相似
# netstat 已逐渐被 ss 取代,因为 ss 更快、功能更强# 如果你的网站访问量比较大,那么建议用ss命令,而不是netstat
# 常用选项-l # 只显示监听套接字-n # 不做名字解析-t # 显示 tcp 端口-u # 显示 udp 端口-p # 显示 pid 和服务名字-r # 解析主机名-a # 显示所有的套接字综合案例

-ant
查看我们的端口的连接状态

ESTAB就是已经建立连接了
- 结合awk进行过滤

-lntup

追踪命令
什么时候用这个命令?
- 访问你自己的网站突然发现访问不了了
- 或者有一部分用户访问说访问起来太慢了
- 检查道路是否通畅
- 一般来说,前面这几跳在我们内网,延迟非常小
- 越往后面走,延迟会高一点
Windows
Windows用的非常多
tracert

- 这个命令最多追踪30跳
- 中间有很多的”请求超时”
- 一些关键的服务器,有防护
- 收到了,不回你
Linux
用的少,一般都在Windows上使用
traceroute
yum -y install traceroute
-n选项的作用是:不将 IP 地址解析为域名-I:表示使用 ICMP协议来进行探测- 默认的为 UDP 数据包
- 有些防火墙会丢弃 UDP 包但允许 ICMP

iftop
iftop是一个在 Linux 系统下用于实时监控网络流量的工具
- 它可以帮助用户了解当前的网络使用情况
- 包括哪些 IP 地址正在与本地主机通信
- 以及数据传输的速度等

- 如果不加任何选项就是默认的网卡,也就是ens33网卡

- TX:发送流量
- RX:接收流量
- TOTAL:总流量
iftop各种选项,都在这里了

nethogs
用于查看正在传输数据的进程,以及实时传送的速度,KB
yum install nethogs这个命令高并发的时候可能会卡死



lsof命令
用于列出当前系统中被进程打开的文件

-n # 就是不解析为主机名,也就是露出它的IP地址-P # 同理露出端口号(这个是大P)-P 选项,就是从ssh —> 22端口

[root@oldboy ~]# lsof -i:22# 指定端口号,不要忘记加:冒号
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEsshd 1047 root 5u IPv4 27634 0t0 TCP *:ssh (LISTEN)sshd 1047 root 6u IPv6 27636 0t0 TCP *:ssh (LISTEN)sshd 1374 root 5u IPv4 30129 0t0 TCP oldboy:ssh->10.0.0.1:8717 (ESTABLISHED)sshd 1396 root 5u IPv4 30129 0t0 TCP oldboy:ssh->10.0.0.1:8717 (ESTABLISHED)对比

面试题
检查端口是否存在?

🏂命令小结

文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!




