通俗理解TCP三次握手、四次挥手

三次握手

在这里插入图片描述改成这样更容易记忆:
1.SYN=1,seq=x;
2.SYN=1,seq=y,ACK=1,ack=x+1;(SYN=1,seq=y,先完成自己的连接功能,ACK=1,ack=x+1;然后完成自己的确认功能)
3.seq=x+1,ACK=1,ack+y+1;
首先我们先来看看这些控制信息所代表的含义:
SYN:比特设置为1,可以认为它表示连接,如果初始值是随机的,那么对方就搞不清楚序号到底是从多少开始计算的,因此需要在开始收发数据之前将初始值告知通信对象。大家应该还记得在我们刚才讲过的连接过程中,有一个将SYN控制位设为1并发送给服务器的操作,就是在这一步将序号的初始值告知对方的。实际上,在将SYN设为1的同时,还需要同时设置序号字段的值,而这里的值就代表序号的初始值“。
seq:如果我们在进行http请求时,由于数据量过大,一个网络包装不下,我们需要对数据进行拆分,TCP模块在拆分数据时,会先算好每一块数据相当于从头开始的第几个字节,接下来在发送这一块数据时,将算好的字节数写在TCP头部中,这就是seq(可见下图)
ACK:设置为1时,ack才有效
ack:假设上次接收到第1460字节,那么接下来如果收到序号为1461的包,说明中间没有遗漏;但如果收到的包序号为2921,那就说明中间有包遗漏了。像这样,如果确认没有遗漏,接收方会将到目前为止接收到的数据长
返回ack号时,除了要设置ack号的值以外,还需要将控制位中的ACK比特设为1,这代表ACK号字段有效,接收方也就可以知道这个网络包是用来告知ACK号的。

:我们在前面讲连接操作的时候说过SYN为1表示进行连接,这是因为将SYN设为1并告知初始序号这一操作仅在连接过程中出现,因此发送SYN为1的网络包就表示发起连接的意思。实际上,SYN是Synchronize(同步)的缩写,意思是通过告知初始序号使通信双方保持步调一致,以便完成后续的数据收发检查,这才是SYN原本的含义。

TCP数据收发是双向的,在客户端向服务器发送数据的同时,服务器也会向客户端发送数据,因此必须要想办法应对这样的情况。

TCP采用这样的方式确认对方是否收到了数据,在得到对方确认之前,发送过的包都会保存在发送缓冲区中。如果对方没有返回某些包对应的ACK号,那么就重新发送这些包。

在这里插入图片描述

四次挥手

在这里插入图片描述
首先我们先来看看这些控制信息所代表的含义:
FIN:服务器的协议栈会生成包含断开信息的TCP头部,具体来说就是将控制位中的FIN比特设为1
其它的已在三次握手里讲到
第二次挥手:服务器端收到连接释放报文段之后,发出确认报文,其首部:ack=u+1,seq=v。此时本次连接就进入了半关闭状态,客户端不再向服务器发送数据。而服务器端仍会继续发送,所以在第三次挥手时,服务器的seq=w,而不是seq=v+1.
第三次挥手:若服务器已经没有要向客户端发送的数据,其应用进程就通知服务器释放TCP连接。这个阶段服务器所发出的最后一个报文的首部应为:FIN=1,ACK=1,seq=w,ack=u+1。

:以 Web为例,浏览器向Web服务器发送请求消息,Web服务器再返回响应消息,这时收发数据的过程就全部结束了,服务器一方会发起断开过程”。当然,可能也有一些程序是客户端发送完数据就结束了,不用等服务器响应,这时客户端会先发起断开过程。这—判断是应用程序作出的,协议栈在设计上允许任何一方先发起断开过程。

为什么要过一段时间再删除套接字:
和服务器的通信结束之后,用来通信的套接字也就不会再使用了,这时我们就可以删除这个套接字了。不过,套接字并不会立即被删除.而是会等待一段时间之后再被删除。
等待这段时间是为了防止误操作,引发误操作的原因有很多、这里无法全部列举,下面来举一个最容易理解的例子。假设客户端先发起断开,则断开的操作顺序如下。
(1)客户端发送FIN
(2)服务器返回ACK号
(3)服务器发送 FIN
(4)客户端返回ACK号
如果最后客户端返回的ACK号丢失了,结果会如何呢?这时,服务器没有接收到ACK号,可能会重发一次FIN。如果这时客户端的套接字已经删除了,会发生什么事呢?套接字被删除,那么套接字中保存的控制信息也就跟着消失了,套接字对应的端口号就会被释放出来。这时,如果别的应用程序要创建套接字,新套接字碰巧又被分配了同一个端口号°,而服务器重发的FIN 正好到达,会怎么样呢?本来这个FIN是要发给刚刚删除的那个套接字的,但新套接字具有相同的端口号,于是这个FIN就会错误地跑到新套接字里面,新套接字就开始执行断开操作了。之所以不马上删除套接字,就是为了防止这样的误操作。
至于具体等待多长时间,这和包重传的操作方式有关。网络包丢失之后会进行重传,这个操作通常要持续几分钟。如果重传了几分钟之后依然无效.则停止重传。在这段时间内,网络中可能存在重传的包,也就有可能发生前面讲到的这种误操作,因此需要等待到重传完全结束。协议中对于这个等待时间没有明确的规定,一般来说会等待几分钟之后再删除套接字。

参考文献:
简述TCP连接的建立与释放(三次握手、四次挥手)
网络是怎样连接的-户根勤著

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值