TCP连接过程及状态变化

前言

本文章整理自计算机网络-自顶向下网上博客,如有侵权,告知必删

TCP的三次握手

  • 第一步:客户端的TCP首先向服务端的TCP发送一个特殊的TCP报文段。该报文段不包含应用层数据。但是报文段的首部中的一个标志位(即SYN比特) 被置为1。因此这个特殊报文段被称为SYN报文段。另外,客户端会随机的选择一个初始序号(client_isn)[序号的作用,详见TCP可靠传输机制],并将此比编号放置于该起始的TCP SYN报文段的序号字段中。该报文段会被封装在一个IP数据报中,并发送给服务器。

  • 第二步:一旦包含TCP SYN报文段的IP数据报到达服务器,服务器从该数据报中提取出TCP SYN报文段,为该TCP连接分配TCP缓存和变量(现在的服务器一般不会在这一步为TCP连接分配任何缓存和变量),并向客户TCP发送允许连接的报文段。这个连接的报文段也不包含应用层数据。其次,该TCP报文段首部的确认号被置为client_isn + 1。最后服务器选择自己的初始序号(server_isn),并将其放置到TCP报文段首部的序号字段中。这个允许连接的报文段实际上表明了:“我收到了你发起的建立连接SYN分组,该文组带有初始序号client_isn。我同意建立该连接。我自己的初始序号是server_isn。”该允许连接的报文段被称为SYNACK报文段(SYNACL segment)

  • 第三步:在收到SYNACK报文段后,客户也要给该连接分配缓存和变量。客户主机则向服务器发送另一个报文段,这最后一个报文段对服务器的允许连接报文段进行了确认(该客户通过将值server_isn + 1 放置到TCP报文段首部的确认字段中来完成此项工作)。因为连接已经建立了,所以该SYN比特被置为0。该三次握手的第三个阶段可以在报文段负载中携带客户到服务器的数据

    一旦完成这三个步骤,客户和服务器就可以互相发送包括数据的报文段了。在以后的每一个报文段中,SYN比特都将被置为0。注意到为了创建该连接,在两台主机之间发送了3个分组。由于这个原因,这种连接创建过程被称为:3次握手(three-way handshake)。(为什么需要初始序号?为什么需要3次握手,而不是2次握手?)

在这里插入图片描述

四次挥手

  • 第一步:发起关闭的TCP进程,向对端进程发送一个特殊的TCP报文段。这个特殊的报文段让其首部的一个标志位被置为1(FIN比特)
  • 第二步:当对端收到报文段后,就向发起关闭方会送一个确认报文段
  • 第三步:对端发送自己的终止报文段,其FIN比特被置为1
  • 第四步:最后发起关闭方对这个终止报文段进行确认。此时,在两台主机上用于该连接的所有资源都被释放了(缓存,变量)

在这里插入图片描述

TCP的状态转换过程

状态状态描述
CLOSED表示初始状态。对服务端和客户端双方都一样。
LISTEN表示监听状态。服务端调用了listen函数,可以开始accept连接了。
SYN_SENT表示客户端已经发送了SYN报文。当客户端调用connect函数发起连接时,首先发SYN给服务端,然后自己进入SYN_SENT状态,并等待服务端发送ACK+SYN。
SYN_RCVD表示服务端收到客户端发送SYN报文。服务端收到这个报文后,进入SYN_RCVD状态,然后发送ACK+SYN给客户端。
ESTABLISHED表示连接已经建立成功了。服务端发送完ACK+SYN后进入该状态,客户端收到ACK后也进入该状态。
FIN_WAIT_1表示主动关闭连接。无论哪方调用close函数发送FIN报文都会进入这个这个状态。
FIN_WAIT_2表示被动关闭方同意关闭连接。主动关闭连接方收到被动关闭方返回的ACK后,会进入该状态。
TIME_WAIT表示收到对方的FIN报文并发送了ACK报文,就等2MSL后即可回到CLOSED状态了。如果FIN_WAIT_1状态下,收到对方同时带FIN标志和ACK标志的报文时,可以直接进入TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSING表示双方同时关闭连接。如果双方几乎同时调用close函数,那么会出现双方同时发送FIN报文的情况,此时就会出现CLOSING状态,表示双方都在关闭连接。
CLOSE_WAIT表示被动关闭方等待关闭。当收到对方调用close函数发送的FIN报文时,回应对方ACK报文,此时进入CLOSE_WAIT状态。等待本地用户的连接终止请求。
LAST_ACK表示被动关闭方发送FIN报文后,等待对方的ACK报文状态,当收到ACK后进入CLOSED状态。

在这里插入图片描述

什么是2MSL

MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为tcp报文(segment)是ip数据报(datagram)的数据部分,具体称谓请参见《数据在网络各层中的称呼》一文,而ip头中有一个TTL域,TTL是time to live的缩写,中文可以译为“生存时间”,这个生存时间是由源主机设置初始值但不是存的具体时间,而是存储了一个ip数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃,同时发送ICMP报文通知源主机。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。

2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,处理原则是:当TCP执行一个主动关闭,并发回最后一个ACK后,该连接必须在TIME_WAIT状态停留的时间为2MSL。等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次挥手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。 不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。 但是我们将看到TCP原则上扔将避免使用仍处于2MSL连接中的端口。

TTL与MSL是有关系的但不是简单的相等的关系,MSL要大于等于TTL。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值