【网络】详解TCP协议的“三次握手”/“四次挥手“

一. TCP协议段格式

在这里插入图片描述
要实现“三次握手”这样的机制,主要依赖于6个标志位中的SYN(synchronize)、ACK(acknowledge)、FIN(finish)。

二. 三次握手

1.基本模型

在这里插入图片描述
所谓的“三次握手”就是让通信双方建立连接的过程(TCP有连接的特性),客户端为主动的一方,“三次握手”中的第一次交互一般是由客户端发起的。

  1. SYN报文
    SYN报文呢就是一个特殊的TCP数据段,没有载荷,六位标志位中的SYN为1,表示想要与对方建立连接。
  2. ACK报文
    ACK报文也是一个特殊的TCP数据段,没有载荷,六位标志位中的ACK为1,即应答报文。

建立连接的过程就是通信双方各自给对方发送一个SYN报文,各自给对方回应一个ACK报文。
由于中间服务器返回的ACK报文和SYN报文可以合并,故称为三次握手。(这主要是由于这两个报文都由系统内核控制发出,而且合并只需要ACK位和SYN位同时为1,不会发生冲突)
合并后的模型为
在这里插入图片描述

2.状态转换

在这里插入图片描述
这里主要关注服务器在没有收到SYN报文时的LISTEN状态,以及建立连接后服务器/客户端的ESTABLISHED状态。

3.“三次握手”的意义

  1. 针对通信路径,进行“投石问路”,初步确认通信链路是否畅通。[关注点在中间过程]
  2. 验证通信双方的发送能力和接收能力是否正常。[关注点在两端]
    服务端和客户端分别需要确认四个信息:即为自己的接收能力和发送能力是否正常,对方的接受能力和发送能力是否正常。(一定注意是分别
    在这里插入图片描述
    三次握手恰好完成了通信双方确认这四个信息的需求(两次不够,四次多余)。
  3. 协商一些必要的参数
    比如说通信序号的起始值,TCP在一次通信过程中,序号不是从 0/1 开始的,而是选一个比较大的数字,以这个数字开头。即使是同一个客户端/服务器,开始的序号也大不相同。
    ==这主要是为了防止“前朝的剑斩本朝的官”。==由于互联网上经常存在“后发先至/先发后至”的情况,就存在一种情况:
    在这里插入图片描述
    即上一次连接时发送的数据在新一次连接时才到达(客户端端口号虽然大概率不一样,但服务器的端口号大概率是一样的)。那这样的数据显然是应该被丢弃掉的。那如何判断出来这是上一次连接,通过序号来判断,两次连接的起始序号差别很大,通过序号很容易判断出这是不是本次连接的数据。
    再比如说滑动窗口的大小,也能由这个信息返回。

三. 四次挥手

1.基本模型

在这里插入图片描述
所谓的“四次挥手”就是让通信双方断开连接的过程。对于断开连接,客户端和服务端都可以成为主动发起的一方。
比如此处由客户端主动断开连接,在其发送完FIN并收到ACK(前两次“挥手”)后,此时的状态可以理解为:我没有数据要发送了,但我仍能接收你的数据。

"四次挥手"并不像“三次握手”一样一定会将中间两个报文段合并,这主要是由于ACK报文段是由系统内核控制的,而FIN报文段是我们在调用socket.close()的时候触发的。但考虑到TCP具有延时应答和捎带应答的特征,这两个报文段有时候也可以合并。

2.状态转换

1
这里要注意TIME_WAIT状态,即主动要求关闭连接的一方在发送完FIN报文段并接收到ACK报文段后不会立即关闭,而是要进入TIME_WAIT状态[ 2MSL时间,MSL(Maximum Segment Lifetime)是TCP数据段的最大生存时间 ],等待对方发送FIN报文段。

  1. 这样的设计考虑主要是为了防止最后一个ACK报文的丢失。
  2. 其次还会用于丢弃一些迟到的数据包。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值