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。
还没有评论,来说两句吧...