Wireshark文档阅读笔记-TCP Flags

TCP flags是什么?

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

 

List of TCP flags

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

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

sudo tcpdump

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

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

 

下面是使用Wireshark抓的包

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

package cn.it1995.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @GetMapping("/test")
    public String test(){

        return "test";
    }
}

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

#include <QCoreApplication>
#include <QDebug>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QNetworkAccessManager manager;
    QNetworkRequest request;
    request.setUrl(QUrl("http://127.0.0.1:8080/test"));
    QNetworkReply *reply = manager.get(request);
    QObject::connect(reply, &QNetworkReply::finished, [&](){

        qDebug() << reply->readAll();
        qApp->exit();
    });

    return a.exec();
}

抓包如下:

抽一个来看看:

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

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

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

 

这里有点要注意的,

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

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

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

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

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

 

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页