深入理解TCP协议格式(WireShark分析)

传输控制协议(TCP)是互联网中最为关键的通信协议之一。了解TCP协议的细节不仅对于网络工程师至关重要,对于任何涉及网络通信的软件开发人员而言都是必备的知识。本文旨在深入探讨TCP协议,从协议的基本概述到其工作机制,以及如何通过实际代码实现和工具分析来理解其运作。

TCP协议概述

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它的设计目的是为了提供一个可靠的端到端的数据传输服务,在不可靠的互联网环境中保证数据正确传输。

代码实操与分析

具体流程

TCP流程.png

代码实现

注意:下面代码为测试代码,没有异常处理

服务端

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>#pragma comment(lib, "ws2_32.lib")int main()
{WSADATA            wsaData;SOCKET             serverSocket, clientSocket;struct sockaddr_in server, client;int                c, recv_size;char               client_message[2000];// Initialize WinsockWSAStartup(MAKEWORD(2, 2), &wsaData);// Create a socketserverSocket = socket(AF_INET, SOCK_STREAM, 0);// Prepare the sockaddr_in structureserver.sin_family = AF_INET;server.sin_addr.s_addr = INADDR_ANY;server.sin_port = htons(8888);// Bindbind(serverSocket, (struct sockaddr *) &server, sizeof(server));// Listen to incoming connectionslisten(serverSocket, 3);// Accept an incoming connectionstd::cout << "Waiting for incoming connections..." << std::endl;c = sizeof(struct sockaddr_in);clientSocket = accept(serverSocket, (struct sockaddr *) &client, &c);std::cout << "Connection accepted" << std::endl;// Send a message to the clientconst char *welcome_message = "Hello, client!";send(clientSocket, welcome_message, strlen(welcome_message), 0);// Receive a message from clientrecv_size = recv(clientSocket, client_message, 2000, 0);if (recv_size > 0) {client_message[recv_size] = '\0';std::cout << "Client replies: " << client_message << std::endl;} else {std::cerr << "recv failed or connection closed by client" << std::endl;}// Send "quit" messageconst char *quit_message = "quit";send(clientSocket, quit_message, strlen(quit_message), 0);// Wait for client to disconnectrecv_size = recv(clientSocket, client_message, 2000, 0);if (recv_size == 0) {std::cout << "Client disconnected" << std::endl;} else {std::cerr << "Error occurred or unexpected data received" << std::endl;}// Cleanupclosesocket(clientSocket);closesocket(serverSocket);WSACleanup();return 0;
}

输出结果

image.png

客户端

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>#pragma comment(lib, "ws2_32.lib")int main(int argc, char *argv[])
{WSADATA            wsa;SOCKET             s;struct sockaddr_in server;const char *       server_address = "127.0.0.1";char               server_reply[2000];int                recv_size;// Initialising WinsockWSAStartup(MAKEWORD(2, 2), &wsa);// Create sockets = socket(AF_INET, SOCK_STREAM, 0);server.sin_family = AF_INET;server.sin_port = htons(8888);inet_pton(AF_INET, server_address, &server.sin_addr);// Connect to remote serverconnect(s, (struct sockaddr *) &server, sizeof(server));std::cout << "Connected" << std::endl;// Receive a reply from the serverrecv_size = recv(s, server_reply, 2000, 0);server_reply[recv_size] = '\0';std::cout << "Server: " << server_reply << std::endl;// Send replyconst char *message = "Hello";send(s, message, strlen(message), 0);// Receive final message from serverrecv_size = recv(s, server_reply, 2000, 0);server_reply[recv_size] = '\0';std::cout << "Server: " << server_reply << std::endl;// Close the socketclosesocket(s);WSACleanup();return 0;
}

输出结果

image.png

WireShark分析

使用WireShark工具捕获端口号为8888的数据:
image.png

分析捕获数据

我们按照捕获数据的顺序依次解读。

三次握手
  1. 第一次握手(SYN)
  • 源端口和目的端口:63148 → 8888
  • 标志位:[SYN]
  • 序列号(Seq):0,初始化序列号。
  • 窗口大小(Win):65535,表明客户端的接收窗口。
  • 长度(Len):0,无数据传输。
  • TCP选项:MSS=65495, WS=256, SACK_PERM,表明最大段大小、窗口缩放和选择性确认的支持。
  1. 第二次握手(SYN, ACK)
  • 源端口和目的端口:8888 → 63148
  • 标志位:[SYN, ACK]
  • 序列号和确认号:Seq=0, Ack=1,服务器确认客户端的SYN并提出自己的SYN。
  • 窗口大小:65535。
  1. 第三次握手(ACK)
  • 源端口和目的端口:63148 → 8888
  • 标志位:[ACK]
  • 序列号和确认号:Seq=1, Ack=1,客户端确认服务器的SYN。
  • 窗口大小:2619648,表示客户端的接收窗口大小已调整。
数据传输
  1. 服务器向客户端发送数据(PSH, ACK)
  • 数据长度:14,服务器发送14字节的数据。
  1. 客户端确认数据(ACK)
  • 确认号:Ack=15,客户端确认接收到15字节的数据。
  1. 客户端向服务器发送数据(PSH, ACK)
  • 数据长度:5,客户端发送5字节的数据。
  1. 服务器确认数据(ACK)
  • 确认号:Ack=6,服务器确认接收到6字节的数据。
  1. 服务器再次发送数据(PSH, ACK)
  • 数据长度:4,服务器发送4字节的数据。
  1. 客户端确认数据(ACK)
  • 确认号:Ack=19,客户端确认接收到总计19字节的数据。
