TCP连接建立与关闭

来源:互联网 发布:linux 文件权限所有者 编辑:程序博客网 时间:2024/05/19 23:04

TCP连接建立与关闭

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议.


连接建立(三次握手)

TCP是传输层协议,使用三次握手建立连接,当主动方发出 SYN 连接请求时,接收方接受请求后,发出 SYN+ACK 作为响应,接收到响应后,对响应的 SYN 执行 ACK 确认。这种连接建立方式可以避免错误连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。

TCP三次握手过程如下:

  • 客户端发送连接请求(SYN=1,seq=x)报文给服务端,进入SYN状态
  • 服务端收到请求,回应一个SYN+ACK(SYN=1,ACK=x+1,seq=y)报文,此时服务器进入SYN_RECV状态
  • 客户端收到服务端的SYN报文,回应一个ACK(ACK=y+1),进入Established状态

这里写图片描述

三次握手”的目的:为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。例如:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。

连接关闭(四次挥手)

由于TCP是全双工的,每个方向都必须单独关闭。当一方完成数据发送任务就能发送一个FIN终止这个方向的连接。收到一个FIN只是意味着这一方向上没有数据流动,TCP收到FIN后任然能发送数据。建立一个连接需要三次握手,而关闭一个连接需要四次握手,这是由于连接半关闭(half-close)造成的。

具体过程如下:

  • 主动方发A发送一个FIN(FIN=1,seq=x),用来关闭A到被动方B的数据发送
  • 被动方B收到FIN,响应一个ACK(ACK=x+1)给A
  • B关闭与A的连接,并发送一个FIN(FIN=1,seq=y)给A
  • A向B发送ACK(ACK=y+1)

每个方向都需要一个FIN和一个ACK,因此通常需要挥手四次。

  • “通常”是指,某些情况下,步骤1的FIN随数据一起发送,另外,第二步和第三步发送的分节都出自执行被动关闭那一端,有可能被合并成一个步骤。
  • 在第二步与第三步之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,这称为“半关闭”(half-close)。

这里写图片描述

原创粉丝点击