tcp三次握手流程:
首先客户端会主动打开对话链接 ,向服务器开始请求服务器被动打开对话链接:
第一次握手:客户端发出请求SYN包,并且将自己的起始序号发出(seq=x),进入SYN_SEND状态等待回应。
第二次握手:服务端收到SYN包,挺尸自己回复一个SYN,即ACK+SYN,而且与此同时将自己的起始序号发出(seq=y),并且回复客户端的(ack=x+1)表示收到起始序号(因为第一次握手会消耗一个序号,所以+1),此时进入SYN_RECV状态
第三次握手:客户端收到服务器端的ACK+SYN,然后返回确认包ACK,ack=y+1,seq=x+1,表示自己已经确认起始序号,进入ESTAB_LISHED状态,连接建立
为什么需要三次握手才能建立连接?
主要是因为需要确认双方的Sequence Number
就是使客户端和服务器端的双方的起始序号得以确定,这样才保证传输的安全性和稳定性。
首次握手隐患–SYN超时
产生原因:在客户端给服务器端发送SYN后下线,导致服务器端回应ACK+SYN之后得不到回应,服务器端会不断尝试(一般是五次尝试每次间隔翻倍:1s+2s+4s+8s+16s+32s)在63s后tcp断开连接,所以可能会导致SYN队列满,使得不能正常建立连接。
解决办法:在tcp中加入SYN Flood保护措施,就是当SYN队列满时,如果连接可以正常开始,那么就返回SYN Cookie,直接建立连接,那么就避免了SYN超时所导致的SYN队列满的问题。
在连接建立后客户端出现故障怎么办?
tcp有一种保活机制,就是服务器会向客户端发送保活探测报文,如果未收到响应,则会继续发送,服务器自身确定一个保活响应时间,在这个时间间隔内会不断发送保活探测报文,如果一直未收到响应则中断连接。