OSI网络七层模型:

  1. 物理层
  2. 数据链路
  3. 网络层
  4. 传输层
  5. 会话层
  6. 表示层
  7. 应用层

三次握手:

image.png

目标:

  1. 请画出三次握手和四次挥手的示意图
  2. 为什么连接的时候是三次握手?
  3. 什么是半连接队列?
  4. ISN(Initial Sequence Number)是固定的吗?
  5. 三次握手过程中可以携带数据吗?
  6. 如果第三次握手丢失了,客户端服务端会如何处理?
  7. SYN攻击是什么?
  8. 挥手为什么需要四次?
  9. 四次挥手释放连接时,等待2MSL的意义?

原文连接:https://blog.csdn.net/hyg0811/article/details/102366854

三次握手:

三次握手是确保双方的接受能力和发送能力是正常的

  1. 在建立三次连接时,客户端处于close,服务端处于listen状态,这时客户端发送一个SYN数据包,并指明客户端的初始化序列号。然后此时客户端的状态变为syn_sent,这证明了客户端的发送能力是正常的。服务端收到客户端的SYN报文后,会以自己的SYN报文作为应答,并且也会初始化一个ISN序列号,并且会把客户端发送的SYN序列号+1作为自己的ACK的值传回给客户端。这时服务端的状态变为SYN_REC并且会把次连接放入自己的半连接队列。在客户端收到服务端的报文后,确定了服务端的接受和发送能力是正常的。客户端的状态变为established,并且会将服务端的SYN值加1以ACK报文发送给服务端。服务端的状态变为established,并且将客户端放入自己的全连接队列。这时服务端也知道客户端的接受能力是正常的。这样就建立了TCP连接。

注意事项:
当服务端发送了ACK+SYN包时未收到客户端的ACK包则它会重传。在超过了系统规定的重传次数后,就会将它从半连接队列中删除。

四次挥手:

四次挥手才能结束连接、这是是由于TCP的半关闭造成的,所谓的半关闭,就是TCP提供了连接的一端在结束它的发送后还能接受到另一端数据的能力。当服务端收到客户端的FIN报文后,会先回复一个你的FIN报文我收到了,但是此时服务端可能还有数据没有发完,所以不会直接断开连接,当服务端将数据传完后再发送报文去关闭连接。

  1. 第一次挥手,客户端会发送一个FIN报文,并且会指定一个序列号,此时客户端处于,FIN_WAIT1状态。第二次挥手,服务端收到报文后,会发送ACK报文,值为序列号+1,并且会发送自己的seq值。表明已经收到了客户端的信息。此时服务端处于close_wait状态。第三次挥手。等服务端确定自己没有要传的数据的时候,发送一个FIN报文并且指定一个seq,且回复ACK=客户端的seq+1此时客户端处于Last_ack状态。第四次挥手,客户端在收到服务端的ACK报文后,会发送一个ACK报文,值为w+1和seq序列号值为服务端发送的ACK的值。并且处于TIME_WAIT状态。等待2MSL后才将状态变为Close。

MSL:报文最大生存时间。
为什么会等待2MSL:
为了保证客户端的最后一个ACK报文能到服务端。确保服务端的正常关闭。倘若没有这个2MSL等待时间,客户端直接关闭的话。但是服务端不知道一直没有收到客户端的ACK报文。就会导致服务端的连接一直不能关闭,这个2MSL是客户端ACK到达服务端的时间+服务端的报文再次返回的时间。
image.png
https://yuanrengu.blog.csdn.net/article/details/102366854?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2.pc_relevant_default&utm_relevant_index=5

需要看的:https://zhuanlan.zhihu.com/p/320088736