TCP包头:其中ACK,SYN,FIN在这两个过程中会用到,简单介绍如下:
ACK:表示是否前面的确认号字段是否有效,ACK=1,表示有效,只有当ACK=1时,前面的确认号字段才有效,TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段。
SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段。
FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕,如果FIN=1,即告诉对方:""我的数据已经发送完毕,你可以释放连接了""带FIN标志的TCP报文段称为结束报文段.。
三次握手的过程
CLOSED:没有任何连接状态
LISTEN:倾听状态,等待来自远方TCP端口的连接请求
SYN-SENT:在发送连接请求后,等待对方确认。
SYN-RECEIVED:在收到和发送一个连接请求后,等待对方确认。
ESTABLISHED:代表传输连接建立,双方进入数据传送状态。
在没有建立连接之前,客户端与服务器处于关闭状态,第一次握手 当客户端想与服务器建立连接时,它就会主动向服务器发送信号,此时SYN=1,ACK=0,表示主动请求建立连接。TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=x。发送连接请求后,客户端就进入SYN-SENT状态,等待对方确认
第二次握手
当服务器收到客户端的请求连接时,如想与客户端建立连接,就会给客户端发一个确认信号。此时SYN=1,ACK=1时,表示同意建立连接。然后进入SYN-RECEIVED状态,等待对方确认。
第三次握手 当客户端收到了服务器同意建立连接的信号后, 会给服务器再发一次确认信号,然后两者就进入了建立连接状态。开始数据传输了。
为什么要进行三次握手呢(两次确认)
主要是为了防止客户端已失效的连接请求报文段突然又送到了服务器端,因此产生错误。
现在假定出现一种异常情况:客户端发出的第一个连接请求报文段并没有丢失,而是在某些
络节点长时间滞留了,以致延误到连接释放以后的某个时间才能到达服务器,本来这是一个早已失效的报文段,但服务器收到此失效的连接请求报文段后,就误认为是客户端又发出一次新的连接请求,于是就像客户端发出确认报文段,同意建立连接,假定不采用三次握手,那么只要服务器发出确认,新的连接就建立了。由于现在客户端并没有发出建立连接的请求,因此不会理睬服务器端的确认,也不会向服务器端发送数据,但服务器端却以为新的传输连接已经建立了,并一直等待客户端发来数据,服务器端的许多资源就这样白白浪费了。
采用三次握手的方法可以防止上述现象的发生,在刚才的情况下,客户端不会向服务器端的确认发出确认,服务器端收不到来自客户端的确认,就知道客户端并没有要求建立连接。
四次挥手的过程
FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认。
FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求
TIME-WAIT 完成双向传输连接关闭,等待所有分组消失
CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认。
LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失。
CLOSING 双方同时尝试关闭传输连接,等待对方确认。
第一次挥手 当客户端想与服务器断开连接时,就会主动向服务器发一个终止包。此时FIN=1,表示可以释放连接了。然后进入终止等待1状态。
第二次挥手 服务器收到客户端发来的请求断开连接的包,就会给服务器发一个确认信息。此时ACK=1,表示已经收到客户端发来的请求断开连接的请求了。然后进入关闭等待状态。而客户端收到服务器端的确认后,进入终止等待2状态,等待对方发送关闭传输连接请求
第三次挥手 服务器端同意断开连接时,向客户端发送同意断开连接的数据包。然后进入LAST-ACK状态,等待最后确认。
第四次挥手 客户端收到服务器端发来的同意断开连接的请求,会给服务器端发一个确认信息,然后进入TIME-WAIT状态,时间较长,完成双向传输连接关闭,等待所有分组消失。然后再进入CLOSED状态。服务器端收到确认信息,断开连接,然后进入CLOSED状态。