四次挥手
  1. 客户端发起关闭连接(FIN, ACK)
  • 序列号和确认号:Seq=6, Ack=19,客户端请求关闭连接。
  1. 服务器确认关闭请求(ACK)
  • 确认号:Ack=7,服务器确认客户端的关闭请求。
  1. 服务器发起关闭连接(FIN, ACK)
  • 序列号和确认号:Seq=19, Ack=7,服务器同样请求关闭连接。
  1. 客户端确认服务器的关闭请求(ACK)
  • 确认号:Ack=20,客户端确认服务器的关闭请求。

TCP协议首部格式

TCP首部格式.png
上图展示了TCP协议首部的格式。

源端口号

源端口号是指发送端的端口号,字段长16位。

目标端口号

目标端口号是指接收端的端口号,字段长16位。

序列号

序列号简单来说就是在一个TCP报文段中第一个字节数据在总发送数据包中的位置,通过这个可以保证数据传输的顺序性和完整性。
字段长32位。

详细说明

序列号初始值

序列号在建立连接时会随机生成一个数值作为序列号的初始值,具体的流程如下:

  1. 第一次握手

客户端发送一个SYN(同步)包到服务端。这个SYN包包含了客户端选择的初始序列号(ISN_C)。
image.png
上图是WireShark捕捉到第一次握手数据中部分数据,其中红框框住的就是客户端生成的初始化序列号(ISN_C)。

  1. 第二次握手

服务端收到客户端的SYN包后,会回复一个SYN-ACK(同步确认)包。这个包包括服务端自己的一个初始序列号(ISN_S),以及对客户端初始序列号的确认号(即ISN_C+1)。
image.png
上图是WireShark捕捉到的第二次握手数据中部分数据,其中红框框住的就是服务端生成的初始化序列号(ISN_S),绿框框住的是客户端初始序列号的确认号(第一次握手中ISN_C的值是2977803439,当前确认号是2977803440,即ISN_C+1)。

  1. 第三次握手

客户端收到服务端的SYN-ACK包后,发送一个ACK(确认)包给服务端,其中包含的确认号是ISN_S+1。
image.png
上图是WireShark捕捉到的第三次握手数据中部分数据,其中红框框住的就是经过服务端确认过的客户端序列号(ISN_C),绿框框住的是服务端初始序列号的确认号(即ISN_S+1)。

注意
因为TCP是一个全双工协议,当客户端发送数据时,对应的序列号使用的是客户端的初始序列号,而服务端发送数据时,使用的是服务端的初始序列号。

序列号回绕

序列号字段占32位,意味着序列号可以在0到2^32-1之间变化。当序列号达到其最大值后,它会发送回绕(wrap around),重新从0开始。

既然是从0回绕了,那TCP是如何保证数据的顺序的呢?

我们先看测试代码:

// 未发送回绕
UINT32       s1 = 100;
UINT32       s2 = 200;
int          r1 = s1 - s2; // out: -100
// 发生回绕
UINT32       s3 = 4294967295;
UINT32       s4 = 1;
int          r2 = s3 - s4; // out: -2

这里通过无符号整型计算结果转有符号整型时发生溢出,结果将进行二进制位取反,然后加一得到补码,最终得到-2的结果。
所以这里是通过转int类型后判断结果是否小于0,小于0则表示s1在s2的前面,s3在s4的前面。

序列号的作用

  • 确保数据顺序:每个TCP段(数据包)都有一个序列号,用于标识从TCP连接的起点开始的数据流中的每个字节的位置。接收方可以通过这些序列号,将接收到的数据段重新组装成正确的顺序。
  • 数据重传:如果一个数据包在传输过程中丢失或错误,接收方可以检测到丢失的数据段并请求发送方重传那些数据。序列号使得发送方能够确定需要重传哪些数据。
  • 避免重复数据:序列号还帮助接收方识别和丢弃重复的数据段,这可能在网络条件不稳定时发生,当数据包延迟或重传时。
  • 建立和维持连接状态:在TCP三次握手过程中,序列号用于同步发送方和接收方,确保双方对连接的开始点有共同的认识。这是建立稳定TCP连接的基础。

确认应答号

确认应答号是指接收方用来告诉发送方其期望接收的下一个序列号,也可以理解是目前为止成功接收的数据字节数加一
字段长32位。

数据偏移

数据偏移用来指示当前TCP报文段中首部的长度,知道首部的长度就知道了该报文段中实际数据的位置。
字段长4位。
由于数据偏移字段只有4位,因此它的范围是0到15,但首部的长度至少20字节,超出了该字段所能表示的大小。所以,数据偏移字段对应值的单位不是字节,而是4字节,比如该字段为0001,则表示首部长度4字节。

保留

保留字段主要是为了以后扩展时使用,一般设置为0(不做强制要求,不为0也不会影响报文段的收发)。
字段长4位。

控制位

控制位字段长8位,每一位都分别代表一个标志位(控制位)。当对应位置的值为1时,表示该控制位生效。
下面依次介绍控制位的作用:

拥塞控制位:CWR和ECE

CWR(Congestion Window Reduced)

