TCP简介:
1、面向连接的、可靠的、基于字节流的传输层的通信协议;
2、将应用层的数据流分割成报文段并发送给目标节点的TCP层;
3、数据包都有序号,对方收到则发送ACK确认,未收到则重传;
4、使用校验和来检验数据在传输过程中是否有误;
TCP标志位(Flags):
1、URG:紧急指针标志;
2、ACK:确认序号标志;
3、PSH:push标志;
4、RST:重置连接标志;
5、SYN:同步序号,用于建立连接过程;
6、FIN:finish标志,用于释放连接;
TCP三次握手过程:
1、建立连接时,客户端发送SYN包到服务器,并进入SYN_SEND状态,等待服务器确认;
2、服务器收到SYN包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态;
3、客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入established状态,完成三次握手;
首次握手的隐患------SYN超时问题
问题起因和分析:
1、服务器收到客户端的SYN,回复SYN和ACK的时候未收到ACK确认
2、服务器不断重试直至超时,Linux默认等待63秒才断开连接;(重复5次【不包括第一次】,从1秒开始,每次重试都翻倍:1+2+4+8+16+32=63秒)
针对SYN Flood的防护措施:
1、SYN队列满后,通过tcp_syncookies参数会发SYN cookie【源端口+目标端口+时间戳组成】;
2、若为正常连接则Client会回发SYN Cookie,直接建立连接;
建立连接后,Client出现故障怎么办:
保活机制:
1、向对方发送保活探测报文,如果未收到相应则继续发送;
2、尝试次数达到保活探测数仍未收到相应则中断连接;