TCP的三次握手
传输控制协议TCP简介:
1.面向连接的、可靠的、基于字节流的传输层通信协议
2.将应用层的数据流分割成报文段并发送给目标节点的TCP层
3.数据包都有序号,对方收到则发送ACK确认(即是确认字符),未收到则重传
4.使用奇偶校验和函数检验数据在传输过程中是否有误
注意:TCP和UDP数据包都是不包含IP地址信息的,但是均有source port和destination(目的)port。IP地址可以唯一标示一个主机,TCP协议和端口号可以唯一表示主机中的一个进程。
TCP Flags
1.URG:紧急指针标志,为1时表示紧急指针有效
2.ACK:确认序号标志,为1时表示确认序号有效
3.PSH:push标志,为1表示带有push标志的数据,指示接收方在接收到该报文段以后应尽快将报文段交给应用程序,而不是在缓冲区排队
4.RST:重置连接标志,重置由于主机崩溃或其它原因的错误连接,或用于拒绝非法报文段
5.SYN:同步序号,用于建立连接过程
6.FIN:finish标志,用于释放连接,为1表示发送方已经没有数据发送了,关闭本方数据流
关于TCP的三次握手
握手是为了建立连接,流程图如下:
第一次握手:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认
第二次握手:服务器收到SYN包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:客户端收到服务器端的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED( established/建立)状态,完成三次握手
为什么要三次握手才能建立连接?
为了初始化Sequence(序列) Number的初始值(TCP会用这个序号来拼接数据)
首次握手隐患(SYN超时)
问题分析:服务器端收到客户端的SYN,回复SYN-ACK的时候未收到ACK确认,服务器端不断重试直至超时,Linux默认等待63秒后断开连接
恶意服务器可能会发送SYN后下线,针对SYN Flood的防护措施如下
1.SYN队列满后,通过tcp_syncookies参数回发SYN cookie
2.若为正常连接则Client会回发SYN Cookie,直至建立连接
建立连接后,Client出现故障怎么办?
保活机制:向对方发送报货探测报文,如果未收到则继续发送,尝试次数达到保活探测数仍未收到响应则断开连接