今天在学习网络数据包发现一个大神在感觉很好,所以复制了。再次提醒谢谢大神下面是具体内容

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_数据

TCP包结构定义

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_首部_02


【TCP】图解,一步一步拆解TCP包结构,各个字段分析_TCP_03

分析

源端口目的端口

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_数据_04

序列号

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_首部_05

确认号

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_TCP_06

序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。e.g.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0

4位首部长度

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_TCP_07


4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。

所以图上是32bytes,32个字节长度头部

保留6位

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_TCP_08


为将来定义新的用途保留,现在一般置0

URG

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_首部_09


紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针

ACK

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_数据_10


确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段

PSH

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_TCP_11

push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队

RST

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_TCP_12


重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求

SYN

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_数据_13


同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1

FIN

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_TCP_14


finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流

16位窗口大小

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_首部_15


滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小是一个16bit字段,因而窗口大小最大为65535。

零窗口(ZeroWindow)
当发送方的发送速度大于接收方的处理速度,接收方的缓冲塞满后,就会告诉发送方当前窗口size=0,请停止发送,发送方此时停止发送数据

16位TCP校验和

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_首部_16


奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证

16位紧急指针

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_数据_17


只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式

选项(若有)

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_数据_18

最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍

数据(若有)

【TCP】图解,一步一步拆解TCP包结构,各个字段分析_首部_19


TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段