tcp连接的建立与终止

来源:互联网 发布:手机淘宝套餐链接 编辑:程序博客网 时间:2024/05/20 22:26
tcp协议,全称传输控制协议,位于tcp/ip协议族中的运输层,是一种面向连接的,可靠的协议,主要用于在两个不同进程间传输数据(一般这两个进程的主机也不相同)。要使用tcp传输数据首先得建立连接。tcp连接的建立主要包括两种:    1.正常的建立(三路握手),主要体现在c/s模型中,其建立过程如图:

这里写图片描述

    2.同时打开建立连接:    注:同时打开需要每一方使用一个对方熟知的端口作为本地端口tcp的终止(正常情况下)也分为两种:    1.正常终止:

这里写图片描述
2.同时关闭:
这里写图片描述
tcp状态图:
这里写图片描述
注:只有当SYN_RCVD状态是从LISTEBN状态(正常情况)进入,而不是从SYN_SENT状态(同时打开)进入时,从SYN_RCVD回到LISTEN的状态变迁才是有效的。这意味着如果我们执行被动关闭(进入LISTEN),收到一个SYN,发送一个带ACK的SYN(进入SYN_RCVD),
然后收到一个RST,而不是ACK,便又回到LISTEN状态等待另一个连接请求的到来。
2MSL等待状态:TIME_WAIT状态也称为2MSL等待状态。MSL即一个报文段最大生存时间,它是任何报文段在被丢弃前在网络内的最长时间。实现中常用的MSL为30秒,1分钟或者2分钟。对一个具体实现所给定的MSL值,处理的原则是:当tcp执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样可让tcp再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)。在连接处于2MSL等待时,任何迟到的报文段将被丢弃,并且这个tcp连接(客户的ip地址和端口,服务器的ip地址和端口)不能被使用。这暗示如果我们终止一个客户程序,并立即重启这个客户程序,则这个新客户程序将不能重用相同的本地端口。如果我们终止一个已经建立连接的服务器程序,并试图立即重新启动这个服务器程序,服务器程序将不能把这个熟知端口赋值给它的端点,因为那个端口是处于2MSL连接的一部分。如果一个客户程序试图申请一个处于2MSL等待的端口,将出现同样的错误。tcp不允许一个新的连接建立在同样的socket对上。
平静时间:tcp在重启后的MSL内不能建立任何连接,这就称为平静时间。
半关闭:tcp连接的一端在结束它的发送后还能接收来自另一端的数据。
半关闭的作用:没有半关闭,需要其他的一些技术让客户通知服务器,客户端已经完成了它的数据传送,但仍要接受来自服务器的数据。使用两个tcp连接也可作为一个选择,但使用半关闭更好。
半打开连接:如果一方已经关闭或异常终止连接而另一方却还不知道,这样的tcp连接称为半打开的。
连接建立的超时:
很多情况下连接无法建立,一种情况是服务器主机没有处于正常状态,在这种情况下客户端会有间隔地发送3次syn,试图建立连接,第一次与第二次间隔5~6秒,第三次与第二次间隔为24秒,大多数BSD将建立一个新连接的最长时间限制为75秒。
最大报文段长度MSS:
最大报文段长度表示tcp传往另一端的最大块数据的长度,tcp会拒绝接收超过MSS的报文。当一个连接建立时,连接的双方都要通告各自的MSS。MSS选项只能出现再SYN报文段中。如果一方不接收来自另一方的MSS值,则MSS就定为默认值536字节。MSS不包含ip首部和tcp首部。MSS让主机限制另一端发送数据报的长度,加上主机也能控制它发送数据报的长度,这将使以较小MTU连接到一个网络上的主机避免分段。
复位报文段:产生复位报文段的三种情况:
1.到不存在的端口连接请求(即对端没有相应的进程运行)
2.异常终止一个连接。优点:丢弃任何待发送数据并立即发送复位报文段,RST的接收方会区分另一端执行的是异常关闭还是正常关闭。
3.在一个半打开连接中,当服务器重启后,如果客户程序向服务器发送数据,接收方以复位作为应答。