拥塞窗口减小标志位,就是发送端设置该字段来告诉接收端发送端已经减小了拥塞窗口。

ECE(ECN-Echo)

显式拥塞通知回应标志位,就是接收端收到数据后,通过IP数据包头的CE位得知网络发生拥塞,那么接收端在发送TCP确认(ACK)时需要设置ECE标志位来通知发送端网络发生拥塞。

具体场景说明
  1. 检测拥塞并标记

当中间网络设备(如路由器)检测到网络开始出现拥塞时,会在经过的IP数据包头部设置CE(拥塞经历)位,表明这些数据包经历了拥塞。

  1. 接收端反应

客户端接收到被标记为CE的数据包。在向发送端发送TCP确认(ACK)时,客户端设置ECE位,用来通知发送端其发送的数据包经历了拥塞。这是客户端对检测到拥塞的第一次响应。

  1. 发送端接收确认并响应

发送端接收到含有ECE位的确认(ACK)包,理解到其数据在网络中遇到了拥塞。
发送端随后启动其拥塞控制机制,例如减小拥塞窗口。为了通知客户端它已经采取了措施以应对拥塞,发送端在后续发送的数据包中设置CWR位。

  1. 客户端的最终确认

客户端在收到含有CWR位的数据包后,知道发送端已经对拥塞做出了调整。在这一点上,客户端可以清除其ECE标志,因为已经成功地通知了发送端关于拥塞的问题,而发送端也已经确认并做出了调整。

URG(Urgent Flag)

URG被设置为1时,表示当前报文段中有需要紧急处理的数据,同时也表示紧急指针字段(指向紧急数据的最后一个字节,后面会介绍)有效,通过紧急指针字段的值可以知道紧急数据的末尾在报文段中的具体位置。

ACK(Acknowledgement Flag)

ACK位设置为1时表示确认号字段有效。在TCP连接中,发送端发送数据后,接收端会返回一个确认包,其中ACK标志位被设置为1,表示已经成功接收到指定的数据。

PSH(Push Flag)

PSH位设置为1时表示当前报文段中的数据要立即传给应用层,而不是等待缓冲区填满。

在默认情况下,报文段的PSH位设置为1有两种情况:

  1. 数据被拆分成多个报文段时,通常只有最后一个报文段的PSH设置为1,因为应用层需要拿到所有完整的数据才能进行处理
  2. 只需单个报文段传输时,该报文段的PSH被设置为1,因为该报文段已经包含了所有完整的数据。

当然,这并不能代表某些报文段不会被设置为1,具体场景具体分析。

RST(Reset Flag)

当RST位被设置为1时,表示TCP连接中出现异常,必须立即重置连接。这通常用于处理错误或同步问题。

SYN

SYN标志位只用于建立连接时的握手阶段(前两次握手)。SYN为1时表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。

FIN

FIN标志位通常用于断开连接。FIN为1时表示后续不再发送数据,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP报文段。每个主机又对对方的FIN包进行确认应答以后就可以断开连接。不过,主机收到FIN设置为1的TCP报文段以后不必马上回复一个FIN包,而是可以等到缓冲区中的所有数据都因已成功发送而被自动删除之后再发。

窗口大小

窗口大小字段是接收端用来通知发送端其当前可接受数据量大小的机制。TCP不允许发送端发送超过该大小的数据。不过,如果窗口大小为0,则表示可以发送窗口探测,以了解最新的窗口大小。但这个数据必须是1个字节。

功能和作用

  1. 流量控制

窗口大小决定了接收方在不发送进一步确认的情况下能够接收的数据总量。这意味着发送方可以根据这个窗口大小发送相应量的数据,并等待接收方的确认。这样可以有效避免因数据量过多而导致接收方处理不过来的情况。

  1. 动态调整

在TCP连接过程中,接收方可以根据自身的缓冲区空间动态调整窗口大小,这一过程称为滑动窗口协议

  1. 避免网络拥堵

通过调整窗口大小,TCP协议能够根据网络的当前状态(如延迟和数据丢失)来优化数据传输,减少拥塞的发生。

校验和

校验和字段用于确保数据在传输过程中的完整性和正确性。
TCP校验和的计算涉及几个步骤:

  1. 伪首部

首先构造一个伪首部(不是真正发送的一部分,但用于校验和计算)。伪首部包含了源IP地址、目的IP地址、保留位(总是置为0)、协议号(对TCP来说是6)以及TCP长度(TCP头部和数据的总长度)。

  1. 添加TCP首部和数据

将伪首部、TCP头部和数据部分组合在一起。如果组合后的数据长度是奇数个字节,会添加一个额外的0字节,以保证数据以16位(2字节)为单位进行处理。

  1. 计算和校验

将上述所有16位长的字进行二进制求和(包括进位)。如果在计算过程中产生了进位,则将进位加到最终的和中。最后将此和取反,得到的结果即为校验和。

  1. 放置校验和

计算出的校验和被放置在TCP头部的校验和字段中,然后随着TCP报文段被发送到接收方。

校验过程

接收方在收到TCP段后,也会构造相同的伪首部,并对收到的整个TCP段(包括校验和字段中的值)进行相同的计算。理想情况下,如果数据没有错误,计算结果应该是一个固定的值(通常是全1,即0xFFFF)。

校验和的重要性

