TCP协议详解--三握四挥
Posted 前端大联盟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP协议详解--三握四挥相关的知识,希望对你有一定的参考价值。
茫茫人海中与你相遇
相信未来的你不会很差
来源:http://47.98.159.95/my_blog/nav/
UDP
相比,
TCP
有三大核心特性:
-
面向连接。所谓的连接,指的是客户端和服务器的连接,在双方互相通信之前,TCP 需要三次握手建立连接,而 UDP 没有相应建立连接的过程。 -
可靠性。TCP 花了非常多的功夫保证连接的可靠,这个可靠性体现在哪些方面呢?一个是有状态,另一个是可控制。
TCP 会精准记录哪些数据发送了,哪些数据被对方接收了,哪些没有被接收到,而且保证数据包按序到达,不允许半点差错。这是有状态。
当意识到丢包了或者网络环境不佳,TCP 会根据具体情况调整自己的行为,控制自己的发送速度或者重发。这是可控制。
相应的,UDP 就是
无状态
,不可控
的。
-
面向字节流。UDP 的数据传输是基于数据报的,这是因为仅仅只是继承了 IP 层的特性,而 TCP 为了维护状态,将一个个 IP 包变成了字节流。
002: 说说 TCP 三次握手的过程?为什么是三次而不是两次、四次?
恋爱模拟
爱
的能力。
爱
和
被爱
的能力。
被爱
的能力。
爱
和
被爱
的能力,两人开始一段甜蜜的爱情。
真实握手
发送的能力
和
接收的能力
。于是便会有下面的三次握手的过程:
CLOSED
状态。然后服务端开始监听某个端口,进入了
LISTEN
状态。
SYN-SENT
状态。
SYN
和
ACK
(对应客户端发来的SYN),自己变成了
SYN-REVD
。
ACK
给服务端,自己变成了
ESTABLISHED
状态;服务端收到
ACK
之后,也变成了
ESTABLISHED
状态。
凡是需要对端确认的,一定消耗TCP报文的序列号。
为什么不是两次?
为什么不是四次?
发送
和
接收
的能力,那四次握手可以嘛?
三次握手过程中可以携带数据么?
ESTABLISHED
状态,并且已经能够确认服务器的接收、发送能力正常,这个时候相对安全了,可以携带数据。同时打开会怎样?
SYN
报文,状态变化会是怎样的呢?
SYN
报文的同时,接收方也给发送方发
SYN
报文,两个人刚上了!
SYN
,两者的状态都变为
SYN-SENT
。
SYN
后,两者状态都变为
SYN-REVD
。
ACK + SYN
,这个报文在对方接收之后,两者状态一起变为
ESTABLISHED
。
过程拆解
ESTABLISHED
状态。
FIN
报文,在 TCP 报文中的位置如下图:
FIN-WAIT-1
状态。注意, 这时候客户端同时也变成了
half-close(半关闭)
状态,即无法向服务端发送报文,只能接收。
CLOSED-WAIT
状态。
FIN-WAIT2
状态。
FIN
,自己进入
LAST-ACK
状态,
FIN
后,自己变成了
TIME-WAIT
状态,然后发送 ACK 给服务端。
MSL
(
Maximum Segment Lifetime,报文最大生存时间
), 在这段时间内如果客户端没有收到服务端的重发请求,那么表示 ACK 成功到达,挥手结束,否则客户端重发 ACK。
等待2MSL的意义
-
1 个 MSL 确保四次挥手中主动关闭方最后的 ACK 报文最终能达到对端 -
1 个 MSL 确保对端没有收到 ACK 重传的 FIN 报文可以到达
为什么是四次挥手而不是三次?
FIN
, 往往不会立即返回
FIN
, 必须等到服务端所有的报文都发送完毕了,才能发
FIN
。因此先发一个
ACK
表示已经收到客户端的
FIN
,延迟一段时间才发
FIN
。这就造成了四次挥手。
ACK
和
FIN
的发送合并为一次挥手,这个时候长时间的延迟可能会导致客户端误以为
FIN
没有到达客户端,从而让客户端不断的重发
FIN
。
同时关闭会怎样?
如果客户端和服务端同时发送 FIN ,状态会如何变化?如图所示:
我们在虚拟的空间与你相遇,期待可以碰撞出不一样的火花
以上是关于TCP协议详解--三握四挥的主要内容,如果未能解决你的问题,请参考以下文章
网络协议万文长篇,带你深入理解 TCP;场景复现,掌握鲜为人知的细节(上)