TCP为什么需要三次握手

参考链接:https://blog.csdn.net/csdnnews/article/details/86570658
https://blog.csdn.net/lengxiao1993/article/details/82771768


我们常常听到TCP三次握手,都知道TCP是面向连接的、可靠的协议,而UDP是无连接的、不可靠的。具体过程是怎么样的呢?

  • TCP 可靠性: 接收方收到的数据是完整, 有序, 无差错的。
  • UDP 不可靠性: 接收方接收到的数据可能存在部分丢失, 顺序也不一定能保证。

传输层协议是基于网络层的IP协议的,而IP协议是一种不可靠的、尽力传输的协议。TCP 协议为了实现可靠传输, 通信双方需要判断自己已经发送的数据包是否都被接收方收到, 如果没收到, 就需要重传。 为了实现这个需求,就涉及到序号(sequence number)确认号(acknowledgement number) 这2个概念 。

  • 序号 sequence number:TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。

  • 确认号 acknowledgement number:是期望收到对方的下一个报文段的数据的第一个字节的序号。

比如:发送方在发送数据包(假设每次发送的大小为 10 byte)时, 同时附加一个序号( 假设为 500),那么接收方收到这个数据包以后, 就可以回复一个确认号(510 = 500 + 10) ,告诉发送方 “我已经收到了你的数据包, 我希望下次收到数据包的序号从 510 开始” 。

一、TCP为什么需要三次握手,而不是两次?

我们可以把自己想象成客户端,而位于遥远的对端是一台未知的服务器,你们两者之间经历着复杂的网络,如何能够确保我们两者是可以正常建立通信连接的呢?那么只要经过三次报文交互就能够确定。

  • “三次握手”的作用就是为了双方都能明确自己和对方的收、发能力是正常的。

第一次握手:客户端主动发送数据包,如果服务器收到了。

  • 此时对于服务器而言,服务器知道自己的“接收”能力正常,客户端的“发送”能力正常。

第二次握手:服务器给客户端回复响应报文,如果客户端收到了。

  • 此时对于客户端而言,客户端知道自己的“发送”能力正常(因为我给你发送的报文 你给我做了响应,说明报文能正常发送),客户端的“接收”能力正常(我能收到你的报文)。同时知道服务器的“发送”、“接收”能力正常(能收到我第一次发的包,且做了响应)。
  • 此时对于服务器而言,服务器只知道客户端的“发送”能力正常,但客户端“接收”能力还不确定(我发给你的报文 我不确定你是否收到);同时,服务器知道自己的“接收”能力正常,但“发送”能力还不确定。

第三次握手:客户端给服务器回复响应报文,如果服务器收到了。

  • 此时对于服务器而言,服务器就能确定自己的“发送”能力正常,客户端的“接收”能力正常。

经历了三次握手,双方都能确定自己和对方的收、发能力正常,所以就开始数据传输了。

  • 为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤
  • 如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认

二、TCP三次握手过程

在分析TCP三次握手之前,我们需要先了解TCP报头的结构。

数据封装过程:每一层都把上层的协议包当成数据部分,加上自己的协议头部,组成自己的协议包
TCP为什么需要三次握手_第1张图片

TCP 报文段的首部格式:最小长度是20字节
TCP为什么需要三次握手_第2张图片
以下主要介绍三次握手主要涉及的几个字段。

确认位 ACK: 只有当 ACK =1 时确认号字段才有效。当 ACK =0 时,确认号无效。

同步位 SYN:同步 SYN = 1 表示这是一个连接请求或连接接受报文。

TCP为什么需要三次握手_第3张图片
TCP为什么需要三次握手_第4张图片

你可能感兴趣的:(TCP为什么需要三次握手)