TCP校验和非常重要,因为它帮助:

  • 检测错误:识别数据在传输过程中由于网络噪声、设备故障或其他原因引入的错误。
  • 提高可靠性:通过确保只有未损坏的数据被接收和处理,提高了通信的可靠性。
  • 兼容性和灵活性:适用于各种网络环境和传输媒介,即使在底层网络技术变化的情况下也能保持有效性。

紧急指针

紧急指针只有在URG控制位为1时有效。紧急指针字段的数值是当前报文段中紧急数据的尾部位置。
比如一个TCP报文段的序列号是1000,并且该报文段包含100字节的数据。如果紧急指针的值为20,那么从序列号1000开始的20个字节就是紧急数据。

选项

选项字段用于提高TCP的传输性能。TCP选项可以在TCP三次握手过程中协商或在任何后续的TCP报文段中指定,以调整或优化连接的行为。

常见的TCP选项

  1. 最大报文段大小(MSS)
  • 描述:定义了TCP通信中可以接受的最大数据段的大小,不包括TCP首部。
  • 目的:在连接建立时协商,以防止数据段因过大而被网络中的设备分片,影响性能。
  1. 窗口扩展选项(Window Scale)
  • 描述:扩展窗口大小字段的能力,允许窗口大小超过原始的16位限制,最多可以增加到1 GB。
  • 目的:在高延迟或高带宽的网络环境中提高TCP性能。
  1. 选择确认(SACK)
  • 描述:允许接收方指定已经成功接收的非连续的数据块。
  • 目的:提高在丢包环境下的TCP效率,减少不必要的重传。
  1. 时间戳选项
  • 描述:每个TCP段都附带发送和回复的时间戳。
  • 目的:提高TCP的性能表现和可靠性,帮助实现更精确的往返时间(RTT)测量和防止序列号的回绕。
  1. 无操作(NOP,用于填充)
  • 描述:用于填充,确保TCP选项的总长度是32位字的整数倍。
  • 目的:保证后续选项的正确对齐。
  1. 结束列表(End of Option List)
  • 描述:表示选项字段的结束。
  • 目的:标记选项的结束,这对解析TCP首部至关重要。

WireShark数据分析

第一次握手

Transmission Control Protocol, Src Port: 63148, Dst Port: 8888, Seq: 0, Len: 0Source Port: 63148Destination Port: 8888[Stream index: 0][Conversation completeness: Complete, WITH_DATA (31)][TCP Segment Len: 0]Sequence Number: 0    (relative sequence number)Sequence Number (raw): 2977803439[Next Sequence Number: 1    (relative sequence number)]Acknowledgment Number: 0Acknowledgment number (raw): 01000 .... = Header Length: 32 bytes (8)Flags: 0x002 (SYN)000. .... .... = Reserved: Not set...0 .... .... = Accurate ECN: Not set.... 0... .... = Congestion Window Reduced: Not set.... .0.. .... = ECN-Echo: Not set.... ..0. .... = Urgent: Not set.... ...0 .... = Acknowledgment: Not set.... .... 0... = Push: Not set.... .... .0.. = Reset: Not set.... .... ..1. = Syn: Set.... .... ...0 = Fin: Not set[TCP Flags: ··········S·]Window: 65535[Calculated window size: 65535]Checksum: 0xff57 [unverified][Checksum Status: Unverified]Urgent Pointer: 0Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted[Timestamps]

第二次握手

Transmission Control Protocol, Src Port: 8888, Dst Port: 63148, Seq: 0, Ack: 1, Len: 0Source Port: 8888Destination Port: 63148[Stream index: 0][Conversation completeness: Complete, WITH_DATA (31)][TCP Segment Len: 0]Sequence Number: 0    (relative sequence number)Sequence Number (raw): 4166461748[Next Sequence Number: 1    (relative sequence number)]Acknowledgment Number: 1    (relative ack number)Acknowledgment number (raw): 29778034401000 .... = Header Length: 32 bytes (8)Flags: 0x012 (SYN, ACK)000. .... .... = Reserved: Not set...0 .... .... = Accurate ECN: Not set.... 0... .... = Congestion Window Reduced: Not set.... .0.. .... = ECN-Echo: Not set.... ..0. .... = Urgent: Not set.... ...1 .... = Acknowledgment: Set.... .... 0... = Push: Not set.... .... .0.. = Reset: Not set.... .... ..1. = Syn: Set.... .... ...0 = Fin: Not set[TCP Flags: ·······A··S·]Window: 65535[Calculated window size: 65535]Checksum: 0xddba [unverified][Checksum Status: Unverified]Urgent Pointer: 0Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted[Timestamps][SEQ/ACK analysis]

第三次握手

Transmission Control Protocol, Src Port: 63148, Dst Port: 8888, Seq: 1, Ack: 1, Len: 0Source Port: 63148Destination Port: 8888[Stream index: 0][Conversation completeness: Complete, WITH_DATA (31)][TCP Segment Len: 0]Sequence Number: 1    (relative sequence number)Sequence Number (raw): 2977803440[Next Sequence Number: 1    (relative sequence number)]Acknowledgment Number: 1    (relative ack number)Acknowledgment number (raw): 41664617490101 .... = Header Length: 20 bytes (5)Flags: 0x010 (ACK)000. .... .... = Reserved: Not set...0 .... .... = Accurate ECN: Not set.... 0... .... = Congestion Window Reduced: Not set.... .0.. .... = ECN-Echo: Not set.... ..0. .... = Urgent: Not set.... ...1 .... = Acknowledgment: Set.... .... 0... = Push: Not set.... .... .0.. = Reset: Not set.... .... ..0. = Syn: Not set.... .... ...0 = Fin: Not set[TCP Flags: ·······A····]Window: 10233[Calculated window size: 2619648][Window size scaling factor: 256]Checksum: 0xf0b8 [unverified][Checksum Status: Unverified]Urgent Pointer: 0[Timestamps][SEQ/ACK analysis]

