Wireshark文档阅读笔记-TCP Flags

冷不防 2023-01-12 04:11 205阅读 0赞

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxNzg0NDI3NjE_size_16_color_FFFFFF_t_70

TCP flags是什么?

TCP flags存在于TCP数据包中,这个标志位暗示连接状态和一些额外的信息。这个标志位常用于故障诊断或是控制某种特定的连接下面介绍了TCP flags如:SYN、ACK、FIN。

List of TCP flags

每一个TCP flag的大小都是1bit。下面将介绍每一个标志位:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxNzg0NDI3NjE_size_16_color_FFFFFF_t_70 1

SYN:同步标志位,用于2台主机要建立连接时,第一次发出的数据包,在TCP三次握手中,前两次握手会带有SYN标志位,如上图的TCP三次握手。

ACK:确认位,用于说明前对方发过来的数据包成功收到,上图中可以看到,第二次握手时,Receiver发送的包里面带有ACK和SYN,ACK是告诉Sender,刚刚你发过来的SYN包,我已经收到了。

FIN:发送方发送FIN标志位,目的是告诉接收者,这是最后一个包了。

URG:urgent flag用于通知receiver进程这个包要优先处理,把其他包先放一边。

PSH:push flag功能也urgent一样,优先处理,只是带有这个标志位的包程序直接处理,不进入接收缓存中。

RST:reset flag是从receiver发送到sender的包中才有,表明需要重连。需要复位。

ECE:ECN响应标志被用来在TCP3次握手时表明一个TCP端是具备ECN功能的,并且表明接收到的TCP包的IP头部的ECN被设置为11。

CWR:拥塞窗口减少标志被发送主机设置,用来表明它接收到了设置ECE标志的TCP包。拥塞窗口是被TCP维护的一个内部变量,用来管理发送窗口大小。

NS:(experimental)还在试验中。

Analyzing TCP flags in the CLI

切换到root用户使用tcpdump

  1. sudo tcpdump

tcpdump可以运行去分析正在发送的数据包,以及展示数据包中任意的一个TCP标识,如果只想运行tcpdump运行一个特定的标志位用下面的命令:

  1. ACK - sudo tcpdump 'tcp[13] & 16 != 0'
  2. SYN - sudo tcpdump 'tcp[13] & 2 != 0'
  3. FIN - sudo tcpdump 'tcp[13] & 1 != 0'
  4. URG - sudo tcpdump 'tcp[13] & 32 != 0'
  5. PSH - sudo tcpdump 'tcp[13] & 8 != 0'
  6. RST - sudo tcpdump 'tcp[13] & 4 != 0'

下面是使用Wireshark抓的包

服务端用Java关键代码如下:

  1. package cn.it1995.demo;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. public class MyController {
  6. @GetMapping("/test")
  7. public String test(){
  8. return "test";
  9. }
  10. }

客户端用C++代码如下:

  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include <QNetworkAccessManager>
  4. #include <QNetworkReply>
  5. #include <QUrl>
  6. int main(int argc, char *argv[])
  7. {
  8. QCoreApplication a(argc, argv);
  9. QNetworkAccessManager manager;
  10. QNetworkRequest request;
  11. request.setUrl(QUrl("http://127.0.0.1:8080/test"));
  12. QNetworkReply *reply = manager.get(request);
  13. QObject::connect(reply, &QNetworkReply::finished, [&](){
  14. qDebug() << reply->readAll();
  15. qApp->exit();
  16. });
  17. return a.exec();
  18. }

抓包如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxNzg0NDI3NjE_size_16_color_FFFFFF_t_70 2

抽一个来看看:

这里以数据传输过程为例(不看3次握手,不看4次分手)

从中可以看到,客户端发起HTTP GET请求后,服务端会了个ACK的标志位,代表确认,看下

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxNzg0NDI3NjE_size_16_color_FFFFFF_t_70 3

此处可以看到只有ACK被设置为1。

这里有点要注意的,

ACK标志位:ACK标志位就是上面一直说的,1bit的那个,代表成功收到的响应。

ACK number:为确认号,4字节,也就是32位

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxNzg0NDI3NjE_size_16_color_FFFFFF_t_70 4

这个东西是确认号,这个是确认值,这个值是发送者的sequence number的值,发送者的sequence number是随机产生的,上面的这个服务端中ACK number为155,那么,看下,他之前的包:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxNzg0NDI3NjE_size_16_color_FFFFFF_t_70 5

这里可以看到其sequence number为155。

这里这个ACK的意思就是,我已经收到序列为155的数据包了。OVER。

发表评论

表情:
评论列表 (有 0 条评论,205人围观)

还没有评论,来说两句吧...

相关阅读