TCP是面向连接的:在真正通讯之前,必须先建立一条通讯线路,必须先完成连接。
TCP完成连接的过程:(保证通讯线路畅通)
建立连接:
三次握手基本过程
①客户端首先向服务器发送一个建立连接的请求,SYN被设置为1,为请求建立连接报文段。
②服务器在接收到建立连接的请求后会给客户端回馈消息,传回ACK=1,告诉客户端服务器收到了SYN,防止客户端重传SYN。服务器再向客户端回馈SYN,回馈可以连接。
③ 客户端向服务器发送ACK,对SYN的确认。
三次握手状态变化
①客户端发起连接,将状态设置为SYN_SENT。不同状态代表不同阶段
②服务器接收到SYN,将ACK,SYN发送出去后处于SYN_RCVD状态,即接收到客户端发送的SYN
③当客户端将ACK发送出去并且接收到了ACK,SYN处于已连接(ESTABLISHED)状态
④ 当服务收到ACK后,也处于已连接(ESTABLISHED)状态
问题:为什么是三次握手,不能是两次握手?
1.如果没有最后的一个ACK,则服务器会不断地超时重传ACK/SYN(第二个报文段)
2.若为2次会浪费服务器的资源(SYN溢出攻击或网络环境影响 客户端的SYN会被重传多次)
断开连接:
四次挥手基本过程
不分服务器与客户端,因为服务器与客户端都有可能断开,所以我们将其分为主动断开方与被动断开方。
①主动断开方向被动断开方发送一个请求断开连接报文FIN。(关闭主动方到被动方的传输通道)
②被动方收到FIN后,向主动断开方只回馈一个ACK消息。
③ 当过了一段时间以后,被动断开方向主动断开方再发送一个请求断开连接FIN报文。(关闭被动方到主动发的传输通道)
④主动断开方接收到FIN向被动断开方再回馈一个ACK,连接断开。
问题:为什么要进行两次FIN?
因为为全双工信道,任意时刻双方互相通讯,至少有2条通讯信道,一个FIN只能关一条,所以得有两个FIN。
四次挥手状态变化
①主动方将FIN发送出去后处于FIN_WAIT_1状态
②当被动方接收到FIN并将ACK发出去后处于CLOSE_WAIT(等待关闭)状态
③当主动断开方接收到ACK后处于FIN_WAIT_2状态
④当被动方将最后一个FIN发出去后处于LAST_ACK(等待最后一个ACK)状态
⑤当主动方在收到了FIN并且将ACK发送出去后,处于TIME_WAIT状态
⑥当被动方接收到ACK后处于CLOSED状态
⑦主动断开方必须再等待一段时间到达CLOSE状态
TIME_WAIT的意义(存在时间大约是2MSL:MSL为报文段在网络中最大生存时间):
1.保证迟来的数据能被识别并丢弃
2.保证可靠的终止TCP连接,防止对后续运行的程序造成影响(TIME_WAIT存在时间内,主动断开方无法用相
同的IP地址端口号再启动一个网络通讯)
TIME_WAIT与CLOSE_WAIT的区别:
CLOSE_WAIT:处于被动断开方,仅仅属于断开过程中的一种状态
TIME_WAIT:处于主动断开方,是一种特殊的状态
问题:有没有可能是三次挥手?有可能!
被动断开方的ACK与FIN在一起发向主动断开方,即它们同时断开连接,中间等待时间为0,即为三次挥手。