一. 什么是 TCP
要了解 TCP 协议的三次握手和四次分手我们先来简单介绍下 TCP 是什么, TCP(Transmission Control Protocol 传输控制协议)是一种面向连接 (连接导向) 的可靠的 基于 IP 的传输层协议 TCP 在 IP 报文的协议号是 6TCP 是一个超级麻烦的协议, 而它又是互联网的基础, 也是每个程序员必备的基本功, 我们知道, OSI(Open System Interconnection)一共有七层网络模型, TCP 协议是其中运输层的一个协议, 下图可以清楚看到他们之间的关联:
OSI 七层网络模型
二. TCP 三次握手的含义和意义
1. 三次握手的含义
TCP 是面向连接的, 无论哪一方向另一方发送数据之前, 都必须先在双方之间建立一条连接在 TCP/IP 协议中, TCP 协议提供可靠的连接服务, 连接是通过三次握手进行初始化的三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息, 完成了三次握手, 客户端和服务器端就可以开始传送数据
2. 三次握手的步骤
1. 第一次握手: 客户端发送请求建立连接, 请求报文段
2. 第二次握手: 服务器收到请求, 发送同意并请求与客户端建立连接
3. 第三次握手: 客户端收到请求, 发送同意与服务器建立连接
其实关于三次握手的流程涉及许多技术细节, 我这里做了简化, 最简单的理解如下图所示:
三次握手示意图
3. 三次握手的意义和作用
看了上面的介绍那么问题来了, 为啥要三次握手? 有什么作用呢?
在谢希仁版计算机网络书中举了一个例子解释了这个问题:
已失效的连接请求报文段的产生在这样一种情况下: client 发出的第一个连接请求报文段并没有丢失, 而是在某个网络结点长时间的滞留了, 以致延误到连接释放以后的某个时间才到达 server 本来这是一个早已失效的报文段但 server 收到此失效的连接请求报文段后, 就误认为是 client 再次发出的一个新的连接请求于是就向 client 发出确认报文段, 同意建立连接假设不采用三次握手, 那么只要 server 发出确认, 新的连接就建立了由于现在 client 并没有发出建立连接的请求, 因此不会理睬 server 的确认, 也不会向 server 发送数据但 server 却以为新的运输连接已经建立, 并一直等待 client 发来数据这样, server 的很多资源就白白浪费掉了采用三次握手的办法可以防止上述现象发生例如刚才那种情况, client 不会向 server 的确认发出确认 server 由于收不到确认, 就知道 client 并没有要求建立连接
简而言之, 就是为了防止已失效的连接请求报文段突然又传送到了服务端, 因而产生错误具体到每个握手步骤的作用, 就是第一次和第二次握手为了保证服务端能够接受到客户端的信息并能做出正确的应答, 第二次和第三次握手为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次
四. TCP 四次分手的含义和意义
1. 四次分手的含义
当客户端和服务器通过三次握手建立了 TCP 连接以后, 当数据传送完毕, 相应的就要断开 TCP 连接那对于 TCP 的断开连接, 这里就有了四次分手
2. 四次分手的步骤
1. 第一次分手: 客户端发送断开请求
2. 第二次分手: 服务器收到断开请求, 发送同意断开连接的请求
3. 第三次分手: 服务器发送请求断开连接
4. 第四次分手: 客户端收到, 发送同意断开连接
3. 四次分手的意义和作用
同理, 为啥要四次分手? 有什么作用呢?
TCP 协议是一种面向连接的可靠的基于字节流的运输层通信协议 TCP 是全双工模式, 这就意味着,
1. 当客户端发送断开请求, 只是表示客户端已经没有数据要发送了, 客户端告诉服务器, 它的数据已经全部发送完毕了, 但是, 这个时候客户端还是可以接受来自服务器的数据(第一次分手)
2. 当服务器收到断开请求时, 表示它已经知道客户端没有数据发送了并发送同意断开连接的请求, 但是服务器还是可以发送数据到客户端的(第二次分手)
3. 当服务器发送同意断开连接的请求后, 这个时候就表示服务器也没有数据要发送了, 就会告诉客户端, 我也没有数据要发送了(第三次分手)
4. 当客户端收到服务器发送请求断开连接后, 再去告诉服务端我已经知道你没有数据要发给我了, 同意断开连接请求(第四次分手)
参考链接: 关于 TCP 协议, 我想你应该懂了!
来源: http://www.jianshu.com/p/5638310fbef0