服务端发送数据Hello, client!

Transmission Control Protocol, Src Port: 8888, Dst Port: 63148, Seq: 1, Ack: 1, Len: 14Source Port: 8888Destination Port: 63148[Stream index: 0][Conversation completeness: Complete, WITH_DATA (31)][TCP Segment Len: 14]Sequence Number: 1    (relative sequence number)Sequence Number (raw): 4166461749[Next Sequence Number: 15    (relative sequence number)]Acknowledgment Number: 1    (relative ack number)Acknowledgment number (raw): 29778034400101 .... = Header Length: 20 bytes (5)Flags: 0x018 (PSH, ACK)000. .... .... = Reserved: Not set...0 .... .... = Accurate ECN: Not set.... 0... .... = Congestion Window Reduced: Not set.... .0.. .... = ECN-Echo: Not set.... ..0. .... = Urgent: Not set.... ...1 .... = Acknowledgment: Set.... .... 1... = Push: Set.... .... .0.. = Reset: Not set.... .... ..0. = Syn: Not set.... .... ...0 = Fin: Not set[TCP Flags: ·······AP···]Window: 10233[Calculated window size: 2619648][Window size scaling factor: 256]Checksum: 0x6648 [unverified][Checksum Status: Unverified]Urgent Pointer: 0[Timestamps][SEQ/ACK analysis]TCP payload (14 bytes)

客户端确认应答

Transmission Control Protocol, Src Port: 63148, Dst Port: 8888, Seq: 1, Ack: 15, Len: 0Source Port: 63148Destination Port: 8888[Stream index: 0][Conversation completeness: Complete, WITH_DATA (31)][TCP Segment Len: 0]Sequence Number: 1    (relative sequence number)Sequence Number (raw): 2977803440[Next Sequence Number: 1    (relative sequence number)]Acknowledgment Number: 15    (relative ack number)Acknowledgment number (raw): 41664617630101 .... = Header Length: 20 bytes (5)Flags: 0x010 (ACK)000. .... .... = Reserved: Not set...0 .... .... = Accurate ECN: Not set.... 0... .... = Congestion Window Reduced: Not set.... .0.. .... = ECN-Echo: Not set.... ..0. .... = Urgent: Not set.... ...1 .... = Acknowledgment: Set.... .... 0... = Push: Not set.... .... .0.. = Reset: Not set.... .... ..0. = Syn: Not set.... .... ...0 = Fin: Not set[TCP Flags: ·······A····]Window: 10233[Calculated window size: 2619648][Window size scaling factor: 256]Checksum: 0xf0aa [unverified][Checksum Status: Unverified]Urgent Pointer: 0[Timestamps][SEQ/ACK analysis]

客户端发送数据Hello

Transmission Control Protocol, Src Port: 63148, Dst Port: 8888, Seq: 1, Ack: 15, Len: 5Source Port: 63148Destination Port: 8888[Stream index: 0][Conversation completeness: Complete, WITH_DATA (31)][TCP Segment Len: 5]Sequence Number: 1    (relative sequence number)Sequence Number (raw): 2977803440[Next Sequence Number: 6    (relative sequence number)]Acknowledgment Number: 15    (relative ack number)Acknowledgment number (raw): 41664617630101 .... = Header Length: 20 bytes (5)Flags: 0x018 (PSH, ACK)000. .... .... = Reserved: Not set...0 .... .... = Accurate ECN: Not set.... 0... .... = Congestion Window Reduced: Not set.... .0.. .... = ECN-Echo: Not set.... ..0. .... = Urgent: Not set.... ...1 .... = Acknowledgment: Set.... .... 1... = Push: Set.... .... .0.. = Reset: Not set.... .... ..0. = Syn: Not set.... .... ...0 = Fin: Not set[TCP Flags: ·······AP···]Window: 10233[Calculated window size: 2619648][Window size scaling factor: 256]Checksum: 0xcccb [unverified][Checksum Status: Unverified]Urgent Pointer: 0[Timestamps][SEQ/ACK analysis]TCP payload (5 bytes)

服务端确认应答

Transmission Control Protocol, Src Port: 8888, Dst Port: 63148, Seq: 15, Ack: 6, Len: 0Source Port: 8888Destination Port: 63148[Stream index: 0][Conversation completeness: Complete, WITH_DATA (31)][TCP Segment Len: 0]Sequence Number: 15    (relative sequence number)Sequence Number (raw): 4166461763[Next Sequence Number: 15    (relative sequence number)]Acknowledgment Number: 6    (relative ack number)Acknowledgment number (raw): 29778034450101 .... = Header Length: 20 bytes (5)Flags: 0x010 (ACK)000. .... .... = Reserved: Not set...0 .... .... = Accurate ECN: Not set.... 0... .... = Congestion Window Reduced: Not set.... .0.. .... = ECN-Echo: Not set.... ..0. .... = Urgent: Not set.... ...1 .... = Acknowledgment: Set.... .... 0... = Push: Not set.... .... .0.. = Reset: Not set.... .... ..0. = Syn: Not set.... .... ...0 = Fin: Not set[TCP Flags: ·······A····]Window: 10233[Calculated window size: 2619648][Window size scaling factor: 256]Checksum: 0xf0a5 [unverified][Checksum Status: Unverified]Urgent Pointer: 0[Timestamps][SEQ/ACK analysis]

