zoukankan      html  css  js  c++  java
  • 计算机网络(11)-----TCP连接的建立和释放

    TCP连接的建立和释放

    概述

      TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程,运输连接有三个阶段:连接建立数据传送连接释放

    TCP连接的建立

      

      如图所示,假定A主机是客户端程序,B主机是服务端程序。最初两端的TCP进程都是出于CLOSED(关闭)状态。

      (1)B的TCP服务器进程先创建传输控制块TCB(transmission Control Block),准备接受客户进程的连接请求。然后服务器就进入LISTEN(监听)状态,等待客户端的连接请求。

      (2)A的TCP客户进程也是首先创建传输控制块TCB,然后向B发出连接请求报文段,这是首部中的同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN报文段不能携带数据,但是要消耗掉一个序号。这是TCP客户进程进入SYN-SENT(同步已发送)状态

      (3)B收到连接请求报文段后,如果同意建立连接,则向A发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号ack=x+1,同时也为自己选择一个初始序号seq=y。这个报文段也不能携带数据,但同样要消耗掉一个序号。这时TCP服务器进入SYN-RCVD(同步收到)状态

      (4)TCP客户京城收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。TCP标准规定,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。这时TCP连接已经建立了,A进入ESTABLISHED(已建立连接)状态。

      疑问:

        为什么A还要发送一次确认呢?

        假定出现这样一种情况,即A发出第一个连接请求报文段在某些网络节点长时间滞留了,以致延误到连接释放以后的某个时间才达到B。本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了。

    TCP连接的释放

      

      如图所示,数据传输结束后,通信双方都可释放连接。现在A和B都处于ESTABLISHED状态。

      (1)A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1。这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。TCP规定,FIN报文段即使不携带,也要消耗一个序号

      (2)B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1。然后B就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP出于半关闭(half-close)状态,即A已经没有数据要发送了,但B若发送数据,A仍要接收。也就是说,从B到A这个方向的连接并未关闭,这个状态可能会持续一段时间。

      (3)A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。

      (4)若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN=1。假定B的序号为w(在半关闭状态可能又发送了一些数据)。B还必须重复上次已发送过的确认号ack=u+1。这时B就进入LAST-ACK(最后确认)状态,等待A的确认。

      (5)A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack=w+1,而自己的序号是seq=u+1,然后进入到TIME-WAIT(时间等待状态)。此时,连接并没有释放,必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入到CLOSED状态时间MSL叫做最长报文段寿命

      疑问

        为什么A在TIME-WAIT状态必须等待2MSL时间呢?

        (1)为了保证A发送的最后一个ACK报文段能够达到B。这个ACK报文段有可能丢失,因而使处在LASK-ACK状态的B收不到对己方发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着A重传一次确认,重新启动2MSL计时器。最后,A和B都正常进入到CLOSED状态。

        (2)防止已失效的连接请求报文段,A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。

      保活计时器(keepalive timer)

      客户端的主机突然出了故障。线程,服务器以后修不能再接受客户发来的数据。服务器不能白白等下去。这就是使用保活计时器。服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是2个小时。若两个小时没有收到客户的数据,就每隔75分钟发送一次探测报文段。若发送10个探测报文段后扔无反应,服务端就认为是客户端出了问题,接着就关闭了这个连接。

    TCP连接测试

      测试工具:Linux服务器,Tomcat服务器,浏览器客户端。

      测试结果及分析:

        (1)Linux服务器启动Tomcat服务器,Tomcat服务器默认监听8080端口。

        

        (2)使用Tcpdump -X TCP port 8080 对8080端口进行监听

        

        (3)在对TCP开始分析之前,先贴出TCP报文段的头部格式

        

        (4)使用浏览器访问Tomcat服务器,对TCP进行分析,第一次握手

       

        对于上述头部分析:seq序号为9ee1 38a3,此时的ack确认号为0,数据偏移(TCO首部长度)+保留+标记位为a002,转换为二进制得1010000000000010,对照上面的首部格式,可以分析出SYN同步位置1,其余标记位都为0.

        (5)第二次握手 

        此时,seq序号为3d36 f797,ack确认号为9ee1 38a4,对于上一次的请求x=seq,这次的确认号ack=x+1。数据偏移(TCO首部长度)+保留+标记位为a012,转换为二进制得1010000000010010,可以分析得ACK=1,SYN=1。

        (6)第三次握手

        

        此时,seq序号为9ee1 38a4,ack确认号为3d36 f798,对于上一次的请求y=seq,这次的确认号ack=y+1,而这次的seq还是为x+1。数据偏移(TCO首部长度)+保留+标记位为8010,转换为二进制得1000000000010000,可以分析得只有ACK还在置1。

  • 相关阅读:
    北京燃气IC卡充值笔记
    随机分析、随机控制等科目在量化投资、计算金融方向有哪些应用?
    量化交易平台大全
    Doctor of Philosophy in Computational and Mathematical Engineering
    Institute for Computational and Mathematical Engineering
    Requirements for the Master of Science in Computational and Mathematical Engineering
    MSc in Mathematical and Computational Finance
    万字长文:详解多智能体强化学习的基础和应用
    数据处理思想和程序架构: 使用Mbedtls包中的SSL,和服务器进行网络加密通信
    31-STM32+W5500+AIR202/302基本控制篇-功能优化-W5500移植mbedtls库以SSL方式连接MQTT服务器(单向忽略认证)
  • 原文地址:https://www.cnblogs.com/a294098789/p/5664030.html
Copyright © 2011-2022 走看看