三次握手四次挥手|计算机网络基础

118 阅读3分钟

TCP报文首部字段

序号(Sequence Number):用于标识从TCP源端向目的端发送的字节流,其值为当前报文段所发送数据的第一个字节的序号。

确认号((Acknowledgement Number):期望收到对方下一个报文段数据中的第一个字节的序号,即上次已成功收到的序号值+1。

标志位(Flags):即ACK、SYN、FIN等。含义分别如下:

ACK:确认比特。只有当 ACK=1时上述的确认号字段才有效。

SYN:同步比特。当SYN=1时,表示这是一个连接请求或接受报文

FIN:终止比特。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放当前连接。

TCP三次握手

第一次握手:客户端 => 服务端

SYN = 1,seq = x;客户端进入SYN_SEND状态

第二次握手:服务端 => 客户端

ACK = 1,seq = y,ack = x+1,SYN = 1;服务端进入SYN_RECV状态

第三次握手:客户端 => 服务端

ACK = 1,seq = x+1,ack = y+1; 客户端和服务端都进入ESTABLISHED状态

TCP四次挥手

第一次挥手:客户端 => 服务端

FIN = 1,seq = u;客户端进入FIN-WAIT-1状态

第二次挥手:服务端 => 客户端

ACK = 1,ack = u+1,seq = v;服务端进入CLOSE-WAIT状态客户端进入FIN_WAIT_2状态

第三次挥手:服务端 => 客户端

ACK = 1,ack = u+1,seq = w,FIN = 1;服务端进入LAST-ACK状态

第四次挥手:客户端 => 服务端

ACK = 1,ack = w+1,seq = u+1;服务端进入CLOSED状态客户端进入TIME-WAIT状态,等待2MSL后进入CLOSED状态

常见面试问题

  1. 为什么是握手要三次,两次可不可以?

三次握手的目的在于确认双方的收发能力正常,防止在网络较差的情况下因出现过期请求所造成的错误连接。

  1. 为什么是握手要三次,挥手却要四次?

三次握手时并没有数据传输,四次挥手时则需要确认双方没有数据在传输。在第二次挥手时,服务端发送ACK报文段确认客户端没有数据进行传输,但客户端不知道服务端是否有数据在传输。因此服务端第三次挥手时(多出的一步)需要告诉客户端没有数据在传输。

  1. 什么是SYN攻击?如何防御?

SYN攻击属于DOS攻击的一种,它基于伪造的IP地址向服务器发送大量的半连接请求,进而耗费服务器的CPU和内存资源。

半连接请求:服务器收到SYN请求后会将其放入一个半连接队列。队列中的请求也称为"半连接请求"。

防御SYN攻击的一些措施:过滤网关防护、SYN Cookie技术。

  1. 四次挥手后等待2MSL的作用?
  • 保证客户端发送的最后一个ACK报文端能够到达服务端。
  • 处理延迟的重复报文,经过2MSL后的所有报文段都会在网络中消失。