当前位置:   article > 正文

TCP的连接和断开_tcp连接和断开的序列号有关系吗

tcp连接和断开的序列号有关系吗

一、TCP的连接

1.TCP建立连接的过程?

答:
在这里插入图片描述

第一次握手:客户端向服务端发送SYN请求报文,表示希望向服务端发起连接进行数据同步。

	SYN报文中,客户端会随机生成一个序列号client_isn,SYN标志位为1
  • 1

第二次握手:服务端向客户端发送ACK+SYN报文,表示收到客户端的连接请求,“客—>服”正常。

	ACK+SYN报文中,服务端通过确认应答号client_isn+1,表示收到客户端的连接请求。
	服务端也会生成一个序列号server_isn发送给客户端。
  • 1
  • 2

第三次握手:客户端向服务端发送ACK确认报文,表示收到服务端消息,“服—>客”正常。

	客户端向服务端发送ACK确认报文后,客户端进入ESTABLISHED 状态。
	若服务器收到客户端的ACK应答报⽂后,也进⼊ ESTABLISHED 状态。
  • 1
  • 2

双方都处于ESTABLISHED 状态,连接完成,可以相互通信。
注:第三次握⼿是可以携带数据的,前两次握⼿是不可以携带数据的

2.为什么不是两次握手?

答:
根本原因是无法验证服务端到客户端的正常通信

TCP是全双工通信,两次握手只能保证客户端到服务端这个单向链路是正常的,不能保证服务端到客户端这个链路正常。
因为没有第三次握手,服务端不知道客户端有没有收到自己的消息,所以如果此时服务端就开始发数据传输给客户端,客户端可能压根就收不到。

还有个问题是,由于服务端不知道客户端是否收到自己消息,对于客户端因网络阻塞而重复发送的多个SYN请求报文,只能来一个,就建立一个连接,导致建立多余的无效连接。

有了第三次握手,客户端在收到服务的SYN+ACK报文后,可以判断此次连接是否是历史连接,即是否过期,如果过期,客户端可以通过第三次握手发送RST报文给服务端,表示终止这一次连接。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.为什么不是四次握手?

答:
在这里插入图片描述

1.客户端发送 syn0 给服务器
2.服务器收到 syn0,回复 ack(syn0+1)
3.服务器发送 syn1
4.客户端收到 syn1,回复 ack(syn1+1)
  • 1
  • 2
  • 3
  • 4

因为 tcp 是全双工的,上边的四部确认了数据在两个方向上都是可以正确到达的,但是 2,3 步没有没有上下的联系,可以将其合并,加快握手效率,所有就变成了 3 步握手。

4.为什么是三次握手?

答:
三次握⼿才可以阻⽌历史连接(主要原因),确保当前连接是最新的。
三次握⼿才可以同步双⽅的初始序列号,确保双向都能正常通信。
三次握⼿才可以避免资源浪费,避免二次握手的多次建立连接,加快四次握手的效率。

二、TCP的断开

1.TCP断开连接的过程?

答:
在这里插入图片描述

第一次挥手:客户端打算关闭连接,发送FIN报文
第二次挥手:服务端收到客户端断开连接请求,发送ACK应答报文。
第三次挥手:服务端处理完剩余数据,发送FIN报文。
第四次挥手:客户端收到了剩余数据,发送ACK应答报文。断开结束。

2.为什么是四次挥手?

答:
关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。

服务器收到客户端的 FIN 报⽂时,先回⼀个 ACK 应答报⽂,表示收到断开请求。
⽽服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报⽂给客户端来表示同意关闭连接。

客户端最后还有回一个ACK报文给服务端,是让服务端知道客户端确实关闭了,那么现在服务端也可以正式关闭了。

3.为什么不是三次挥手?

答:
是否可以将服务端发送ACK和FIN合并?不能,因为剩余数据可能需要很长时间传输,如果一直不给客户端发送ACK确认报文,导致客户端一直重发。
客户端最后一个ACK确认报文是否可以不要?不能,因为服务端不知道客户端是否关闭了。

4.为什么 TIME_WAIT 等待的时间是 2MSL?

答:

MSL 是 Maximum Segment Lifetime,报⽂最⼤⽣存时间,它是任何报⽂在⽹络上存在的最⻓时间,超过这个时间报⽂将被丢弃。

2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。
如果在 TIME-WAIT 时间内,因为客户端发送的 ACK没有传输到服务端,客户端⼜接收到了服务端重发的 FIN 报⽂,那么 2MSL 时间将重新计时。
  • 1
  • 2
  • 3
  • 4

因此2MSL可以保证服务端没有收到ACK应答报文,还能将超时重传的FIN报文再发送给客户端。
如果客户端2MSL内还未收到超时重传的FIN报文,表明双方已经成功关闭连接。

还有一个作用是若TIME_WAIT 等待的时间过短,可能导致本次连接已经关闭,但是发送方仍然有数据没有到达接收端。更严重的是,如果此时已经建立具有相同四元组的连接,旧连接的数据包很可能进入新连接传输,导致数据错乱。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/158637
推荐阅读
相关标签
  

闽ICP备14008679号