源端口:占2字节。
目的端口:占2字节。
序号:占4字节。序号范围是[0,2^23-1],共2^23个序号。当序号达到2^23-1时候,下一个序号就回到0。TCP是面向字节流的,在一个TCP连接中传送的字节流的每一个字节都按顺序编号。整个TCP的起始序号必须在建立时确认,首部中的序号字段指的是这个报文段所发送的数据的第一个字节的序号。例如报文序号是101,携带的数据共100个字节,所以这个报文的第一个字节序号是101,最后一个字节的序号是200。下一个报文段就从201开始。
确认号:占4字节。是希望收对方下一个报文段的第一个数据字节的序号。例如序号中讲的,序号就是201。
数据偏移:占4位。指出TCP数据的起始位置和TCP报文段的起始处相差多少。也可以理解为数据偏移就是TCP首部字段的长度。
保留:占6位。保留为以后使用,当前置为0。
紧急URG:当URG=1时,说明紧急指针字段有效。告诉系统这个报文中有紧急的数据,应该尽快处理,优先级最高。
确认ACK:仅当ACK=1时,确认号字段才有效。当ACK=0时,确认号无效。TCP中有规定在TCP连接建立之后,所有传送的报文段ACK都必须为1。
推送PSH:发送方将PSH置为1后,表示当前命令之后希望收到对方的相应,推送很少用,不做深究。
复位RST:当RST=1时,表示TCP中出现严重的差错,必须释放连接然后再重新建立连接。RST=1还可以用来拒绝一个恶意的报文段。
同步SYN:在连接建立时用来同步序号。当SYN=1并且ACK=0时,表示这是一个连接请求报文段。若对方同意连接,就应该在响应报文中使SYN=1并且ACK=1。所以SYN=1表示这是一个连接请求或者连接接受报文。
终止FIN:用来释放一个TCP连接。当FIN=1时,表示报文段的发送方的数据已经发送完毕,要求释放连接。
窗口:占2字节。指的是发送这个报文段那方的接收窗口。窗口值告诉对方从确认号算起,接收方目前允许对方发送的数据量,因为接收方的数据缓存空间是有限的。
检验和:占2字节。检验和字段的检查范围包括首部和数据两个部分。和UDP一样需要在首部之前添加12字节的伪首部,算法这里不做深究。
紧急指针:占2字节。只有URG=1时才有用,表示这个报文段中紧急数据的字节数。
选项:长度可变,最长可达40字节,当没有选项时,TCP首部长度就是20字节。