TCP虽然是面向字节流的,但TCP传送的数据大暖却是报文段。一个TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它首部中个字段的作用。
TCP报文首部的前20个字节是固定的,后面有4n字节是根据需要而增加的选项(n是整数)。因此报文首部的最小长度是20字节。
- 源端口和目的端口,各占2个字节,分别写入源端口号和目的端口号。
- 序号,占4个字节,本段报文所发送的数据的第一个字节的序号。例如,一段报文的序号字段值是301,而携带的数据共有100个字节,这表明,本段报文的数据第一个字节的序号是301,最后一个字节的序号是400。显然下一段报文序号应当从401开始。这个字段的名称也叫做“报文段序号”。
- 确认号,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。若确认好为N,则表明:到序号N-1为止的所有数据都已正确收到。
- 数据偏移,占四位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际指出了TCP报文段的首部长度,单位为4字节
- 保留,占6位,保留为今后使用,但目前应置为零
- URG, 当URG=1时,标明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送,而不要按原来顺序来传送。
- ACK,仅当ACK=1时,确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文都必须把ACK置为1。
- PSH,当连个应用进程进行交互通信时,有时在一端的应用进程希望在键入一个命令后立即能够收到对方的响应。在这种情况下,TCP就可以使用PSH操作。这时,发送方TCP把PSH置1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快的交付接受应用进程,而不再等待整个缓存都填满了后再向上交付。
- 复位RST,当RST=时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。
- 同步SYN,在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则硬在响应的报文段中使SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。
- 终止FIN,用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
- 窗口,占2个字节。窗口指的是发送本报文的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文首部中的确认号算起,接收方目前允许对方发送的数量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之窗口值作为接收方让发送发设置其发送窗口的依据。例如,发送了一个报文段,其确认号是701,窗口值为1000。这就是告诉对方,从701号算起,我的接受缓存空间还可接受1000个字节数据。
- 检验和,占2字节,检验和字段检验的范围包括首部和数据两部分。
- 紧急指针,占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。
- 选项,长度可变,最长可达40字节,当没有使用选项时,TCP的首部长度是20字节。