第6章传输控制协议实验实验目的与实验环境实验目的掌握TCP协议的报文格式掌握TCP连接的建立和释放过程掌握TCP数据传输中编号与确认的过程理解TCP重传与滑动窗口机制实验环境运行WindowsXP/WindowsServer2003/Windows7操作系统的计算机一台PacketTracer网络模拟器程序TCP协议传输控制协议(TransmissionControlProtocol)主要用于支持那些可靠性要求高的网络应用,如超文本传输协议HTTP、远程终端协议Telnet、文件传输协议FTP、简单邮件传输协议SMTP等。与UDP不同,TCP是面向连接的、可靠的、基于字节流的传输层协议。TCP提供全双工服务,通信的每一方都有发送和接收两个缓冲区,数据同时能双向流动。发送者为发送的每一字节数据都分配一个序号,并用一个递增的确认号来说明期望收到对方发来下一字节数据的序号。如果在规定时间内,发送者没有收到关于这个包的确认响应,就重新发送此包。TCP报文格式16位源端口号16位目的端口号32位序号32位确认序号4位首部长度保留(6位)URGACKPSHRSTSYNFIN16位窗口大小16位校验和16位紧急指针选项数据源端口和目的端口:各占2字节,同UDP中一样,是传输层与应用层的服务接口。序号:占4字节。用来标识从TCP发送端向接收端发送的数据字节流。该字段的值代表当前TCP报文所携带数据的第一个字节的顺序编号。序号是递增的无符号整数,最大为232-1,之后又从0开始。确认号:占4字节。如果设置了ACK控制位,确认号字段代表期望收到对方下一个TCP报文所携带数据第一字节的序号,值应当是上一次已成功收到数据的字节序号加1。确认号N+1表示对已收到前N字节数据的确认。首部长度:占4比特。TCP首部的长度,以4字节为一个单位。保留位:占6比特,全填充0,保留给以后使用。控制位:占6比特,包含URG、ACK、PSH、RST、SYN、FIN等比特控制位。URG为紧急比特,当值为1时表明此报文中有紧急数据,接收方应直接这部分数据交给应用层,而不按原来的顺序在接收缓冲区排队。ACK为确认比特,当值为1时确认号字段才有意义。PSH为推送比特,当值为1时表明发送方没有等发送缓冲区满就封装了此报文中的数据,且要求接收方收到此报文后立即将它和缓冲区中其它报文一起推送。RST为复位比特,值为1时表明出现严重差错,必须重置连接。SYN为同步比特,在请求建立连接时将SYN比特置为1。FIN为终止比特,在请求施放连接时将FIN比特置为1。窗口:占2字节,代表接收窗口,单位为字节。接收方提示发送方在未收到报文确认时,能发送的数据字节数。校验和:占2字节,计算方法与UDP校验和相同。紧急指针:占2字节,当URG比特位为1时有效。紧急数据从数据的第一字节开始,到紧急指针指向的字节结束。选项和填充:可选字段,最多可达40字节,不是4字节的整数倍时用0填充。用于TCP连接双方协商最大报文长度、窗口扩大选项、时间戳选项等。TCP连接的建立(1)TCP是一个面向连接的协议,无论哪一方发送数据之前,都必须先在双方之间建立一条连接,这种连接是通过三次握手建立起来的。三次握手过程如下:1.主机A(客户端)发送一个SYN段指明主机A打算连接的主机B(服务器)的端口,以及初始序号ISN,无ACK标记。2.主机B发回包含主机B的初始序号的SYN报文段作为应答。同时将确认序号设置为主机A的ISN加1以对主机A的SYN报文段进行确认。3.主机A必须将确认序号设置为主机B的ISN加1以对主机B的SYN报文段进行确认。TCP连接的建立(2)当握手进程没有成功完成最终的确认时就会发生半开放连接。半开放连接的过程如下:1.主机A向主机B发送第1个数据包,也就是SYN数据包。2.主机B发送ACKSYN数据包作为回应。3.这时主机A应该发送第3个数据包,即ACK数据包来结束握手,但实际却没有发送第3个数据包,使得主机B一直发送ACKSYN数据包。TCP连接的释放(1)TCP客户端发送一个FIN,用来关闭从客户到服务器的传送,当服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。同时TCP服务器还向应用程序传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的TCP端发送一个FIN,客户必须发回一个确认,并将确认序号设置为收到序号加1。1.主机A(TCP客户端)发送一个FIN,用来关闭从主机A到主机B的传送。2.当主机B(服务器)收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。3.同时主机B还向应用程序传送一个文件结束符。接着主机B就关闭它的连接,导致它的TCP端发送一个FIN。4.主机A必须发回一个确认,并将确认序号设置为收到序号加1。TCP连接的释放(2)TCP提供了连续的一端在结束它的发送后还能接受来自另一端数据的能力。这就是半关闭。半关闭的过程如下:1.主机A(TCP客户端)发送一个FIN。2.当主机B(服务器)收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。3.此时,主机B仍可发送数据,主机A仍然可以对数据发送ACK应答。TCP报文的编号与确认已建立的一个TCP连接中,每个通信方为自己发送的字节数据编号,起始编号是一个随机数。每一个报文的序号表明了该报文携带数据的第一个字节编号,两个方向报文的序号是不相关的。每个通信方使用确认号来确认它已收到的字节。确认号是递增的,接收方将成功接收的报文中序号字段的值加1,作为确认号返回。当报文的SYN比特或FIN比特为1时,虽然数据部分长度为0,但同方向下一个报文的序号也要增加1。而当报文的ACK比特为1,SYN比特和FIN比特不为1,那么同方向下一个报文的序号和当前报文序号相同。超时与重传TCP每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。重传时间是动态计算的。有两种方法:TCP使用来自TCP时间戳选项的值;等于RTT(往返时间)的二倍。滑动窗口为了实现流量控制,TCP使用一种滑动窗口协议。用这种方法,双方主机为每个连接使用一个窗口。窗口区间是缓冲区的一部分包含了一台主机在等待另一台主机的确认期间所能发送的字节数据。该窗口之所以称为滑动窗口,是因为它能随着数据和确认的发送和接收在整个缓冲区内滑动。TCP的滑动窗口是面向字节的。滑动窗口的使用使传输效率更高,同时也能控制数据流量,使接收端不被数据所淹没。实验步骤1.网络配置使用网络仿真软件CiscoPacketTracer模拟图6.4网络,设置服务器A和主机B的IP地址(子网掩码255.255.255.0)。2.观测TCP连接的建立和释放在模拟模式下,设置事件过滤器为“TCP”。从主机B发送一个复杂PDU给服务器A(HTTP应用,目的IP地址为192.168.1.1,源端口为1025,报文数据大小为0,单次发包时间OneShotTime=0)。捕获用于建立A和B之间TCP连接的三次握手TCP报文,分析报文的源端口(SRCPORT)、目的端口(DESTPORT)、序号(SEQUENCENUM)、确认号(ACKNUM)、控制位(URG、ACK、PSH、RST、SYN、FIN等比特)字段的值和各自代表的含义,以及所在IP数据报的源IP地址(SRCIP)、目的IP地址(DSTIP)字段的值和各自代表的含义,填写表6.1。捕获用于断开A和B之间TCP连接的四次握手报文(在PacketTracer模拟器里只有三个报文),填写表6.2。根据表6.1和表6.2的结果,分析TCP的三次握手建立连接和四次握手的释放连接过程。3.理解TCP报文的编号与确认在模拟模式下,设置事件过滤器为“TCP”。使用主机B的Web浏览器访问。捕获并观察主机B和服务器A之间总共传送了几个TCP报文?按事件顺序依次列出每个报文的源IP(SRCIP)、目的IP(DSTIP)、序号(SEQUENCENUM)、确认号(ACKNUM)和控制位(URG、ACK、PSH、RST、SYN、FIN等比特)等字段的值及含义。4.验证TCP的重传机制在模拟模式下,设置事件过滤器为“TCP”。打开服务器A的配置对话框,停止HTTP服务。从主机B发送一个复杂PDU给服务器A(HTTP应用,目的IP地址为192.168.1.1,源端口为1026,报文数据大小为0,单次发包时间OneShotTime=0)。捕获主机B发出的第一个报文,查看报文的控制位(URG、ACK、PSH、RST、SYN、FIN等比特)哪些比特的值为1?观察主机B是否会收到服务器A发来的TCP确认报文?如果没有收到确认报文,主机B大概每隔几秒会重传一次报文?捕获主机B发出的最后一个报文,查看报文的控制位哪些比特的值为1?分析产生结果的原因。思考与讨论为什么TCP建立连接使用三次握手,而TCP释放连接一般使用四次握手?如果使用TCP协议来传输实时语音数据,会出现什么情况?如果使用UDP协议来传输数据文件,会出现什么情况?