[原]TCP协议的三次握手与四次挥手

TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP层是位于IP层之上,应用层之下的中间层。

现在要讨论的就是TCP协议建立连接和连接终止的过程。

连接建立

连接建立使用的是三次握手协议。

三次握手的目的是为了确认两台主机均具备收和发的能力。之所以是三次我想继续往下看就会了解的。

三次握手的过程:

  1. A主机向B主机发起连接请求,让B主机知道A主机可以发送消息;
  2. B主机向A主机回复消息,让A主机知道B主机能接收到,也能发送;
  3. A主机向B主机回复消息,让B主机知道A主机可接收消息。

当然真的过程必定带着消息的传送,上面只是简单的概述一下整个过程,下面通过一幅图来了解这个过程。

在此之前需要了解其中的一些名词的意义:

  • SYN : 建立连接;
  • seq :序列号,随机生成;
  • ack :确认消息,取值为 seq + 1;

  1. 客户端发送SYN(SEQ=n)报文给服务器端,进入SYN_SEND状态。
  2. 服务器端收到SYN报文,回应一个SYN (SEQ=u)ACK(ACK=n+1)报文,进入SYN_RECV状态。
  3. 客户端收到服务器端的SYN报文,回应一个ACK(ACK=u+1)报文,进入Established状态。

至此,连接就已经建立完成了,可以开始传送数据了。

从上面的过程我们可以知道必须要用三次才可以完全了解到双方都是可以发送并接收数据的。

连接终止

连接终止使用的是四次挥手协议。

四次挥手的目的是为了确认数据完全接受,并且关闭连接。

四次挥手的过程:

  1. A主机告诉B主机数据发送完了;
  2. B主机告诉A主机知道A主机把数据发完了;
  3. B主机告诉A主机数据接收完了;
  4. A主机告诉B主机知道B主机把数据接收完了。

同样,我们通过一个图来了解这个过程。

  • FIN : 终止,结束,类似于SYN

  1. 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕;
  2. 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认;
  3. 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN;
  4. 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。

至此,连接也就终止了。

而需要四次是因为:在A主机发送完数据后,可能因为一些延迟,B主机并不能立刻完全接收数据。所以需要先告诉A主机,我知道你发完了,但是我还没有接受完数据,然后等数据完全接收完了之后再告诉A主机我接收完了。这就需要四次才可以完成整个过程。

以上就是全部内容。

文章作者: JaCo Wu
文章链接: https://jacokwu.cn/blog/2018/08/30/原-TCP协议的三次握手与四次挥手/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 JaCo Wu的博客