TCP详解与网络命令

2971 字
15 分钟
TCP详解与网络命令

TCP详解与网络命令#

[TOC]


前言#

TCP标志位
TCP标志位

SYN:建立连接 ACK:确认收到答复 FIN:断开连接

PSH:数据传输 RST:连接重置

  • tcp之所以称为稳定的,可靠的
    • 是因为建立连接的时候要经历三次握手!
    • 与端口建立连接

下面的三次握手,四次挥手都是基于TCP实现的

  • udp没有三次握手,不稳定

01.三次握手#

流程#

三次握手流程
三次握手流程

  • 第一次seq的值都是随机的
  • ack的值就是上一步seq的值加1

表明,上一个seq已经收到了,下一次seq的值就为我发的ack的值

  • 当客户端再次发送seq的时,为上一步接收到的ack的值

发了两次seq,第一次的已经收到,第二次为上一步指定的ack的值

小写的ack是加减的数字,表示的随机序列

而大写的ACK是标识符,SYN同理

⚠️ 注意:三次握手过程中,并没有任何数据的传输。三次握手之后,数据才开始传输

三次握手详解
三次握手详解

wireshark#

Wireshark
Wireshark

  • 常用于Windows,或者kali

Wireshark过滤
Wireshark过滤

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

过滤语法
过滤语法

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

抓包示例1
抓包示例1

抓包示例2
抓包示例2

抓包示例3
抓包示例3

抓包复现#

nc -kl#

这个命令选项强大之处,在于可以创建指定的端口

nc命令
nc命令

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

抓包步骤1
抓包步骤1

抓包步骤2
抓包步骤2

抓包步骤3
抓包步骤3

还有一个包,可以盲猜到。
ack=seq(服务端)+1=7910
seq=ack=7307 # 因为他已发过一次seq了
ACK标识符,建立连接。

面试题#

为什么要三次握手?

(1)避免旧的重复的SYN请求突然到达服务端,造成错误连接

可能因为网络的延迟,或者波动,SYN请求到的晚

  • 错误连接后,会持续占用服务器资源
  • 防止服务器错误连接后,浪费资源

(2)同步初始序列号,为后续可靠传输打基础

(3)确认双方收发能力,通过”你发我收、我发你收”的交互

  • 确认客户端和服务端的发送和接收能力都正常

简记:防旧连、同步号、验能力

状态变化#

状态变化1
状态变化1

状态变化2
状态变化2

判断客户端还是服务端的依据?

不是说Linux一定就是服务端。你得看是谁访问谁,比如我们的Linux访问百度,那么我们的Linux就是客户端


02.四次挥手#

断开连接

四次挥手流程
四次挥手流程

  • 客户端可以提出断开连接,当然也可以是服务端

男生可以主动提出分手,当然女生也可以提出分手

  • 这里是客户端断开连接

四次挥手详解1
四次挥手详解1

四次挥手详解2
四次挥手详解2

因为是断开连接嘛,也就是说他们之前是经历过三次握手的

  • 假设当时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

抓包复现#

客户端可以提出断开连接,当然也可以是服务端
我们在还原这个过程时候,我们是在服务端直接断开连接的
  • 主动断开连接的是服务端,所以和上面的有些不同,了解即可!

抓包1
抓包1

抓包2
抓包2

抓包3
抓包3

抓包4
抓包4

抓包5
抓包5

面试题#

为什么要四次挥手?

TCP 四次挥手是为了可靠地断开连接,确保双方都完成数据传输并安全关闭

(1)TCP 是全双工通信:连接两端可同时收发数据,因此每方需独立关闭自己的发送通道

(2)确保数据完整传输主动关闭方(A)发送 FIN 表示”我发完了”,被动方(B)收到后可继续发送剩余数据,再发自己的 FIN

(3)防止数据丢失:通过 ACK 确认机制,保证 FIN 被正确接收

简记:全双工、分步关、保可靠

状态变化#

状态变化
状态变化

为什么TIME_WAIT 状态还需要等2MSL秒之后才能返回到CLOSED 状态呢?*

在最后发送ACK的时候,对方可能因为网络延迟或者波动,没有收到

  • 无法保证最后发送的ACK报文一定会被对方收到

对方没收到ACK就无法关闭连接,就会再一次发送FIN 我们再次收到FIN后,说明刚发的ACK丢了,需要再次发送

  • 重发可能丢失的ACK报文

TIME_WAIT
TIME_WAIT

异常状态#

异常状态
异常状态

服务端在发送ACK时丢包了,结果客户端只收到了FIN,它发送了最后的ACK

在这个异常的状态中,服务端是没有任何影响的,完美的到达了CLOSED

异常状态详解
异常状态详解


🧣访问百度的全过程#

访问百度1
访问百度1

访问百度2
访问百度2


03.常用网络命令#

网络命令概览
网络命令概览

Terminal window
yum install -y net-tools lsof nethogs iftop telnet nc nmap tcpdump iftop
# 我们先来安装一些常见的命令

tcpdump#

常用于Linux抓包

Terminal window
# 常用选项
[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

过滤主机

Terminal window
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 # 指定目的地址

过滤端口

Terminal window
tcpdump -i eth1 port 80 # 抓取所有经过eth1,目的或源端口是80的网络数据
tcpdump -i eth1 src port 80 # 指定源端口
tcpdump -i eth1 dst port 80 # 指定目的端口

协议过滤

Terminal window
tcpdump -i eth1 arp
tcpdump -i eth1 ip
tcpdump -i eth1 tcp
tcpdump -i eth1 udp
tcpdump -i eth1 icmp
# 抓tcp某端口的数据包
tcpdump -i eth0 tcp port 21 -nn # 端口和协议的组合

常用表达式

Terminal window
非:! 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)))'

