创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
更多计算机网络知识专栏:计算机网络🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
一、建立TCP连接——三次握手
- 1.客户端和服务端都处于
CLOSE
状态 - 2.服务端监听状态
LISTEN
- 3.客户端发起连接,发送一个随机数起始的
seq
SYN置为1
,然后客户端处于SYN_SEND
状态 - 4.服务端收到seq包后,向客户端发送服务端初始的
seq
包,ack
为客户端的seq+1
,ACK置为1
,然后服务端处于SYN_RCVD
状态 - 5.客户端收到服务端的seq包后,向服务端发送
seq
为客户端初始seq+1
,ack
为服务端seq+1
的包,然后处于ESTABILSHED
状态,服务端收到这个ack
包后也处于ESTABLISHED
状态,可以开始收发数据
为什么不是两次握手或四次握手
- 两次握手:服务端未接收到客户端的ACK就建立连接:
在两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,导致服务端可能建立一个历史连接,造成资源浪费
服务端需要接收到发送端ACK的ACK才能建立连接,也确保了客户端拥有接收的能力
- 四次握手:
服务端在发送ACK包的同时也可以发送SYN包,三次握⼿就已经理论上最少可靠连接建⽴,所以不需要使⽤更多的通信次数。
二、TCP连接断开——四次挥手
- 1.客户端和服务端发送接收数据,都处于
ESTABLISHED
状态,其中一方发起关闭连接请求,称为主动方,另一方为被动方 - 2.主动方向被动方发出
seq
为上一个数据包中ack
,ack
为上一数据包seq+1
,FIN置为1
的报文,代表想要关闭连接,之后主动方处于FIN_WAIT_1
状态 - 3.被动方收到这个FIN报文后,向主动方发送一个
seq
为这个FIN报文中ack
,ack为这个FIN报文中seq+1
,FIN为1
的报文,然后被动方处于CLOSE_WAIT
状态 - 4.当主动方收到这个报文后,主动方处于
FIN_WAIT_2
状态 - 5.等待被动方处理完数据,向主动方发送
seq
为上一seq+1
,ack
为最初主动方发出的FIN报文中seq+1
,FIN置为1
的报文,然后被动方处于LAST_ACK
状态,等待接收最后一个ACK - 6.当主动方收到报文后,向被动方发送
seq
为上一ack
,ack为上一seq+1
,然后主动方处于TIME_WAIT
状态 - 7.当被动方收到这个报文后,被动方**不会再发送包,处
于CLOSE
状态,代表已经关闭连接 - 8.在主动方超过
2MSL
时间后,置为CLOSE
状态,自动关闭连接
为什么挥手需要四次?
- 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据
- 服务端收到客户端的
FIN
报文时,先回一个ACK
应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接
从上⾯过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN ⼀般都会分开发送,从⽽⽐三次握⼿导致多了⼀次。
2MSL时间
MSL(Maximum Segment Lifetime)是报⽂最⼤⽣存时间,它是任何报⽂在⽹络上存在的最⻓时间,超过这个时间报⽂将被丢弃
2MSL 的时间是从主动方接收到 FIN 后发送 ACK 开始计时,一来一回需要等待 2 倍的时间即2MSL
如果在 TIME-WAIT
时间内,主动方的最后一个ACK没有传输到被动方,被动方没有收到ACK应答,就会重发FIN 报⽂,那么 2MSL 时间将重新计时
** **
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |