image.png

    源端口(Source Port) : 16bits, 标识数据发送方对应的应用层程序
    目的端口(Destination Port) : 16bits, 标识数据接收方对应的应用层程序
    端口号的取值范围: 0~65535,详情见后面的知识点。
    序列号(Sequence Number) : 32bits, 标识数据发送方所发出数据的编号,序列号以字节为单位。
    确认号(Acknowledgment Number) : 32bits, 标识数据接收方期望下次收到的数据编号。
    报头长度(Header Length) : 4bits, 标识TCP报头的长度,单位是32bits (即4个字节)
    也就是说TCP的报头长度最大值为: 154=60字节,最小是20字节。
    保留位(Reserved) : 3bits, 保留,暂未使用(可能将来会用于其他的标志位)。
    标志位(Flags) : 9bits
    ①Nonce:详细见RFC 3540,同样是关于ECN相关的一个参数。
    ②Congestion Window Reduced (CWR):拥塞窗门减少,CWR= 1表示链路拥塞,会减少TCP窗口。
    ③ECN-Echo (ECE) : Explicit Congestion Notification显式拥塞通告。
    ④Urgent (URG) :紧急,标识高优先级的紧急数据,URG=1表示报文中包含紧急数据,需要优先处理。
    并且只有URG= 1时,TCP报头中的紧急指针字段才会生效。
    ⑤Acknowledgment (ACK) :确认,表示TCP报头中的确认号是否有效,ACK=1代表有效。
    ⑥Push (PSH) : 推送,PSH=1,表示需要把接收到的数据推送给上层应用程序,而不是缓存起来。
    ⑦Reset (RST) : 重置,复位。RST=1,表示TCP连接出现异常,需要重新建立。
    ⑧Syn (SYN) :同步,SYN=1,表示请求建立连接,并同步双方的序列号。
    ⑨Fin (FIN) :结束,FIN=1, 表示数据已经发送完成,请求关闭连接。
    窗口大小(Window Size) : 16bits, 表示数据接收方当前可以接收的最大数据量,单位是字节。窗口大小其实代表了数据接收方当前的接收缓存池的大小,告知发送方不要一次性发送过量的数据。
    校验和(Checksum) :16bits,用于[TCP头部+应用层数据]的差错校验。
    紧急指针(Urgent Pointer) : 16bits, 标明紧急数据的字节数,与序列号搭配使用,单位是字节。
    *可选项&填充项(Options & Padding) :
    0~40字节,用于协商一-些其他参数。
    最常用的可选项就是协商MSS (最大分段长度)参数。

    序列号是随即生成的,确认号是序列号+数据字节大小
    特殊情况,syn置位为1的时候,视为数据字节大小为1.