在互联网的早期,互联网协议(IP)是人们用来连接互联网的唯一协议。IP的问题是,你可以发送一个信息,但不确定收件人是否会收到它。由于这个原因,TCP/IP被建立起来。
TCP/IP确保你发送的所有数据都能到达收件人那里。它通过在发送数据之前为客户和服务器提供一个安全连接来实现这一目标。这种安全连接是通过一个被称为三方握手的过程建立的,也被称为TCP/IP握手。
什么是三方握手?
图片来源:Fleshgrinder/Wikimedia
三向握手(TCP/IP握手)是客户端和服务器之间试图建立一个TCP连接的前三次互动。这些最初的互动对于建立一个安全的连接是至关重要的。在这个阶段,客户端和服务器都将商定参数,用于检查和验证传入和传出的数据包。这些参数将以TCP段的形式出现。
什么是TCP段?
在TCP/IP连接中,所有被发送的数据必须在所谓的TCP段上进行切割和结构化。这些段包含IP地址、端口、标志位、序列号、确认号等信息,以及可选的数据或有效载荷。
前三次互动(三方握手)将只包含TCP段头,没有有效载荷或附加数据。下面是一个TCP段的样本
图片来源:Ere/Wikimedia
请注意,上面的插图只针对TCP。一个完整的TCP/IP网段需要在上述TCP网段的基础上提供发送方和接收方的两个IP地址。
每当你给一个人寄包裹时,快递公司都会要求你填写一份信息表,然后在发货前把它附在包裹上。同样,TCP要求发送方在开始向收件人发送段(包裹)之前,在数据(包裹)上附加一个段头(信息表)。
每当客户端与服务器进行通信时,双方都需要以TCP段的形式进行互动。一个TCP段包括一个附在你要发送的数据上的TCP段头。发送方将不得不填写段头所要求的信息。
对于三方握手,发送方将需要填写以下内容。
- 源端口: 确定发送方的端口
- 目标端口: 标明接收方的端口
- 序列号: 表示分段序列
- 确认号码。通 过在给定的序列号上加一,表示段已被确认。
除了填写段头字段外,发送方还必须选择一个标志位。总共有六个标志位,但对于三方握手,你只需要以下两个。
- SYN: 提供一个序列号。这个序列号将被用来计算其余交互过程中所有传入段的序列。
- ACK: 表示SYN号的接收方接受连接请求,在SYN号上加一(1)。
现在你知道了什么是TCP段,让我们看看它在三方握手中是如何使用的。
三方握手如何工作
当客户端和主机都交换了信息并确认了对方的序列号后,就建立了三方握手。顾名思义,三方握手分三步完成。
首先,客户端发送一个纯粹的SYN段,表明它想要一个连接。第二,服务器用一个SYN-ACK段来回应,这意味着它已经承认了这个请求,并发送自己的SYN号码让客户承认。第三,客户端向服务器发送一个ACK段,通知它服务器的SYN号码已经被确认,并将用于进一步的连接。
一个三向握手将看起来像这样。
资产来源:Fleshgrinder/Wikimedia
让我们把它分解开来,看看各个环节,这样你就知道当客户端和服务器交换和确认序列号时到底发生了什么。
第1步:客户端发送一个SYN段
资产来源:Fleshgrinder/Wikimedia
客户端通过向服务器发送一个SYN段来发送一个请求连接。客户端使用客户端的IP地址来定位服务器并发送TCP段。
为了减少网段的复杂性,让我们忽略一些网段字段,而集中于三方握手连接的基本需要。这包括源端口、目的端口、序列号、确认号,以及使用何种类型的标志位。
这样一来,一个SYN/request段应该是这样的。
图片由作者制作
客户端端口是49152和65536之间的一个随机数。这个端口范围是约定俗成的范围,公共设备可以动态地使用它来连接到互联网。1024到49151的端口范围是私有的。它们必须经过实体注册才能使用指定范围内的端口。1024以下的端口号是为各种功能和互联网协议保留的端口,如FTP(端口20)、SMTP(端口25)、DNS(端口53)和HTTP(端口80)。
在现实生活中,序列号是一个随机数。在这个例子中,我们使用了00000000,以使它更容易被视觉化。
在我们的步骤中,请注意序列号。目前,它是00000000000。目前没有确认号码,因为没有要确认的东西。
第二步:服务器用SYN-ACK段进行回复
资产来源:Fleshgrinder/Wikimedia
一旦服务器收到SYN段,它将通过发送一个包含确认号码的ACK段来回应。确认号将是客户端的序列号加一(1)。
图片由作者制作
看一下源端口。它显示该段来自端口20,表明它来自服务器,是一个响应。
现在,看一下确认号码。它是00000001,也就是客户端的序列号(00000000)加1(1)。这就是段的跟踪方式。假设客户端收到一个ACK段的响应,其中的确认号码是00000002。这将向客户端表明,0000000001段丢失了,客户端将不得不等待,直到它到达,这样你就不会出现丢包的情况。
正如你所看到的,有两个标志位被激活--YN和ACK。
除了确认客户端的序列号外,服务器还将发送自己的序列号,让客户端确认服务器的序列号加一(1)。在我们的例子中,我们使用111111111作为服务器的序列号。同样,在现实世界中,这个数字是随机的。
请注意,客户和服务器的序列号不一定要匹配。只要双方都承认对方的唯一序列号,连接就会是可靠的。
第3步:客户端用一个ACK段进行回复
资产来源:Fleshgrinder/Wikimedia
最后,客户端确认服务器的序列号。
图片由作者制作
最后一段是客户端的ACK段。
正如你所看到的,客户端将通过回应服务器的序列号(111111111)加上一(1),即11111112,来确认服务器的序列号。
客户端和服务器将不再发送一个序列号,因为序列的开始已经被确认。然而,双方都希望在整个交互过程中,确认段继续序列号加一(1)和数字字节。在这种情况下,客户期望下一个服务器响应有一个0000000002的ACK(如果没有附加数据)。
之后,三方握手就建立起来了!
了解网络连接的工作原理
现在你已经了解了三方握手的工作原理,你也会更容易理解握手后TCP的工作原理。握手建立后,客户和服务器将开始发送数据。这次将使用完整的段格式,加上可选的数据或有效载荷。
数据通常被分段/切割成小块,以方便传输。每个数据段都有自己的段头,包含一个序列号和确认号。序列号的原因是为了知道段的顺序,当它们最终被重新组合时。确认号码的作用是向发送方核实他们的段已经收到,并且与传入的段的序列相匹配。
计算序列号并通过确认来验证它们,这就是TCP如何可靠地传输大块数据而不丢失任何数据包。
通过这些,你应该对TCP的工作原理有一个相当好的了解。