TCP虽然是面向字节流的,但是TCP传送的数据单元却是报文段。
一个TCP报文段分为首部和数据两部分,TCP的全部功能都体现在它首部的各字段的作用。只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。
TCP报文段首部的前20个字节是固定的(一个字节是8个位),后面有4n字节是根据需要而增加的选项(n是整数)。因此TCP首部的最小长度是20字节。
(1)源端口和目的端口 :各占两个字节。
(2)序号(seq):占4个字节。首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号值。
(3)确认号(ack): 占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。
(4)数据偏移:占4位字节。指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。(数据起始处距离首部的距离)
(5)保留 :占6位,保留为今后使用。但目前应置为0
(6)紧急(URG)。当URG为1时,表明紧急指针字段有效。告诉系统报文段中有紧急数据,应尽快传达,不要按照原来的排队序列来传送。
(7)确认ACK。当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在建立连接后,所有传送的报文段都必须把ACK置1.
(8)推送(PSH)
(9)复位RST。RST也可称为重建位或重置位。当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。
(10)同步(SYN)当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使用SYN=1和ACK=1。SYN置1就表示一个连接请求或连接接受报文。
(11)终止FIN。用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
(12)窗口。占2个字节。窗口指的是发送本报文段的一端的接收窗口(为不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号,接收方目前允许对方发送是数据量。窗口值作为接收方让发送方设置其发送窗口的依据。
(13)校验和:占2个字节。校验和字段检验的范围包括首部和数据这两部分。
(14)紧急指针。占2个字节。紧急指针尽在URG=1时才有意义。它指出本报文段中的紧急数据的字节数。紧急指针指出了紧急数据的末尾在报文段中的位置。即使窗口为0也可发送紧急数据。
(15)选项。长度可变,最长可达40字节。
(16)填充字段仅仅是为了使整个TCP首部长度是4字节的整数倍。
MSS(最大报文段长度):指每一个TCP报文段中的数据字段的最大长度。TCP报文段长度减去TCP首部长度。
选择确认(SACK)
窗口扩大。占三个字节,其中一个字节表示移位值S。新的窗口值等于TCP首部中的窗口位数从16增大到(16+S)。S最大值是14。当某一端不需要窗口扩大时,可发送S=0的选项,使其窗口大小回到16。
时间戳:占10个字节,其中最重要的字段是时间戳值字段(4字节)和时间戳回送回答字段(4字节)
时间戳的两个功能:
第一,用来计算往返时间RTT
第二,用于处理TCP序号超过2^32的情况,这又称为防止序号绕回PAWS