tcpip是什么 tcpip协议通俗易懂( 二 )


SYN_RECV是指,服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态 。再进一步接收到客户端的ACK就进入ESTABLISHED状态 。
第三次握手:客户端收到服务端的 SYN+ACK(确认符) 报文段;然后将 ACK 设置为 y+1,向服务端发送ACK报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED(连接成功)状态,完成TCP 的三次握手 。
上面的解释可能有点不好理解,用《图解HTTP》中的一副插图 帮助大家 。

tcpip是什么 tcpip协议通俗易懂


当客户端和服务端通过三次握手建立了 TCP 连接以后,当数据传送完毕,断开连接就需要进行TCP的四次挥手 。其四次挥手如下所示:
第一次挥手
客户端设置seq和 ACK ,向服务器发送一个 FIN(终结)报文段 。此时,客户端进入 FIN_WAIT_1 状态,表示客户端没有数据要发送给服务端了 。
第二次挥手
服务端收到了客户端发送的 FIN 报文段,向客户端回了一个 ACK 报文段 。
第三次挥手
服务端向客户端发送FIN 报文段,请求关闭连接,同时服务端进入 LAST_ACK 状态 。
第四次挥手
客户端收到服务端发送的 FIN 报文段后,向服务端发送 ACK 报文段,然后客户端进入 TIME_WAIT 状态 。服务端收到客户端的 ACK 报文段以后,就关闭连接 。此时,客户端等待 2MSL(指一个片段在网络中最大的存活时间)后依然没有收到回复,则说明服务端已经正常关闭,这样客户端就可以关闭连接了 。
最后再看一下完整的过程:
tcpip是什么 tcpip协议通俗易懂


如果有大量的连接,每次在连接,关闭都要经历三次握手,四次挥手,这显然会造成性能低下 。因此 。Http 有一种叫做 长连接(keepalive connections) 的机制 。它可以在传输数据后仍保持连接,当客户端需要再次获取数据时,直接使用刚刚空闲下来的连接而无需再次握手 。
tcpip是什么 tcpip协议通俗易懂


一些问题汇总:
1. 为什么要三次握手?
为了防止已失效的连接请求报文突然又传送到了服务端,因为产生错误 。
具体解释: “已失效的连接请求报文段”产生情况:
client 发出的第一个连接请求报文段并没有丢失,而是在某个网络节点长时间滞留,因此导致延误到连接释放以后的某个时间才到达 service 。如果没有三次握手,那么此时server收到此失效的连接请求报文段,就误认为是 client再次发出的一个新的连接请求,于是向 client 发出确认报文段,同意建立连接,而此时 client 并没有发出建立连接的情况,因此并不会理会服务端的响应,而service将会一直等待client发送数据,因此就会导致这条连接线路白白浪费 。
如果此时变成两次挥手行不行?
这个时候需要明白全双工与半双工,再进行回答 。比如:
第一次握手: A给B打电话说,你可以听到我说话吗?
第二次握手: B收到了A的信息,然后对A说: 我可以听得到你说话啊,你能听得到我说话吗?
第三次握手: A收到了B的信息,然后说可以的,我要给你发信息啦!
在三次握手之后,A和B都能确定这么一件事: 我说的话,你能听到; 你说的话,我也能听到 。**这样,就可以开始正常通信了 。**如果是两次,那将无法确定
2. 为什么要四次挥手?
TCP 协议是一种面向连接,可靠,基于字节流的传输层通信协议 。TCP 是全双工模式(同一时刻可以同时发送和接收),这就意味着,当主机1发出 FIN 报文段时,只是表示主机1已结没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回 ACK报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会中断这次TCP连接 。

推荐阅读