作为程序员,网路问题经常遇到,熟悉抓包工具,会使我们排查网络问题时候,事半功倍!
由于抓包我们经常还会查看设备以及端口的一些信息,所以我们先介绍下netstat工具
netstat工具简介和使用
netstat是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、网络连接以及每一个网络接口设备的状态信息。netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
参数解释
shell -a: (all) 显示所有活动中的网络连接和机器正在监听的 TCP/UDP 端口 -r: (route): 显示路由表 -n: 以数字方式显示,禁用反向域名解析,加快查询速度 (默认是不带-n参数的,如果带了-n 输出将会很快,但是只有数字类型的ip,域名是没法看到的,如果不带-n将会看到域名(如有域名的话)) -t: (tcp) 显示tcp连接 -u: (udp) 显示udp连接 -l: (Listen) 只显示监听状态的套接字 -p: 输出中显示 PID 和进程名称 -s: 显示所有端口的统计信息 -i: 查看网卡接口信息
输出列名解释
shell Proto:显示连接使用的协议。 Recv-Q:发送队列 Send-Q:接收队列 Local Address:本地地址:端口。 Foreign Address:外部地址:端口。 state:显示套接口当前的状态。
常用命令
shell netstat -at #查看当前已经建立的tcp连接 netstat -au #列出所有 udp 端口 netstat -lt #只列出所有监听中的 tcp类型的 端口 netstat -lu #只列出所有监听中的 udp类型的端口 netstat -antp #查看所有已经建立的tcp连接,并且域名以数字形式显示 netstat -tupl #查看所有监听的tcp和udp及进程名信息(udp不能监听,但可以查看是否在占用) netstat -s #显示所有端口的统计信息 netstat -st 或 -su #显示 TCP 或 UDP 端口的统计信息 netstat -i #查看网卡接口信息 netstat -tulnp |grep nginx #查看nginx服务的网络信息
演示几个 查看所有监听状态的tcp端口(以ip形式显示)
查看所有监听状态的tcp端口(如有域名的话以域名形式显示)
查看所有端口情况(不进行反向域名解析)
......还有很多,这里就不一一演示了,只需要使用时根据需要灵活组合即可
TCP报文基本格式
上图中 TCP 报文中每个字段的含义如下:
源端口和目的端口字段
- TCP源端口(Source Port):源计算机上的应用程序的端口号,占 16 位。
- TCP目的端口(Destination Port):目标计算机的应用程序端口号,占 16 位。
序列号字段
序列号字段
和确认号字段
这两个字段是TCP可靠传输服务的关键部分,序列号是该报文段首字节的字节流编号(TCP把数据看成是有序的字节流,TCP隐式地对数据流的每个字节进行编号
)。这样理解可能更直观: 当报文被分解(拆包后
)成多个报文段时,序列号就是报文段首字节在整个报文的偏移量。而确认号字段则是指发送确认(ack)的一端所期望收到的下一个序号值
序列号(Sequence Number):占 32 位。 一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。每发送一次数据,就累加一次该数据字节的大小。序列号不会从零开始,而是在建立连接时通过计算机随机生成一个数,由SYN包传给接收端主机。\ 假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN(Initial Sequence Number,初始序号值)。那么在该传输方向上(从A到B),后续的TCP报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025.另外一个传输方向(从B到A)的TCP报文段的序号值也具有相同的含义
确认号字段
TCP 确认号(Acknowledgment Number,ACK Number):占 32 位。发送确认ack的一端所期望收到的下一个序号,标识期望收到的下一个段的第一个字节,并声明此前的所有数据已经正确无误地收到,因此,确认号应该是上次已成功收到的数据字节序列号加1。收到确认号的源计算机会知道特定的段已经被收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
数据偏移字段
TCP 首部长度(Header Length):由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*4 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值
保留字段
保留(Reserved):占 4 位。为 TCP 将来的发展预留空间,目前必须全部为 0。
标志位字段 CWR、ECE、URG、 ACK、PSH 、 RST 、 SYN、 FIN
- CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置 ECE 标志的 TCP 包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。
- ECE(ECN Echo):用来在 TCP 三次握手时表明一个 TCP 端是具备 ECN 功能的。在数据传输过程中,它也用来表明接收到的 TCP 包的 IP 头部的 ECN 被设置为 11,即网络线路拥堵。
- URG(Urgent):紧急指针标志,为1时表示紧急指针有效,该报文应该优先传送,为0则忽略紧急指针。
- ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。我们称携带ACK标识的TCP报文段为确认报文段。TCP 规定,连接建立后,ACK 必须为 1。
- PSH(Push):为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应优先将这个报文段交给应用程序,而不是在tcp内核缓冲区排队。
- RST:表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
- SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。
- FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接,我们称携带FIN标志的TCP报文段为结束报文段。
窗口大小字段
窗口大小(Window Size):占 16 位。它表示从 Ack Number 开始还可以接收多少字节的数据量,也表示当前接收端的接收窗口还有多少剩余空间(注意:实际的窗口大小 也和Window Scale选项有关)。该字段可以用于 TCP 的流量控制。
TCP 校验和字段
校验和(TCP Checksum):占 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。Checksum 是根据伪头 + TCP 头 + TCP 数据三部分进行计算的。\ 伪首部中包含: 4个字节保存源ip信息,4个字节目的ip信息,一个字节的保留位置,一个字节保存协议号(6代表tcp,17代表udp),2个字节保存tcp首部+数据的长度。