(二) TCP 协议之连接

180 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1. TCP 连接

一个TCP 连接分为3个阶段:启动、数据传输、关闭。

TCP 协议使用三次握手建立连接,也就是启动阶段。

TCP 建立连接之后,这个连接就存在了。连接的双方可以通过连接来传输数据。这个连接的唯一标识就是一对套接字。每个TCP连接的唯一标识是一对套接字(源IP,目的IP,源端口号,目的端口号)。通过套接字区分是不是同一个连接。一个套接字(Socket)是一个IP地址和端口号 。

TCP 协议使用四次挥手建立连接,也就是关闭阶段。

1.1 三次握手

通过三次握手建立可靠的连接(通信双方的发送/接收均没有问题)。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接。

img

(图片来源于网络)

因为三次才能保证双方具有接收和发送的能力。TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。

1.2 四次挥手

通过四次挥手断开连接。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。

img

(图片来源于网络)

断开一个 TCP 连接则需要“四次挥手”:

  • 客户端:发送一个 FIN,用来关闭客户端到服务器的数据传送
  • 服务器:收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1 。和 SYN 一样,一个 FIN 将占用一个序号
  • 服务器:关闭与客户端的连接,发送一个FIN给客户端,并包含一个 ACK ,用于确认上一个 FIN。
  • 客户端:发回 ACK 报文确认,并将确认序号设置为收到序号加1

1.3 如何实现可靠性的??

  1. 传输数据之:三次握手建立可靠连接。

  2. 传输数据之:通过四次挥手断开连接。

  3. 传输数据之

    分块;编号;校验和(传输过程中是否有变化);重复数据(丢弃);

    停止等待 ARQ 协议(确认收到,超时重传);

    滑动窗口:控制发送速率;拥塞控制:网络拥塞时的解决方案;

传输过程中如何保证可靠性??

  • 应用数据被分割成 TCP 认为最适合发送的数据块。

  • TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。

  • 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。

  • TCP 的接收端会丢弃重复的数据。

  • 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区(在内核中)能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)

  • 拥塞控制: 当网络拥塞时,减少数据的发送。

  • ARQ 协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。

  • 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。