tcp 三次握手四次挥手

tcp 三次握手四次挥手

基于数据包的传输, 不可切割的一个原子过程,端到端是唯一通信的

在传输控制层 (tcp、udp)完成

什么是tcp

1、面向连接的,连接是逻辑上的连接,连接就是为双方建立资源(三次握手)–双方经过三次握手并开辟了资源才叫连接
2、可靠的传输协议

tcp 报文格式
在这里插入图片描述
32位序列号 seq ,根据发报文过程中慢慢增长
确认序号就是 ack(32位) ,下面也有一个ACK,是确认标志位(1位 0和1)
syn 发起一个新的连接
fin 结束一个连接

其中比较重要的字段有:

(1)序号(sequence number):Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

(2)确认号(acknowledgement number):Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。

(3)标志位(Flags):共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:

URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:发起一个新连接。
FIN:释放一个连接。

需要注意的是:

不要将确认序号Ack与标志位中的ACK搞混了。确认方Ack=发起方Seq+1,两端配对。

三次握手

双方内核在进行沟通

标志位 + seq (初始化随机 32 位序列号)
在这里插入图片描述
在这里插入图片描述

ack:确认的意思
经过三次握手之后,双方就会在内存开辟相应的资源(结构体、对象、内存缓冲区,socket)。双方都会在内存中建立。
三次握手只是建立连接的一个过程,仅仅当双方资源建立后,资源为对方提供服务,这才是建立连接

为什么不能是两次握手

连接是双向的,对应有输入和输出,c 向 s 发送 syn 成功,s 向 c 返回 syn :ack 成功。针对 c 来说,我能感知到我自己的发送和接收都是ok的。但对于 s 来说,我仅仅只能感知到 我 接收是 ok的,但是发送 无法确认 c 是否能收到 syn :ack 数据包。(确认机制)正因为有确认机制,所以 保证了可靠性

socket

接字 (唯一表示)
四元组 ip + port : ip + port(本端和对端)
ip 负责找到主机,port 负责找到程序(65535),故,同一个ip 最多建立 65535 个连接。
可以通过虚拟 ip 来实现高并发
都是内核维护的资源

三次握手攻击

syn 攻击
大量虚拟 c 频繁 发送 syn 包到 s,收到s 返回的 syn ack 数据包后并不发送 ack 包确认建立连接,消耗s 内核资源。让真正需要建立连接的 c 无法建立

四次挥手

为什么要挥手

内核资源是有限的,不用的资源要及时进行释放,故要进行挥手

挥手过程

在这里插入图片描述
在这里插入图片描述

客户端 向 服务端 发送 断开连接请求 (fin),服务端收到后返回 ack 给 客户端确认,这个过程执行结果表示 客户端向 服务端发送断开连接请求成功,服务都收到了客户端的断开请求,但是此时 服务端未 就绪,仅仅做一个 消息确认。(如此时 服务端还有未发送完的数据)
当服务端就绪后,服务端会向 客户端发送断开连接请求 fin,表明此时服务端以就绪,可以断开连接,客户端收到服务端的断开连接请求后同样会给服务端返回一个ack确认包,然后断开连接。这就是四次挥手的大致过程

打个比方去理解下四次挥手

比如离婚,女生觉得日子过的苦想离婚,然后和男方提出了离婚 (这一步相当于客户端向服务端发送 fin 数据包),男方收到 女方的请求后,给女方做了回应,我知道你的意思了(这一步相当于 服务端给客户端 返回ack数据包),但是此时男方仅仅是做了一个回应,此时他还在写代码,无法去办理离婚手续。
等待男方代码写完后,男方 会给女方说,我这边忙完了,可以和你去办理手续(这一步相当于服务端向客户端发送 fin 数据包 断开连接),女方听到后,给男方 回复 确认,最后两人去办理成功。(连接断开)

在这里插入图片描述

为什么握手是三次,挥手是四次

TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。

即SYN建立连接报文与ACK确认接收报文是在同一次"握手"当中传输的,所以"三次握手"不多也不少,正好让双方明确彼此信息互通。

TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。为何建立连接时一起传输,释放连接时却要分开传输?

建立连接时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。
释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。

所以是“三次握手”,“四次挥手”。

为什么客户端在TIME-WAIT阶段要等2MSL?

为的是确认服务器端是否收到客户端发出的ACK确认报文

当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。

服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文;

如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;
否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”。

所以,客户端要经历时长为2SML的TIME-WAIT阶段;这也是为什么客户端比服务器端晚进入CLOSED阶段的原因

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值