TCP三次握手的目的是为了让客户端与服务器建立连接,且TCP是全双工的。通俗解释为:为了确保A、B之间能够建立相互通信的通道,1、客户端A先向服务器B发送消息说“我想建立连接”;2、服务器B收到A发送的连接请求,并回复信息说“我收到了你发过来的请求,我给你发个消息,你看看能不能接收到”;3、客户端A收到了消息需要在向B发送一个确认消息“我能收到你发的消息”。之后就建立了连接的过程,双方可以进行通信了。
TCP Flags中最重要的主要是:ACK:确认序列号以及SYN:同步序号,用于建立连接过程。
以上三步用TCP标志表示为:
1、A发送:SYN=1,seq=x;客户端进入SYN _SEND状态
2、B发送:SYN=1,ACK = 1;seq=y(服务器的序列号开头),ack = x+1(是因为1中消耗了一个序列号);服务器进入SYN_RECV状态
3,A发送:ACK =1,seq=x+1(确认A的序列号头+1),ack=y+1(同上);发送完客户端就进入了ESTABLELISHED状态,服务器收到第三次确认信息后在进入ESTABLELISHED状态。
在第一和第二步是不带信息的,第三步可以带也可以不带
三次握手的主要目的就是建立连接以及确定双方的序列号,保证数据不会乱序。
TCP三次握手的隐患:
首次握手的隐患:SYN超时。
起因:B在发送2后未收到A发送的3,一直处于SYN_RECV状态;此时服务器会不断重试直至超时,Linux默认等待63秒(1+2+4+8+16+32)才会断开连接。
SYN超时容易导致服务器收到SYN Flood攻击,即一个恶意程序发完SYN后就下线了,服务器需要等待63秒,正常的SYN接受队列不足
解决方法:SYN队列满了后,回发SYN Cookie参数,若为正常连接会回发SYNCookie,直至建立连接。