在五层模型中,传输层的典型代表就是TCP协议。TCP协议由于其天然自带的可靠性,广泛的使用在互联网的各项业务中。
TCP协议的首部格式如下:
TCP首部包括20字节的固定首部部分和选项(长度可变)部分,然后TCP首部和TCP的数据部分组成组成TCP报文段,这是在传输层,TCP报文段在网络层就成为了网络层的IP数据部分,然后再加上IP首部就组成了IP数据包。
下面对TCP首部的各个字段进行逐一解释:
TCP传输的数据要从A计算机的一个进程传输到B计算机的一个的话,除了在网络层通过指定IP地址来唯一的确定目标计算机,还需要通过在传输层的TCP首部中说明自己携带的信息来自于自己的哪个端口,又需要到达目标计算机的哪一个端口,从而被目标计算机的特定进程所使用,从而与网络层的IP地址一起构成完整的套接字。从上图可以看到源端口和目标端口各占两个字节,16位,16位可以表示的端口范围是0-65535。
seq占4个字节,在TCP的三次握手、四次挥手和数据传输过程都有用到,用来标记字节流的序号,因为数据传输过程中并不总是有序到达,为了保证数据的无差错传输,必须把每个报文段标记一个序号,这个序号表示一个报文段开始的位置,如果一个报文段序列号为1,报文段长100字节,那么下一个报文段就为101。
ack占4个字节,接收方在收到数据后需要给发送方一个确认,告诉接收方收到了某一个报文。而接收方收到的报文段很多,为了让接收方知道是哪一个报文段的确认,TCP协议规定了确认号为期待收到的下一个报文段的序列号。假设接收方收到了一个报文段seq=1,报文长100字节,那么确认号为101,表明1~100的数据都已经收到。
数据偏移占4位,表示TCP首部长度,之所以叫数据偏移而没有称为首部长度,大概是为了强调正真的数据部分距离该报文段的起始处的距离。TCP的固定首部长度为20个字节,可变长度为40个字节,因此,首部最大长度为60个字节
窗口占2字节。窗口大小表示接收方允许发送方发送报文段的多少,以字节为单位,在数据传输过程中是动态变化的。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。如果序号seq=1,窗口大小为1000,则表明接受方的缓存空间可以接受1000字节(序号为1~1000)的数据。
占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,不只是检验数据部分,把首部和数据部分一起检验。在发送方,将伪首部和首部以及数据部分连在一起,将其看成许多16位字串接起来的,如果数据部分不是偶数个字节,则要填充一个全零字节,然后按照二进制反码计算出这些16位字的和,高位超出进一,则进行地位叠加,最后将求得的和的反码即为发送方的检验和;在接收方,将收到的数据和伪首部一起,用二级制反码计算这些16位字的和,若结果全1,则表明无差错,否则丢弃错误报文段。简单来说,即在发送方,原码相加,高位叠加到低位,取反码,放入校验和;在接收端,将所有原码相加,高位叠加到地位, 如全为1,则正确。
占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据) 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。
长度可变,最长可达4字节。当没有使用“选项”时,TCP的首部长度是20字节。选项包含最大报文段长度(MSS)、窗口扩大、时间戳、选择确认等。