前言
作为一个网络研发来说tcpdump 是一个常用的工具,这是一个非常好用的抓包工具,我们可以根据tcpdump 的抓包内容查看当前的网络中的问题,
tcp三次握手和四次挥手
想要看懂抓包结果,必须要理解基本的网络协议,以tcp 的三次握手和四次挥手为例,参照下面的图和实际抓包内容就可以看懂tcp 的抓包报文了
tcp报文的flag
| tcp flag | ||
|---|---|---|
| 简写 | 全程 | 含义 |
| syn | Synchronization | 同步标志被用作在两个主机之间建立三方握手的第一步。只有来自发送方和接收方的第一个数据包才应该设置此标志。 |
| ack | Acknowledgment | 确认标志用于确认成功接收到数据包 |
| psh | Push | 推送标志与URG标志有些相似,并且告诉接收器在接收到这些包时处理这些包,而不是缓冲它们 |
| URG | Urgent | 指示在正常数据之前必须由网络堆栈处理的带外数据 |
| fin | Finish | 优雅地终止TCP连接 |
| rst | reset | 立即终止连接并丢弃任何传输中的数据 |
tcpdump 报文中的tcp flag
- “S” for SYN
- “.” (a single dot) for ACK
- “P” for PSH
- “F” for FIN
- “R” for RST
psh和urg标志
发送数据时,TCP 连接中的任何一方都可以额外使用 PSH 和 URG 标志(分别表示“推送”和“紧急”)。PSH 标志指示操作系统立即发送(对于发送方)和接收(对于接收方)数据。换句话说,此标志指示操作系统的网络堆栈立即发送/接收其缓冲区的全部内容。
如果没有此标志,操作系统可能会决定在将接收的数据发送或传递到应用程序之前等待,因为它希望等待发送或接收更多数据,以最大限度地利用主机和网络资源。但是,某些应用程序希望尽快发送和接收数据,例如使用 SSH 会话或在 HTTP 请求或响应结束时发送和接收数据。
URG 标志用于指示应优先于非紧急数据的“紧急”数据。这用于发送所谓的“带外数据”,操作系统以特殊方式处理该数据,并且通常表示应用程序协议中的某种异常。请注意,在实践中,TCP 的此功能很少使用。
终止tcp 链接
TCP 连接的任何一方都可以决定中止连接。当相关对等方认为由于某种原因不应存在连接时,就会这样做。在这种情况下,一个对等体发送设置了 RST 标志的数据包。另一个对等方在收到 RST 数据包后,必须立即停止发送任何数据。
当连接以这种方式中止时,传输中的数据和缓冲数据将丢失。因此,存在数据丢失的可能性,但如果此连接一开始无效,这应该不是问题。RST 数据包在现实生活中很少见,并且可能更多地用于恶意目的而不是合法目的。
fin 和rst 标志的区别
| 标题 | ||
|---|---|---|
| fin | rst | |
| 链接终止 | 优雅 | 粗暴 |
| 终止流程 | 4次握手 | 立即关闭 |
| 缓冲的数据 | 传输 | 丢弃 |
| 典型用法 | 正常的tcp链接 | 链接发送错误异常攻击等 |
一个rest 的例子
在红框圈出来的部分可以看到,在建立tcp 链接的建立过程中客户机发出syn包,服务机响应为rst ,表示立即断开,
如此可以判断网络的问题,我们根据报文就可以简单看到tcp链接建立失败的原因