TCP -- 三次握手、四次挥手

TCP建立连接和终止连接会涉及到TCP首部的确认字段,相关知识在上一篇博客里:https://mp.csdn.net/mdeditor/90704793#

一、三次握手 – 建立一个TCP连接

三次握手过程:

  1. 客户端发起,第一次握手时,SYN=1(指明客户端打算连接的服务器的地址),客户端发起第一次握手后处于SYN-SENT状态;
  2. 服务端接收到消息后,发起第二次握手作为应答,SYN=1,ACK=1,服务端发出握手后处于SYN-RCVD状态;
  3. 客户端收到服务端连接,发起第三次握手,ACK=1,客户端发出握手后处于ESTAB-LISHED状态,服务端收到消息后,也会进入ESTAB-LISHED状态;

  服务端和客户端都处于ESTAB-LISHED状态就可以进行双向通信了;

  注意:发送第一个SYN的一端将执行主动打开,接受这个SYN并发回下一个SYN的另一端是被动打开;
在这里插入图片描述

二、四次挥手 – 终止一个TCP连接

  TCP建立连接需要三次握手,但释放连接却需要四次挥手,这是TCP的半关闭(TCP的半关闭:TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力)造成的,TCP连接是全双工,因此每个方向上都要单独的进行关闭,就是当一方完成它的数据传输任务之后就可以发送FIN来终止这个单方向的连接,当一端收到一个FIN,必须通知应用层另一端几经终止了那个方向的数据传送,发送FIN通常只是应用层进行关闭的结果;
  收到一个FIN意味着这个方向上没有数据流动,一个TCP连接在收到一个FIN后仍能向另一端发送数据,但在实际中只有很少的TCP应用会这样;
  首先发送FIN的一端会执行主动关闭,而另一方则是执行被动关闭,在特殊情况下,会出现双方都主动关闭的情况;

客户端主动发起挥手过程:

  1. 客户端主动发起第一次挥手,FIN=1,客户端发出挥手后,处于FIN-WAIT-1状态;
  2. 服务端接受到挥手消息,发起第二次挥手,ACK=1,服务端处于COLSE-WAIT状态;

  客户端接收到第二次挥手消息后,处于FIN-WAIT-2状态,客户端不能再给服务端发送消息,但服务端可以给客户端发送消息,由全双工变为单项通行;

  1. 服务端发起第三次挥手,FIN=1,ACK=1,服务端处于LAST-ACK状态
  2. 客户端接收到服务端挥手消息,发起第四次挥手,ACK=1,客户端处于TIME-WAIT状态;

  服务端接收到客户端挥手消息,进入CLOSE状态,客户端在2MSL定时器溢出后由TIME-WAIT状态进入到CLOSE状态;
在这里插入图片描述



  上面的建立连接和关闭连接都是在假设是客户端主动打开或者主动关闭的基础上讨论的,在实际中也可能会出现两个应用程序同时彼此主动打开,或者同时关闭的情况。

三、同时打开和同时关闭
  1. 同时打开连接

  两个应用程序同时彼此主动打开,每一方必须发送一个SYN,且这些SYN必须传递给对方,这就是同时打开;
  TCP是特意设计为了可以处理同时打开,对于同时打开它建立一条连接而不是两条连接,当出现同时打开的情况时,两端几乎同时发送SYN,并进入SYN_SENT状态,当一端收到SYN时,状态变为SYN_RCVD,同时它们都会再发送SYN并对收到的SYN进行确认,当双方都收到SYN及相应的ACK时,状态都会变成ESTABLISHED,过程如下图;
在这里插入图片描述
  一个同时打开的连接需要四个报文段,比正常的三次握手多一个,这时不会将一端称为客户端或是服务器端,因为每一端即是客户端又是服务器;

  1. 同时关闭连接

  上面提到的四次挥手是客户端(通常都是客户端)发送第一个FIN执行主动关闭,当客户端和服务器都执行主动关闭就是同时关闭,TCP也允许这样的同时关闭;
  当应用层发出关闭命令,两端都从ESTABLISHED变为FIN_WAIT_1,双方都会发送一个FIN,两个FIN经过网络传送后分别到达另一端,收到FIN后,状态由FIN_WAIT_1变为CLOSING,并发送最后的ACK,两端在收到最后的ACK时,状态变化为TIME_WAIT。
在这里插入图片描述
  同时关闭与正常关闭时使用的报文段交换数目相同;

四、TCP传输数据可靠性的体现:
  • 数据通信前进行连接,通信结束释放连接;
  • 保证数据完全到达目的端:确认应答机制和超时重传机制;
  • 接收方接收的数据都是有序的,在发送数据头部的序号+数据的大小就可以确定数据的位置以及下一次接收数据的起始位置;
  • 数据发送和接收是完全相同的,通过头部的;校验和字段来判断接收数据是否存在损坏,存在损坏则丢弃,重新接收客户端的发送(客户端超时重传);
五、TCP的状态变迁图

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值