ACK:acknowledge 确认序号标志
SYN:synchronize 同步序号,用于建立连接过程
FIN:finish标志,用于释放连接
seq:sequence 序列
establish:建立
什么是TCP的三次握手?
TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入LISTEN(监听)状态;
TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这时的报文首部中SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。
为什么需要三次?如果是两次呢?
第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。
客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是如果这个滞留的连接请求最后还是到了达服务器并且不进行三次握手的话,那么服务器就会打开两个连接。
如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。
如果是四次呢?
如果TCP的握手是四次:
–1.client给server发送SYN同步报文;
–2.server收到SYN后,给client回复ACK确认报文;
–3.server给client发送SYN同步报文;
–4.client给server发送ACK确认报文。
第2.3步之间,server和client没有任何的数据交互,分开发送相当于多发了一次TCP报文段,SYN和ACK标识只是TCP报头的一个标识位。很明显,这两步可以合并,从而提高连接的速度和效率。
如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器。服务器每收到一次客户端的请求后都会重新复位这个计时器,如果在这个计时器的时间里没有收到客户端的任何数据的话,服务器就会发送一个探测报文段,如果尝试发送次数达到了饱和探测数,并且依旧没有收到回复,服务器就认为客户端出了故障并关闭连接。