TCP三次握手四次挥手
重要字段
序号(Seq)
确认号(Ack)
- 32位,只有ACK标志位为1时,Ack序号才有效,确认方Ack=发起方Seq+1
标志位
- SYN:发起一个连接
- FIN:释放一个连接
- RST:重置连接
- ACK:确认序号有效
- PSH(了解):接收方应尽快将这个报文交给应用层
- URG(了解):紧急指针有效
三次握手
三次握手.jpeg客户端
- 状态:CLOSED-->SYN-SENT-->ESTAB-LISHED
服务端
- 状态:CLOSED-->LISTEN-->SYN-RCVD-->ESTAB-LISHED
抽象
- 男孩给女孩写了封信,告诉女孩喜欢她,然后等待女孩的回信
- 女孩收到男孩的情书,很开心,回了封信说喜欢他,交集的等待男孩回信
- 男孩收到女孩回信,异常兴奋,回信说我爱你.女孩收到信后,知道了彼此心意,欢乐交谈起来
为什么需要第三次握手
-
防止服务端开启无用连接增加服务器开销
- 服务端向客户端发起第二次握手过程中,数据包丢失,导致客户端未收到服务端消息.客户端设置超时时间,超过超时时间重新发起请求建立连接,而服务端不知道客户端是否收到第二次握手数据包,端口一直打开,长此以往,这样端口多了增加服务器开销
-
防止已失效连接请求报文段又传送到服务端产生错误
四次挥手
四次挥手.jpeg客户端
- 状态:ESTAB-LISHED-->FIN-WAIT-1-->FIN-WAIT-2-->TIME-WAIT-CLOSED
服务端
- 状态:ESTAB-LISHED-->CLOSE-WAIT-->LAST-ACK-->CLOSED
抽象
- 第一次:男孩给女孩写了一封分手信
- 第二次:女孩收到分手信后写了回信说给她时间把男孩东西收拾好还给他
- 第三次:过了几天,女孩收拾好男孩东西,给男孩写了封信让男孩拿走
- 第四次:男孩收到女孩信后给女孩回信这就拿回来
为什么握手三次,挥手却要四次
- 三次握手中第二次握手服务端由CLOSED状态进入握手不需要准备,可直接返回SYN和ACK报文
- 四次挥手中服务端突然收到客户端释放连接请求并不能立即释放连接,因为还有数据在处理,所以服务器先返回ACK,经过CLOSE-WAIT阶段准备好释放连接后,发起第三次握手返回FIN释放连接报文
为什么客户端在TIME-WAIT阶段要等2MSL
- MSL:一个TCP报文在传输过程中的最大生命周期,2MSL即服务端发出FIN报文和客户端发出ACK报文所保持有效的最大时长
- 服务端在1MSL内没收到客户端发出的ACK报文,就再次向客户端发出FIN报文
- 客户端在2MSL内再次收到服务端的FIN报文,说明服务端未收到客户端发出的ACK报文,客户端再次向服务端发出ACK报文,计时器重置,重新开发2MSL及时
- 客户端在2MSL内没有再次收到服务端FIN报文,说明服务端收到客户端ACK报文,客户端可以进入CLOSED阶段
TCP三次握手四次挥手.png
原文摘自: https://www.cnblogs.com/AhuntSun-blog/p/12028636.html
网友评论