tcpdump示例
tcpdump示例

实例#

企业中遇到无法远程连接排错流程:IDC机房服务器 / 云服务器
能ping通,但无法ssh远程连接。
通过云服务器管理页面或者跑去机房连接服务器抓包:
tcpdump -nnvvi ens33 port 12345
在公司电脑使用telnet连接测试:
Xshell窗口 --> telnet 服务器IP地址 12345
结果:
先去查看自己公司的公网IP地址,对比是否和抓包的源IP一致
- 如果服务端可以看到来源公网IP地址并一致,说明服务端做的限制(安全工具,比如防火墙)
- 如果服务端来源IP地址不是公司公网IP地址,则需要放行抓取到的公网(打电话解决)
说明中间做了二次NAT,转为别的公网IP了
- 如果服务端收不到任何信息,说明是公司网络问题

nmap#

网络嗅探,搜寻开放端口

nmap
nmap

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

nmap端口
nmap端口

-p 用来指定端口

Terminal window
[root@oldboy ~]# nmap www.baidu.com
Starting Nmap 7.92 ( https://nmap.org ) at 2026-01-08 17:50 CST
Nmap 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 SERVICE
25/tcp open smtp
80/tcp open http
110/tcp open pop3
143/tcp open imap
443/tcp open https

netstat#

查看当前系统中运行了哪些服务端口

Terminal window
# 常用选项
-l # 只显示监听套接字
-n # 不做名字解析
-t # 显示tcp端口
-u # 显示udp端口
-p # 显示pid和服务名字
-r # 显示路由表
-a # 显示所有的套接字
# 用于显示所有 TCP 和 UDP 的监听端口、进程 PID 和服务名,且不进行域名解析
[root@oldboy ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1047/sshd: /usr/sbi
tcp6 0 0 :::22 :::* LISTEN 1047/sshd: /usr/sbi
tcp6 0 0 :::21 :::* LISTEN 1053/vsftpd
udp 0 0 127.0.0.1:323 0.0.0.0:* 757/chronyd
udp6 0 0 ::1:323 :::* 757/chronyd
# 用于显示路由表
[root@oldboy ~]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default _gateway 0.0.0.0 UG 0 0 0 ens33
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33

ss命令#

两者参数和概念高度相似

Terminal window
# netstat 已逐渐被 ss 取代,因为 ss 更快、功能更强
# 如果你的网站访问量比较大,那么建议用ss命令,而不是netstat
# 常用选项
-l # 只显示监听套接字
-n # 不做名字解析
-t # 显示 tcp 端口
-u # 显示 udp 端口
-p # 显示 pid 和服务名字
-r # 解析主机名
-a # 显示所有的套接字

综合案例#

ss综合案例
ss综合案例

-ant#

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

ss -ant
ss -ant

ESTAB就是已经建立连接了

  • 结合awk进行过滤

awk过滤
awk过滤

-lntup#

ss -lntup
ss -lntup

追踪命令#

什么时候用这个命令?

  • 访问你自己的网站突然发现访问不了了
  • 或者有一部分用户访问说访问起来太慢了
  • 检查道路是否通畅
    • 一般来说,前面这几跳在我们内网,延迟非常小
    • 越往后面走,延迟会高一点

Windows#

Windows用的非常多

tracert#

tracert
tracert

  • 这个命令最多追踪30跳
  • 中间有很多的”请求超时”
    • 一些关键的服务器,有防护
    • 收到了,不回你

Linux#

用的少,一般都在Windows上使用

traceroute#
Terminal window
yum -y install traceroute

traceroute
traceroute

  • -n 选项的作用是:不将 IP 地址解析为域名
  • -I:表示使用 ICMP协议来进行探测
    • 默认的为 UDP 数据包
    • 有些防火墙会丢弃 UDP 包但允许 ICMP

traceroute示例
traceroute示例

iftop#

iftop是一个在 Linux 系统下用于实时监控网络流量的工具

  • 它可以帮助用户了解当前的网络使用情况
  • 包括哪些 IP 地址正在与本地主机通信
  • 以及数据传输的速度等

iftop
iftop

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

iftop界面
iftop界面

  • TX:发送流量
  • RX:接收流量
  • TOTAL:总流量

iftop各种选项,都在这里了

iftop选项
iftop选项

nethogs#

用于查看正在传输数据的进程,以及实时传送的速度,KB

Terminal window
yum install nethogs

这个命令高并发的时候可能会卡死

nethogs1
nethogs1

nethogs2
nethogs2

nethogs3
nethogs3

lsof命令#

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

lsof
lsof

Terminal window
-n # 就是不解析为主机名,也就是露出它的IP地址
-P # 同理露出端口号(这个是大P)

-P 选项,就是从ssh —> 22端口

lsof -P
lsof -P

Terminal window
[root@oldboy ~]# lsof -i:22
# 指定端口号,不要忘记加:冒号
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 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)

对比#

lsof对比
lsof对比

面试题#

检查端口是否存在?

端口检查
端口检查

🏂命令小结#

命令小结
命令小结

文章分享

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

TCP详解与网络命令
https://www.kpyun.fun/posts/basics/netops/netops04/
作者
久棹
发布于
2025-10-20
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录