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状态
常见面试问题
- 为什么是握手要三次,两次可不可以?
三次握手的目的在于确认双方的收发能力正常,防止在网络较差的情况下因出现过期请求所造成的错误连接。
- 为什么是握手要三次,挥手却要四次?
三次握手时并没有数据传输,四次挥手时则需要确认双方没有数据在传输。在第二次挥手时,服务端发送ACK报文段确认客户端没有数据进行传输,但客户端不知道服务端是否有数据在传输。因此服务端第三次挥手时(多出的一步)需要告诉客户端没有数据在传输。
- 什么是SYN攻击?如何防御?
SYN攻击属于DOS攻击的一种,它基于伪造的IP地址向服务器发送大量的半连接请求,进而耗费服务器的CPU和内存资源。
半连接请求:服务器收到SYN请求后会将其放入一个半连接队列。队列中的请求也称为"半连接请求"。
防御SYN攻击的一些措施:过滤网关防护、SYN Cookie技术。
- 四次挥手后等待2MSL的作用?
- 保证客户端发送的最后一个ACK报文端能够到达服务端。
- 处理延迟的重复报文,经过2MSL后的所有报文段都会在网络中消失。