服务端发送数据quit

Transmission Control Protocol, Src Port: 8888, Dst Port: 63148, Seq: 15, Ack: 6, Len: 4Source Port: 8888Destination Port: 63148[Stream index: 0][Conversation completeness: Complete, WITH_DATA (31)][TCP Segment Len: 4]Sequence Number: 15    (relative sequence number)Sequence Number (raw): 4166461763[Next Sequence Number: 19    (relative sequence number)]Acknowledgment Number: 6    (relative ack number)Acknowledgment number (raw): 29778034450101 .... = Header Length: 20 bytes (5)Flags: 0x018 (PSH, ACK)000. .... .... = Reserved: Not set...0 .... .... = Accurate ECN: Not set.... 0... .... = Congestion Window Reduced: Not set.... .0.. .... = ECN-Echo: Not set.... ..0. .... = Urgent: Not set.... ...1 .... = Acknowledgment: Set.... .... 1... = Push: Set.... .... .0.. = Reset: Not set.... .... ..0. = Syn: Not set.... .... ...0 = Fin: Not set[TCP Flags: ·······AP···]Window: 10233[Calculated window size: 2619648][Window size scaling factor: 256]Checksum: 0x15b0 [unverified][Checksum Status: Unverified]Urgent Pointer: 0[Timestamps][SEQ/ACK analysis]TCP payload (4 bytes)

客户端确认应答

Transmission Control Protocol, Src Port: 63148, Dst Port: 8888, Seq: 6, Ack: 19, Len: 0Source Port: 63148Destination Port: 8888[Stream index: 0][Conversation completeness: Complete, WITH_DATA (31)][TCP Segment Len: 0]Sequence Number: 6    (relative sequence number)Sequence Number (raw): 2977803445[Next Sequence Number: 6    (relative sequence number)]Acknowledgment Number: 19    (relative ack number)Acknowledgment number (raw): 41664617670101 .... = Header Length: 20 bytes (5)Flags: 0x010 (ACK)000. .... .... = Reserved: Not set...0 .... .... = Accurate ECN: Not set.... 0... .... = Congestion Window Reduced: Not set.... .0.. .... = ECN-Echo: Not set.... ..0. .... = Urgent: Not set.... ...1 .... = Acknowledgment: Set.... .... 0... = Push: Not set.... .... .0.. = Reset: Not set.... .... ..0. = Syn: Not set.... .... ...0 = Fin: Not set[TCP Flags: ·······A····]Window: 10233[Calculated window size: 2619648][Window size scaling factor: 256]Checksum: 0xf0a1 [unverified][Checksum Status: Unverified]Urgent Pointer: 0[Timestamps][SEQ/ACK analysis]

第一次挥手

Transmission Control Protocol, Src Port: 63148, Dst Port: 8888, Seq: 6, Ack: 19, Len: 0Source Port: 63148Destination Port: 8888[Stream index: 0][Conversation completeness: Complete, WITH_DATA (31)][TCP Segment Len: 0]Sequence Number: 6    (relative sequence number)Sequence Number (raw): 2977803445[Next Sequence Number: 7    (relative sequence number)]Acknowledgment Number: 19    (relative ack number)Acknowledgment number (raw): 41664617670101 .... = Header Length: 20 bytes (5)Flags: 0x011 (FIN, ACK)000. .... .... = Reserved: Not set...0 .... .... = Accurate ECN: Not set.... 0... .... = Congestion Window Reduced: Not set.... .0.. .... = ECN-Echo: Not set.... ..0. .... = Urgent: Not set.... ...1 .... = Acknowledgment: Set.... .... 0... = Push: Not set.... .... .0.. = Reset: Not set.... .... ..0. = Syn: Not set.... .... ...1 = Fin: Set[TCP Flags: ·······A···F]Window: 10233[Calculated window size: 2619648][Window size scaling factor: 256]Checksum: 0xf0a0 [unverified][Checksum Status: Unverified]Urgent Pointer: 0[Timestamps]

第二次挥手

Transmission Control Protocol, Src Port: 8888, Dst Port: 63148, Seq: 19, Ack: 7, Len: 0Source Port: 8888Destination Port: 63148[Stream index: 0][Conversation completeness: Complete, WITH_DATA (31)][TCP Segment Len: 0]Sequence Number: 19    (relative sequence number)Sequence Number (raw): 4166461767[Next Sequence Number: 19    (relative sequence number)]Acknowledgment Number: 7    (relative ack number)Acknowledgment number (raw): 29778034460101 .... = Header Length: 20 bytes (5)Flags: 0x010 (ACK)000. .... .... = Reserved: Not set...0 .... .... = Accurate ECN: Not set.... 0... .... = Congestion Window Reduced: Not set.... .0.. .... = ECN-Echo: Not set.... ..0. .... = Urgent: Not set.... ...1 .... = Acknowledgment: Set.... .... 0... = Push: Not set.... .... .0.. = Reset: Not set.... .... ..0. = Syn: Not set.... .... ...0 = Fin: Not set[TCP Flags: ·······A····]Window: 10233[Calculated window size: 2619648][Window size scaling factor: 256]Checksum: 0xf0a0 [unverified][Checksum Status: Unverified]Urgent Pointer: 0[Timestamps][SEQ/ACK analysis]

