TCP的三次握手
(1)客户端首先会发送 SYN报文
请求与服务端建立连接。( syn_sent
)
(2)服务端接收了客户端的 SYN报文
后,会同时发送 ACK+SYN报文
,确定与客户端建立连接。( syn_recv
、 established
)
(3)客户端接收了服务端的 ACK+SYN报文
后,回复给服务端一个 ACK报文
。( established
)
上面的三个步骤完成后,一个网络通信的连接就建立起来了。
握手完成:开始TCP数据传输
TCP重传机制
可能会存在客户端发给服务端的数据请求,并没有到达服务端的情况,或者存在服务端接收了客户端的请求,但是回复请求的数据,因为一些网络原因,并没有到达客户端。
此时,针对上述的情况,就需要重新传递请求数据,这就是 TCP的重传机制
。
既然会 重传
,那也会存在服务端接收了两次同样的请求,此时就需要 去重
。 重传
和 去重
的工作操作系统的网络内核模块都已经帮我们处理好了,用户层是不用关心的。TCP双工通信
因为tcp链接是 双工
的,所以同样也存在 服务端向客户端发起数据传输的操作。 客户端和服务端都可以主动发起数据传输。不过无论是哪方请求,都需要收到对方的确认后才能认为对方收到了自己的请求。批量ACK
客户端可能会在同一时间里,一连发送了多个请求,服务端此时并不需要每一个请求都做回复,可以直接对多个请求进行回复,这就是 批量ack
。TCP窗口大小
但是客户端也不能一次性请求传输太多的数据,服务端可能会短时间无法完成处理,所以客户端和服务端双方就需要协商好合适的发送和接收频率。这就是 TCP窗口大小
。
TCP的四次挥手
(1)客户端发送 FIN报文
包,尝试与服务端断开连接。
(2)服务端接收了 FIN报文
包,返回给客户端 ACK报文
包,代表已接收了客户端断开连接的请求。
(3)服务端在一段时间后,会发送 FIN报文
包,表示可以与客户端断开网络连接。
(4)客户端接收了 FIN报文
包后,同样会发送一个ACK报文包给服务端,服务端接收了该报文后,就可以关闭资源。客户端需等待 2MSL
(MSL:报文的最大生存时间)时间后,才会释放套接字资源。
TCP的半关闭状态
之所以是四次挥手,(2)(3)的动作没有合并的原因,是因为tcp存在 半关闭
的状态,也就是单向关闭。time_wait
状态和 **2MSL**
主动关闭的一方在回复对方的挥手后进入的一个长期状态 2MSL
,这个状态的标准持续时间是4分钟,4分钟后才会进入 closed
状态,释放套接字资源。
作用主要是重传最后一个ack报文,确保对方能够收到。如果对方没有收到 ack报文
的话,对方会重传 fin报文
,处于 time_wait状态
的套接字会立即向对方重发 ack报文
。
同时这段时间内,该网络链接在堆化期间由于网际路由产生的残留报文(因为网络缓慢等原因,数据报文传输时间太长,重传的报文都收到了,但是原始报文还在路上)传过来时,都会立即被丢弃掉。4分钟的时间足以使得这些残留的报文彻底消除。不然当新的端口被重复利用时,这些残留的报文可能会干扰新的链接。
MSL
: 最长报文寿命。
四次挥手也并不总是四次挥手,中间的两个动作有时候是可以合并一起进行的,这个时候就成了三次挥手。主动关闭防就会从 fin_wait_1
状态直接进入 time_wait
状态,跳过了 fin_wait_2
状态。