TCP连接的建立与释放(三次握手与四次挥手)

      在介绍TCP连接建立与释放之前,首先介绍TCP首部,然后再介绍三次握手与四次挥手。

     TCP提供了一种可靠的,面向连接的字节流服务。面向连接表示两个使用TCP的应用(一般是一个服务端和一个客户端)在彼此交换数据前必须先建立TCP连接;关于TCP连接的可靠性会在文章末尾进行解释。

     TCP的首部

    

每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个与IP数据报中的源IP地址和目的IP地址可以唯一确定一个TCP连接。序列号seq,确认号ack各占4个字节。

在建立和释放TCP连接时,主要是对6个标志进行改变:

URG   紧急指针有效

ACK   确认序号有效

PSH   接受方应尽快将这个报文段交给应用层

RST   重建连接

SYN  同步序号用来发起一个连接

FIN   发端完成发送任务

TCP建立连接(三次握手)

描述(我要与你建立连接;你真的要与我建立连接吗;我真的要与你建立连接,成功)

第一次握手:客户端发送连接请求报文段到服务端,并进入SYN-SENT状态,等待服务端确认(SYN = 1,seq = x);

第二次握手:服务端收到连接请求报文,如果同意建立连接,向客户端发送确认报文段,进入SYN-RCVD状态,并为TCP连接分配TCP缓存和变量(SYN = 1,ACK = 1,seq  = y,ack = x+1);

第三次握手:客户端收到服务端的确认报文后,向服务端发送确认报文,并分配缓存和变量,此数据包发送完毕后,客户端和服务端进入ESTAB-LISHED状态,TCP连接成功,完成三次握手。(ACK = 1,seq = x+1,ack = y+1).

TCP释放连接(四次挥手)

描述(我要与你断开连接;好吧断吧;我要与你断开连接;好吧断吧)

由于TCP为应用层提供全双工服务,所以数据可以在两个方向进行独立传输,在释放TCP连接时,需要关闭两个方向的连接。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

第一次挥手:客户端向服务端发送FIN发起终止连接请求,主动关闭客户端到服务端的数据传输,并进入FIN-WAIT-1状态;(FIN = 1,seq = u);

第二次挥手:服务端收到这个请求,向客户端发送ACK,而确认号问发送号+1,进入CLOSE-WAIT状态,客户端进入FIN-WAIT-2状态;(FIN = 1,ACK = 1,seq = v,ack = u+1)(此时相当于TCP连接是半关闭状态,客户端不能向服务端发送数据,但服务端还可以向客户端发送数据)

第三次挥手:服务端关闭客户端的连接,发送一个FIN给客户端,并进入LAST-ACK状态;(FIN = 1,ACK = 1,seq = w,ack = u+1);

第四次挥手:客户端发送确认报文,发送完毕后,服务端进入CLOSED状态,而客户端进入TIME-WAIT状态,等待2MSL后进入CLOSED状态,TCP连接释放,四次挥手结束(ACK = 1,seq = u+1,ack = w+1)。

问题:

1、TCP建立连接时,为什么是三次握手,而不是两次?

为了防止已经失效的链接请求报文再次传到服务端,出现错误。采用两次握手的话,Client向Server发送链接请求s1,但由于某些原因导致s1堵塞,在一定时间未传送到Server,所以Client会认为s1丢失,再次向Server发送链接请求s2,Server接收到并向Client确认,二者建立连接,二者传输数据结束后,断开连接,此时s1到达Server,Server接收到并恢复ACK,Client又与Server建立连接。

2、TCP释放连接时,为什么需要四次挥手?

因为三次挥手代表,当Server收到Client的FIN1时候将ACK和FIN2同时发送给Client,Client回复ACK2,完成三次挥手。如果这样则相当于在四次挥手基础上去掉了Server收到FIN1回复ACK后的CLOSE_WAIT状态,那么如果Server发送缓冲区或者网络节点上还有发送给Client未发送完成的数据,而且FIN2先于数据到达Client,会造成数据的丢失。

3、TCP连接的可靠性通过什么保证?

TCP提供一种面向连接的,可靠的字节流服务,面向连接表示两个使用TCP的应用(一般是一个客户端,一个服务端)在传输数据前必须建立TCP连接。在一个TCP连接中,只有两方进行通信。字节流服务表示两个应用间通过建立TCP连接而只能8bit的字节流。可靠性主要通过以下几个方面保证:

(1) 应用数据被分割成 TCP认为最适合发送的数据块;

(2)数据包校验(利用校验和    ):目的是检测数据传输过程中数据包的变化,若数据包校验失败,则丢弃报文段并不给回应,则发送数据段超时后会重发数据;

(3)对失序数据包重排序:TCP报文段作为IP数据包来传输,IP数据报的到达可能会失序,那么TCP报文段的到达可能也会失序,TCP对失序数据重排序,再交给应用层;

(4)丢弃重复数据: 既然I P数据报会发生重复, T C P的接收端必须丢弃重复的数据;

(5)应答机制(ack):TCP收到TCP连接的另一端发送的数据,会发送一个确认信息,但不是立即发送,一般是迟几分之一秒;

(6)超时重发:TCP发出一个报文段后,会有 一个定时器,等待目的端确认收到这个报文段,若不能及时收到确认信息,发送端会重新发送这个报文段;

(7)流量控制:TCP连接的每一段都有固定的缓存空间, TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。

4、释放TCP连接时,为什么要等待2MSL?

MSL代表最大报文生存时间,当报文超过这个时间,就会被丢弃。

       首先,为了保证客户端发送的最后一个ACK报文段能够到达服务端。即最后这个确认报文段很有可能丢失,那么服务端会超时重传,然后客户端再一次确认,同时启动2MSL计时器,如此下去。如果没有等待时间,发送完确认报文段就立即释放连接的话,服务端就无法重传了(连接已被释放,任何数据都不能出传了),因而也就收不到确认,就无法按照步骤进入CLOSE状态,即必须收到确认才能close。
      防止“已失效的连接请求报文段”出现在连接中。经过2MSL,那些在这个连接持续的时间内,产生的所有报文段就可以都从网络中消失。即在这个连接释放的过程中会有一些无效的报文段滞留在楼阁结点,但是呢,经过2MSL这些无效报文段就肯定可以发送到目的地,不会滞留在网络中。这样的话,在下一个连接中就不会出现上一个连接遗留下来的请求报文段了。
可以看出:服务端结束TCP连接的时间比客户端早一点,因为服务端收到确认就断开连接了,而客户端还得等待2MSL。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值