传输层:TCP连接的三次握手与四次挥手

(一)三次握手

在这里插入图片描述
在这里插入图片描述

  1. 客户端TCP向服务器端TCP发送一个特殊的TCP报文段(称为SYN报文段),该报文段中没有应用层数据,报文段首部的SYN标志位置1,ACK标志位为0,客户端会随机选择一个序列号client_isn(x)存入SYN报文段的序列号字段中。报文段被封装在一个IP数据报中发给服务器。
  2. 服务器接受到IP数据报,提取SYN报文段,为该TCP连接分配TCP缓存和变量,并向该客户发送允许连接的报文段(称为SYNACK报文段),这个报文段没有应用层数据,报文段首部的SYN标志位置1,ACK标志位置1,最后服务器选择了自己的序列号server_isn(y)存入SYNACK报文段的序列号字段中。报文段被封装在一个IP数据报中发给客户机。
  3. 在收到SYNACK报文段后,客户机也要给该TCP连接分配变量和缓存。客户机向服务器发送另一个报文段,该报文段对服务器的允许连接进行了确认(将server_isn+1放入报文段首部的ack字段中),序列号从client_isn开始。该报文段可以包含应用层数据,同时报文段首部的SYN标志位置0,ACK标志位置1. TCP连接建立完成。

为什么需要初始序列号:

避免SYN洪泛攻击。

为什么需要三次握手(两次确认)而不是两次握手(一次确认)?

为了防止客户机已失效的报文段突然又传送到了服务器。因为如果是两次握手,A第一次发出的报文段1在网络节点长时间滞留,A以为连接请求报文丢失,于是重发连接请求报文段2,结果报文段2先到达服务器,这时候客户机和服务器之间建立连接。当A和B中断连接后这时候报文段1到达服务器,两者建立连接,服务器一直等待客户机发送数据,服务器的资源就会被浪费。
而当三次握手时就不会发生上述情况。在报文段1到达服务器后,因为后面服务器没有收到客户机的连接确认,服务器就会知道客户机并没有要求建立连接。

(二)四次挥手

在这里插入图片描述

  1. 客户机向服务器发送关闭连接命令(注意:服务器也能选择主动关闭连接),即客户机向服务器发送一个特殊报文段,报文段中的FIN标志位置1
  2. 服务器收到报文段后,向客户机发送一个确认报文段,即报文段首部的ACK标志位置1,开始准备关闭服务器,在这个时间段仍然能够进行数据传输。准备完成后向客户机发送另外一个报文段,报文段首部的FIN标志位置1,ACK标志位置1
  3. 客户机收到ACK为1FIN为0的报文段后进入FIN-WAIT2状态,收到ACK和FIN均为1的报文段向服务器发送确认报文段,即报文段首部ACK标志位为1,同时进入TIME-WAIT阶段,等待2∗MSL(最长报文段寿命)后关闭。
  4. 服务器收到客户机的确认报文段后关闭。

为什么是四次挥手?

因为TCP连接有个半关闭状态,当客户机发送关闭连接请求后,服务器收到后发送确认报文段,这个时候客户机不再发送数据。但是,如果服务器发送数据,客户机仍要接收,这个阶段仍然是数据能够进行传输的阶段。当数据传输完成后服务器向客户机发送关闭连接的请求,客户机发送确认报文段。所以是四次。

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

  1. 确保客户机最后一次发送的ACK报文段能够顺利到达服务器。假设ACK报文段在网络中丢失,由于服务器未收到ACK报文段,则会重发FIN报文段,客户机就能在2MSL的时间段重新收到来自服务器的FIN报文段并且重新发送ACK报文段,同时重启2MSL计时器。
  2. 防止三次握手中“已经失效的连接请求报文段”出现在本连接中,客户机发送完最后一个报文段后,在2MSL时间段中,就可以使本连接持续时间内所产生的所有报文段从网络中消失,避免在下次连接中出现旧连接的请求报文。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

参考

哈工大国家精品课程《计算机网络》
https://blog.csdn.net/qzcsu/article/details/72861891#t5
《计算机网络:自顶向下方法》

猜你喜欢

转载自blog.csdn.net/shenxinmou1661/article/details/88290189