Alamofire前奏之TCP三次握手四次挥手

2019-08-16  本文已影响0人  lb_

TCP是什么, 有什么特征

TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有下列特点的通信方式.

为满足TCP协议的这些特点,TCP协议做了如下规定:

① 数据分片
② 到达确认
③ 超时重发
④ 滑动窗口
⑤ 失序处理
⑥ 重复处理
⑦ 数据校验

为了判定当前处于什么状态. TCP有了种标识:SYN(建立联机)、ACK(确认)、PSH(传送)、FIN(结束)、RST(重置)、URG(紧急)

TCP建立连接 (三次握手)

TCP使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接.

TCP三次握手的过程如下:

  1. 客户端发送 SYN(SEQ=x)报文给服务器端,进入 SYN_SEND 状态。

  2. 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入 SYN_RECV 状态。

  3. 客户端收到服务器端的 SYN 报文,回应一个
    ACK(ACK=y+1)报文,进入 Established 状态。

三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。


图片引用自csdn-青柚_

简单总结就是:
客户端发送包,说我要建立连接,等待服务端回复. 服务端接受到, 回答然后等待客户端回复. 客户端收到回复,回答. 服务端接收到. 两端都确认对方可以收到. 开始传输数据

TCP断开连接 (四次挥手)

终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。具体过程如下:

1️⃣客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为 seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入 FIN-WAIT-1(终止等待1)状态。
TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

2️⃣ 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号 seq=v ,此时,服务端就进入了 CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个 CLOSE-WAIT 状态持续的时间。

客户端收到服务器的确认请求后,此时,客户端就进入 FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

3️⃣服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为 seq=w,此时,服务器就进入了 LAST-ACK(最后确认)状态,等待客户端的确认。

4️⃣客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是 seq=u+1,此时,客户端就进入了 TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入 CLOSED 状态。

服务器只要收到了客户端发出的确认,立即进入 CLOSED 状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

图片引用自csdn-青柚_

简单总结:
听起来很复杂,其实就是需要一个相互确认的过程. 客户端发送终止请求, 服务端接受后返回一个收到, 但是继续传输数据,直到传输完成,再次发送一个完毕终止. 客户端收到回复可以终止.然后进入等待 ,服务端收到终止请求立即关闭. 经过2∗∗MSL(最长报文段寿命)的时间后, 客户端没有在收到回应,关闭.

常见面试题

读到这里这个问题就可以自由回答了, 没什么难度.
简单来说就是当连接建立完成了,在传输数据时想要终止,必须有一步,等待. 等待数据传输完成再关闭.

因为每次传输数据并不一定是100%送达的.
所以 TIME_WAIT 状态就是用来重发可能丢失的ACK报文. Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。
如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

  • 两次:
    两次连接并不能让双方都确定对方是可接受数据状态.
  • 四次:
    明明已经保证了一个稳定的传输流了,为什么还要浪费性能再去发一次消息,浪费了性能

TCP还设有一个保活计时器,俗称心跳. 服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

上一篇 下一篇

猜你喜欢

热点阅读