iOS基础与进阶

TCP三次握手和四次挥手

2019-04-11  本文已影响2人  Mr丶Summer

TCP数据段解析

报文在TCP连接中传输,会被分割成多个TCP段,使用IP分组承载,从一个IP地址传输到另外一个IP地址。
IP分组主要组成:

这要主要对TCP首部说明一下

如下图所示:

image.png

其中关于TCP连接的建立和断开,主要需要理解SYN,ACK,FIN,seq,ack

TCP建立连接的三次握手

示意图如下:

image.png

最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。

为什么客户端最后还要发送一次确认?

主要是完成两个功能:

  1. 双方都确认已经做好了发送数据的准备工作。
  2. 允许双方就初始序列号进行协商,在握手过程中被发送和确认。

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。
如果是采用三次握手的话,那一次失效的请求在到达服务端之后,服务端返回了确认报文,但是客户端没有再次发出 确认。服务器接收不到确认,那么就知道服务端并没有请求连接。

TCP断开连接的四次挥手

示意图如下:

image.png

数据传输完毕之后,双方都可以主动断开连接。断开连接前,双方都处于ESTABLISHED状态。

为什么最后客户端最后需要等待2MSL?

MSL(Maximum Segment Lifetime),意为最大报文段生存时间,TCP允许不同的实现可以设置不同的MSL值。

因为在最后客户端发出确认后,报文传送到服务端需要时间,而且也可能丢失。
如果丢失的话,那么服务端在一定时间内没有收到客户端的确认回应,可能就判断客户端没有收到我的请求,会重新向客户端发送一次,此时客户端接收到之后,会重启2MSL计时器,然后再给服务端发送确认回应。

为什么连接只需要三次,但是断开需要四次?

因为在连接是,当服务端接收到客户端的连接请求之后,将SYN和ACK放在一个报文中发送给客户端。
而关闭连接是,服务端接受到客户端发送的FIN报文时,仅仅表示客户端不会在发送数据但是还能接收数据,而自己也未必将全部数据都发送给客户端了,所以首先发送一个ACK报文确认接收到客户端的断开请求,然后等待可能没有发送完的数据发送完毕之后,在发送FIN报文给客户端,表明自己也没有数据要发送了。因为FIN报文和ACK报文一般是分开发送,从而导致多了一步。

如果已经建立连接的情况下,但是客户端出现了故障怎么办?

TCP设有一个保活计时器。当客户端出现故障之后,服务端每收到一次客户端的请求就会重新复位计时器。通常为2个小时,如果没有接收到任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若连续发送了10次都没有反应,则认为客户端出现了问题,接着 服务器端关闭连接。

end

对于网络充满了好奇,慢慢的学习,慢慢的深入,发现越来越有趣!

上一篇 下一篇

猜你喜欢

热点阅读