第三次挥手

Transmission Control Protocol, Src Port: 8888, Dst Port: 63148, Seq: 19, Ack: 7, Len: 0Source Port: 8888Destination Port: 63148[Stream index: 0][Conversation completeness: Complete, WITH_DATA (31)][TCP Segment Len: 0]Sequence Number: 19    (relative sequence number)Sequence Number (raw): 4166461767[Next Sequence Number: 20    (relative sequence number)]Acknowledgment Number: 7    (relative ack number)Acknowledgment number (raw): 29778034460101 .... = Header Length: 20 bytes (5)Flags: 0x011 (FIN, ACK)000. .... .... = Reserved: Not set...0 .... .... = Accurate ECN: Not set.... 0... .... = Congestion Window Reduced: Not set.... .0.. .... = ECN-Echo: Not set.... ..0. .... = Urgent: Not set.... ...1 .... = Acknowledgment: Set.... .... 0... = Push: Not set.... .... .0.. = Reset: Not set.... .... ..0. = Syn: Not set.... .... ...1 = Fin: Set[TCP Flags: ·······A···F]Window: 10233[Calculated window size: 2619648][Window size scaling factor: 256]Checksum: 0xf09f [unverified][Checksum Status: Unverified]Urgent Pointer: 0[Timestamps]

第四次挥手

Transmission Control Protocol, Src Port: 63148, Dst Port: 8888, Seq: 7, Ack: 20, Len: 0Source Port: 63148Destination Port: 8888[Stream index: 0][Conversation completeness: Complete, WITH_DATA (31)][TCP Segment Len: 0]Sequence Number: 7    (relative sequence number)Sequence Number (raw): 2977803446[Next Sequence Number: 7    (relative sequence number)]Acknowledgment Number: 20    (relative ack number)Acknowledgment number (raw): 41664617680101 .... = Header Length: 20 bytes (5)Flags: 0x010 (ACK)000. .... .... = Reserved: Not set...0 .... .... = Accurate ECN: Not set.... 0... .... = Congestion Window Reduced: Not set.... .0.. .... = ECN-Echo: Not set.... ..0. .... = Urgent: Not set.... ...1 .... = Acknowledgment: Set.... .... 0... = Push: Not set.... .... .0.. = Reset: Not set.... .... ..0. = Syn: Not set.... .... ...0 = Fin: Not set[TCP Flags: ·······A····]Window: 10233[Calculated window size: 2619648][Window size scaling factor: 256]Checksum: 0xf09f [unverified][Checksum Status: Unverified]Urgent Pointer: 0[Timestamps][SEQ/ACK analysis]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【sqlite3】联系人管理系统

SQLite3实现简单的联系人管理系统 有关sqlite3的基础知识请点击&#xff1a;SQLite3的使用 效果展示&#xff1a; 创建一个名为contacts.db的数据库 首先&#xff0c;我们需要创建一个名为contacts.db的数据库&#xff0c;并建立一个名为"contact"的表&#xff0…

一篇文章理解堆栈溢出

一篇文章理解堆栈溢出 引言栈溢出ret2text答案 ret2shellcode答案 ret2syscall答案 栈迁移答案 堆溢出 unlink - UAF堆结构小提示 向前合并/向后合并堆溢出题答案 引言 让新手快速理解堆栈溢出&#xff0c;尽可能写的简单一些。 栈溢出 代码执行到进入函数之前都会记录返回地…

Android 10.0 关于定制自适应AdaptiveIconDrawable类型的动态日历图标的功能实现系列一

1.前言 在10.0的系统rom定制化开发中,在关于定制动态时钟图标中,原系统是不支持动态日历图标的功能,所以就需要从新 定制动态时钟图标关于自适应AdaptiveIconDrawable类型的样式,就是可以支持当改变系统图标样式变化时,动态日历 图标的背景图形也跟着改变,所以接下来就来…

BGE M3-Embedding 模型介绍

BGE M3-Embedding来自BAAI和中国科学技术大学&#xff0c;是BAAI开源的模型。相关论文在https://arxiv.org/abs/2402.03216&#xff0c;论文提出了一种新的embedding模型&#xff0c;称为M3-Embedding&#xff0c;它在多语言性&#xff08;Multi-Linguality&#xff09;、多功能…

19 解决问题的策略

众所周知&#xff0c;每个学期都会有一个单元“解决问题的策略”。而在此文章&#xff0c;我们会把小学阶段所有策略都进行一一讲解。 每个年级的两个学期中的策略&#xff0c;其实有异曲同工之处。 三年级&#xff1a;从条件和问题出发解决问题四年级&#xff1a;用图表整理…

X射线底片焊缝缺陷检测

实现四种焊缝缺陷的检测和分割处理。

Python:谈谈常规滤波器(带通、低通、高通、带阻)的用法

一、滤波器的作用 滤波器在信号处理中用于移除或减少信号中的噪声&#xff0c;同时保持信号的某些特性。滤波器通常用于音频、视频和图像处理等领域。滤波器根据其 designed for different purposes and can be divided into several types, such as lowpass filters, highpass…

