TCP连接的建立与释放
题目:使用Cisco Packet Tracer模拟TCP连接的建立以及释放过程,分析每个互交报文的序列号,确认号,Flags不同标志位的变化及原因。
1.TCP连接的建立(三次握手)
TCP的链接的建立的过程被称为“三次握手”,因为通信双方在建立链接的时候需要发送三个报文。为了清楚了解TCP的三次握手过程,搭建如下图所示的TCP连接建立实验拓扑。
(*注:要确保服务器HTTP是开着的,一般系统会自动默认是打开的。)
配置好基本信息,将Packet Tracer模拟器切换到Simulation模式,打开客户端Web Browser,输入192.168.1.254,观察报文发送过程。
(*注:此时会出现多个报文,为了使观察更加清楚可以点击ShowAll/None先屏蔽掉所有类型的报文,然后点击EditFilters来选择自己想要看见的报文类型,这里我们选择TCP类型的和HTTP类型的。
)
因为HTTP服务是基于YCP的,所以当请求访问网页时会先建立TCP连接。下图为客户端发送的TCP连接建立请求报文。即第一次握手
从报文段中可以看出,HTTP服务使用TCP端口号80,报文序号为0,确认序号也为0,SYN同步标志置1。下图为服务器发送的确认报文。即第二次握手
可以看到,服务器的确认报文段序列号为0,确认号为1,同时将SYN和ACK 两个标志位置1。如下图是客户端的再次确认报文。即第三次握手
由于客户端的连接建立请求报文已经消耗掉了一个序号,因此这个再确认报文的序号为1,确认号为1,ACK标志置1。
2.TCP连接的释放(四次挥手)
在数据传输结束后,通信双方都可以发出释放连接的请求。TCP采用“文雅"的方式释放连接。也就是说,TCP连接的释放是在两个方向上分别释放连接,每个方向上的连接的释放只终止本方向的数据传输。
当一个方向的连接释放后,TCP的连接就处于“半连接”或“半关闭”状态。当两个方向的连接都释放后,TCP连接才完全释放,下图显示了TCP连接的释放过程。
PC0收到应用层的通知,向服务器发送FIN为1的连接释放报文段,报文段的序号为U,它是之前PC0已发送的所有数据的最后一个字节的序号加1.按照TCP的规定,这个FIN报文段要消耗一个序号。
随后服务器收到PC0的连接释放请求并向PC0发出确认,确认序号是U加1。服务器的确认报文序号是V,同样,它是之前服务器已发送的所有数据的最后一个字节的序号加1.
至此,从PC0到服务器这个方向的TCP连接已经释放,PC0不能在向服务器发送报文。但从服务器到PC0这个方向的TCP连接并未关闭,因此服务器仍然可以向PC0发送报文。这时的TCP连接处于半关闭状态。
服务器收到应用层的通知,向PC0发送FIN为1的连接释放报文段。注意到这个报文段的序号是W,而W不一定等于V,因为服务器可能在半关闭状态下又向PC0发送了一些数据。
在PC0收到服务器的释放连接请求并向服务器发送ACK为1的确认报文,报文序号是U加1,确认报文是W加1.
最后,服务器收到PC0的确认报文,释放到PC0这个方向的TCP连接。
在数据传输结束后,通信双方都可以发出释放要求。首先由客户端向服务器发送连接释放报文段,并主动关闭TCP连接。此报文中,终止控制FIN和ACK都为1,序号是103,确认序号为472.如下图所示
随后服务器收到连接释放报文后立即发出确认报文,确认序号为104,而这个报文本身序号为472,
ACK控制位是1,如下图所示
此时TCP连接已经处于半关闭状态,即PC0到服务器的方向的连接已经断开,但是服务器到PC0的方向的连接还没断,也就是说,服务器还是可以向PC0发送数据。如果服务器已经没有什么数据报文发给PC0,就向PC0发送一个连接释放的报文。这个终止报文的终止控制位FIN和ACK控制位都是1,确认序号为472.如下图所示。
PC0在接收到报文后也会对此发出确认报文段,在确认报文段中把ACK控制位置为1,确认序号472,报文本身的序号为103.
TCP连接过程:
(1) 服务端通过socket,bind和listen准备好接受外来的连接,此时服务端状态为Listen
(2)客户端通过调用connect来发起主动连接,导致客户端TCP发送一个SYN(同步)字节,告诉服务器客户将在(待建立的)连接中发送的数据的初始序列号,客户端状态为SYN_SENT。
(3)服务器确认(ACK)客户的SYN,并自己也发送一个SYN,它包含服务器将在同一连接中发送数据的初始序列号。
(4)客户端确认服务的ACK和SYN,向服务器发送ACK,客户端状态ESTABLISHED
(5)服务器接收ACK,服务器状态ESABLISHED。