TCP提供了一个类似点到点的连接,但是实际上这条连接并不存在。TCP是建立在IP协议之上的,而IP协议又是无连接的,所以TCP使用序列号、确认、校验和、定时器以及窗口机制等措施在无连接的服务之上提供实现面向连接,尽力而为的转发服务。
源端口和目的端口的字段长度各为16为,其作用是为封装的数据指定了源和目的应用程序。
序列号字段长度为32位,其作用是标记数据段,如果一个数据需要多个数据段段传送,那么接收者可以根据序列号对数据段进行重组。
确认序列号字段长度为32位,其作用是接收者告诉发送者下一次要收到的序列号,通过这样,发送者可以知道那些数据段没有到达,以便即时重传对应数据。
报头长度字段长度为4位,描述的是以32位为单位的报头长度。报头由于有可选项,所以长度是可变的。
保留字段为4位,通常设置为0。
标记字段长度位八位,包括 8个 1 bit的标记,用于流和连接控制。它们从左到右的分别是:拥塞窗口减少(Congestion Window Reduced,CWR)、ECN-Echo(ECE)、紧急(URG)、确认(ACK)、弹出(PSH)、复位(RST)、同步(SYN)、结束(FIN)。必须的标记字段是SYN、ACK、FIN。
窗口大小字段长度为16位,其作用是为了能够在传输几段数据之后对这几段的数据进行确认,可以优化TCP的通信。
紧急指针字段只有在标记字段中的URG位置位时才被使用。
(1)借助一个telnet不登陆的会话来进行分析:
TELNET是基于TCP的,所以TELNET的通信先要经过TCP的三次握手。从上图可以看到,SYN仅仅出现在第一个数据帧中,序列号字段为0,发起者是12.1.1.1,目标是12.1.1.2。这表明SYN代表一个会话的开始建立。
第二个数据帧是目标向发起者回复的,可以看到SYN和ACK被置位。ACK置位是对发起者的SYN进行确认,TCP是期望确认,也就是用希望收到的下一个报文的序列号来进行确认,由上图可以看到确认序号为1,证实了这一点。TCP看似是一个双向通信,其实是由两个通信组成的。所以目标主机会向发起者发送一个SYN,而这个SYN和ACK在同一个报文中被置位,节省资源。
第三个数据帧是对目标主机发起的SYN进行确认。
至此TCP连接建立成功,可以传输数据。由上图可知,紧接着就是传输TELNET的数据。
正如TCP建立连接一样,是建立两个单向连接,则断开连接则是断开两个单向连接。这里关注最后四个数据帧。可以看出是目标主机主动断开。所以FIN被置位。因为要对上一个数据帧进行确认,所以ACK被置位。因为TENLNET失败,需要马上把连接断开,所以PSH被置位。然后发起者对这个数据帧进行确认,回复一个ACK,至此,目标主机到发起者的单向会话关闭。同理,发起者到目标主机会话关闭。
(2)不开启TELNET服务的TCP会话
可以看到目标主机回复报文中RST被置位。代表发起者的报文目标主机并不接受,RST置位告诉发起者所发起的TCP连接被重置了。