TCP三次握手、四次断开

TCP和UDP的区别

TCPUDP
连接方面面向连接的,需先建立连接才可传输数据(如电话)UDP是无连接的,直接传输数据(如发信息)
安全方面提供可靠的服务,数据无差错,不丢失,不重复且按序到达尽最大努力交付,不保证可靠交付
传输效率传输效率相对较低传输效率高,适用于高速传输和实时性有效高的通信或广播通信
连接对象数量连接只能是点到点,一对一支持一对一,一对多,多对一和多对多的交互通信

TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接,一个TCP连接必须要经过三次“对话”才能建立起来

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议,它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去

UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的

三次握手

第一次握手:客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认

第二次握手:服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态

第三次握手:客户端收到服务器的SYN+ACK报文段,然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手
在这里插入图片描述
四次断开

第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我已经知道你没有数据要发送了,但先等我把数据接收完;

第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入CLOSE_WAIT状态;

第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后关闭连接;此时,主机1等待2MSL后没有收到回复,则证明Server端已正常关闭,此时主机1也可以关闭连接了
在这里插入图片描述
TCP首部中标志位

依次为URG,ACK,PSH,RST,SYN,FIN

URG:此标志表示TCP包的紧急指针域有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据

ACK:此标志表示应答域有效

PSH:这个标志位表示Push操作

RST:这个标志表示连接复位请求

SYN:表示同步序号,用来建立连接。SYN标志位和ACK标志位搭配使用,当连接请求的时候,SYN=1,ACK=0;连接被响应的时候,SYN=1,ACK=1

FIN: 表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开

三次握手对话的简单过程

第一次对话:主机A向主机B发起连接请求,“我想给你发数据,可以吗?”

第二次对话:主机B向主机A回复同意连接并要求同步,“可以,你什么时候发?”

第三次对话:确认主机B的同步要求,链接成立,“我现在就发,你接着吧!”

三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据

四次挥手对话的简单过程:

第一次对话:主机A向主机B发起断开请求,“我想断开连接,可以吗?”

第二次对话:主机B向主机A回复已接收到断开请求,“可以,但是等我先把数据接受完”

第三次对话:主机B向主机A发起断开请求,“我接受完了,断开连接吧!”

第四次对话:确认主机B的断开要求,再等待2MSL后没有收到主机B回复,开始断开链接,“好的,我等你正常断开了,我就断开”

为什么握手是三次,挥手却要四次?

TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的

SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文

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

TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"挥手"传输的,所以会多一次对话

为何建立连接时一起传输,释放连接时却要分开传输?

建立连接时,被动方服务器端进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接

释放连接时,被动方服务器端突然收到主动方客户端发起的断开连接请求时并不能立即释放连接,因为还有必要的数据需要处理完成,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文

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

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

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

当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器

(MSL指的是一段TCP报文在传输过程中的最大生命周期,2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长)

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

如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文

客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时

如果客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”

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

为什么要三次握手?不能是两次?

为了防止已失效的连接请求报文段突然又传送到了服务端,服务端一直等待而浪费资源

“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server

本来这是一个早已失效的报文段,但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求,于是就向client发出确认报文段,同意建立连接

假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了

由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据

但server却以为新的运输连接已经建立,并一直等待client发来数据,这样server的很多资源就白白浪费掉了

采用“三次握手”的办法可以防止上述现象发生

例如刚才那种情况,client不会向server的确认发出确认,server由于收不到确认,就知道client并没有要求建立连接

TCP (Transmission Control Protocol) 是一种基于连接的、可靠的传输层协议,它的通信过程包括三次握手建立连接和四次挥手关闭连接。 **三次握手(Three-way Handshake)**: 1. **SYN(同步序号)阶段**:客户端发送一个 SYN 包到服务器,请求建立连接,包中包含随机生成的初始序列号(seq)。 2. **ACK(确认应答)阶段**:服务器接收到 SYN 包后,回应一个 SYN+ACK 包,确认序列号(ack),并设置自己的初始序列号(seq)。 3. **FIN(结束连接)阶段**:当服务器准备好接收数据后,会发送一个 FIN 包给客户端,表明它已经不再需要进一步的数据了。此时连接还未完全关闭,客户端还会等待一段时间后再发送一个 ACK 包确认关闭。 **四次挥手(Four-way handshake)**: 1. **FIN(结束连接)阶段续**:客户端收到服务器的 FIN 包后,如果还有未发送的数据,则先发送一个 ACK 包确认,然后发送自己的 FIN 包,表示客户端也准备断开连接。 2. **ACK(确认应答)阶段续**:服务器收到客户端的 FIN 包后,回复一个 ACK 包确认,并进入半关闭状态。 3. **FIN(结束连接)阶段再续**:服务器等待一段时间后,如果没有新的数据传输,再发送一个 FIN 包给客户端,正式断开连接。 4. **ACK(确认应答)阶段终结**:客户端接收到服务器的 FIN 包后,发送最后一个 ACK 包,至此,整个连接才真正关闭。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monster_起飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值