Pikachu 不安全的文件下载(Unsafe file download)概述 附漏洞利用案例

目录 获取下载链接 修改链接 重新构造链接 拓展 不安全的文件下载概述 文件下载功能在很多web系统上都会出现&#xff0c;一般我们当点击下载链接&#xff0c;便会向后台发送一个下载请求&#xff0c;一般这个请求会包含一个需要下载的文件名称&#xff0c;后台在收到请求…

02.Ambari自定义服务开发-metainfo.xml介绍

文章目录 metainfo.xml 介绍配置说明Hbase metainfo.xml配置说明配置参数详细介绍配置文件样例DORIS metainfo.xml 介绍 ​ 在Ambari自定义开发中&#xff0c;metainfo.xml 配置文件起着至关重要的作用。它用于定义服务的元数据信息&#xff0c;包括服务的版本、组件、执行脚本…

Todesk远程Ubuntu桌面系统100%但是进不去桌面

1、报错情况 如下图所示&#xff0c;用Todesk远程Ubuntu桌面&#xff0c;看到连接100%了&#xff0c;但是进不去桌面 ubuntu系统看起来的话&#xff0c;已经像被远程成功了 我就首先把todesk卸载重新安装了&#xff0c;后面发现还是这样&#xff0c;于是我就找客服去问了&…

Qt之Pdb生成及Dump崩溃文件生成与调试(含注释和源码)

文章目录 一、Pdb生成及Dump文件使用示例图1.Pdb文件生成2.Dump文件调试3.参数不全Pdb生成的Dump文件调试 二、个人理解1.生成Pdb文件的方式2.Dump文件不生产的情况 三、源码Pro文件mian.cppMainWindowUi文件 总结 一、Pdb生成及Dump文件使用示例图 1.Pdb文件生成 下图先通过…

SpringMVC(1)——入门程序+流程分析

MVC都是哪三层&#xff1f;在Spring里面分别对应什么&#xff1f;SpringMVC的架构是什么&#xff1f; 我们使用Spring开发JavaWeb项目&#xff0c;一般都是BS架构&#xff0c;也就是Browser&#xff08;浏览器&#xff09;-Server&#xff08;服务器&#xff09;架构 这种架构…

基于SpringBoot的超市进销存系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;MyEclipse、Tomcat 系统展示 首页 首页界面图 个人中心 个人中心…

ESP32实现UDP连接——micropython版本

代码&#xff1a; import network import socket import timedef wifiInit(name, port):ap network.WLAN(network.AP_IF) # 创建一个热点ap.config(essidname, authmodenetwork.AUTH_OPEN) # 无需密码ap.active(True) # 激活热点ip ap.ifconfig()[0] # 获取ip地址print(…

【D3.js in Action 3 精译】1.1.2 D3.js 的适用场景

译注 上一节中我们了解了 D3 诞生的技术背景——为了满足 Web 可访问数据的可视化需求。本节再来看看 D3.js 的适用场景是怎样的、在什么时候会考虑使用 D3.js。 1.1.2 D3.js 的适用场景 数据可视化领域正蓬勃发展&#xff0c;且备受青睐。过去十年间用于生成数据驱动图形的工…

Linux—进程与计划管理

目录 一、程序 二、进程 1、什么是进程 2、进程的特点 3、进程、线程、携程 3.1、进程 3.2、线程 3.3、携程 三、查看进程信息 1、ps -aux 2、ps -elf 3、top ​3.2、输出内容详解 3.2.1、输出第一部分解释 3.2.2、输出第二部分解释 4、pgrep 5、pstree 四、进…

【项目】论坛系统项目自动化测试

论坛系统项目自动化测试 前述一、脑图二、代码编写1.公共类InitAndEnd1.登录页面测试ForumLoginTest正常登录&#xff1a;异常登录&#xff1a; 3.注册页面测试ForumRegisterTest注册成功&#xff1a;注册失败&#xff1a; 4论坛列表页面测试ForumListTest登录状态下&#xff1…

1.spring入门案例

Spring 介绍 Spring是轻量级的开源的JavaEE框架。 Spring有两个核心部分&#xff1a;IOC和AOP IOC 控制反转&#xff0c;把创建对象过程交给Spring进行管理。 AOP 面向切面&#xff0c;不修改源代码进行功能增强。 Spring特点 1.方便解耦&#xff0c;简化开发。 2.AOP编…

算法体系-25 第二十五节:窗口内最大值或最小值的更新结构

一 滑动窗口设计知识点 滑动窗口是什么&#xff1f; 滑动窗口是一种想象出来的数据结构&#xff1a; 滑动窗口有左边界L和有边界R 在数组或者字符串或者一个序列上&#xff0c;记为S&#xff0c;窗口就是S[L..R]这一部分 L往右滑意味着一个样本出了窗口&#xff0c;R往右滑意味…

【MySQL】库的操作【创建和操纵】

文章目录 1.创建数据库1.1字符集和校验规则1.查看系统默认字符集以及校验规则2.查看数据库支持的字符集以及校验规则 1.2校验规则对数据库的影响1.创建一个数据库&#xff0c;校验规则使用utf8_ general_ ci[不区分大小写]2.创建一个数据库&#xff0c;校验规则使用utf8_ bin[区…