概述
本文讲解TCP数据包的报头格式
TCP报头又称为TCP报文、TCP包头、TCP包首部 等
类比
相当于邮寄 包裹,包裹上面都有一张 邮寄单,如下图:

邮寄单上有 寄件人的姓名、地址、电话号,还有 收件人的姓名、地址、电话号,以及 包裹的类别、是否超重 等信息
包裹 相当于 TCP数据包
邮寄单 相当于 TCP数据包的 报文
TCP报文
源端口:表示发送端端口号,16位,共有2^16-1=65535个端口。指明发送端计算机的应用程序。
http://www.malaoshi.top/show_1EF2YXPJGCld.html目的端口:表示接收端端口号,指明接收端计算机的应用程序。
序号:也称为顺序号,Sequence Number,简写为SEQ,表示“发送端” 数据包序号。占32位,第一个包的编号由本地随机产生,到达2^32-1后会再回到0。
客户端、服务器端有各自的SEQ序号确认号:Acknowledgement Number,简写为ACK,TCP返回报文使用。
是期望的对方的下一个序号。
序号和确认号:是TCP可靠传输的关键部分。首部长度:占4位。上图中的“选项”是可选的,因此TCP报头的长度是不确定的,报头不包含“选项”时长度为20字节。
也称 数据偏移,由于 报头的长度不确定 ,首部长度指示了 数据区 在报文段中的 起始偏移值 。首部长度所能表示的最大值为2^4-1=15,由于报头是32位为一组,换算字节是:15*32/8 = 60字节,所以报头最大长度为60字节。
保留:为将来定义新的用途保留,现在一般置0。
控制位(标志位):URG、ACK、PSH、RST、SYN、FIN,共6个,每一个控制位表示一个控制功能。
URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。
ACK:确认标志,为 1 时 确认号有效 ,为 0 时 确认号无效
与上面的确认号ACK不同
PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
SYN:同步序号,用于 建立连接 过程。
当 SYN=1,ACK=0 时表示:这是一个连接请求报文段。
若同意连接,则在响应报文段中 SYN=1,ACK=1。
因此,SYN=1表示这是一个 建立连接请求,或 同意建立连接 报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
注意:- SYN=1的报文 不能携带数据,但要 消耗掉一个序号
- SYN=0、ACK=1的报文 可以携带数据,如果不携带数据则不消耗序号,此时下一个报文的序号与当前报文的序号相同
FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。
窗口:16位长度,滑动窗口大小,接收端告知发送端,本接受端的 缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口最大为2^16-1=65535。
校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
选项:长度可变,最长40字节,当没有选项时报头长度是20字节。有多个选项,最重要的是 MSS
填充:选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
数据部分: TCP 报文段中的数据部分是可选的。
在一个连接建立和终止时,双方交换的报文段仅有 TCP 报头。如果一方没有数据要发送,也使用没有任何数据的报头来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报头。
