TCP,全称TransmissionControlProtocol。从名字我们就可以知道,这是一个传输层的协议,用于控制传输。TCP位于TCP/IP和OSI模型的传输层。我们最常使用的HTTP协议,底层通常使用TCP协议。如果我们要在客户端和服务器之间建立TCP连接,我们需要在开始的时候发送三个请求来确认双方的通信能力是正常的。这三个连接称为TCP三向握手。TCP的三次握手下图是TCP头部的结构。我们的TCP三次握手主要用到黄色部分。下面开始解释三次握手。在第一次握手中,客户端向服务器发送一条TCP消息。在TCP头中:设置SYN标志为1。然后给seq分配一个随机数(假设随机数为x)。所谓的标志位其实就是一个数据位,将其设置为1其实类似于编程中将一个布尔值设置为true。SYN代表sync,seq代表Sequencenumber,这是一个可以加载值的地方。我们将其设置为一个随机数,用作令牌。稍后,服务器将使用它。第二次握手服务器收到SYN,知道客户端要建立TCP连接,得到一个seq随机数。服务器然后向客户端发送TCP消息。在TCP头中:设置ACK标志为1,表示客户端的连接请求已经被确认(acknowledge)。ack的值设置为client传过来的seq值+1(即x+1)。将SYN标志设置为1,表示服务器也想连接。seq的值设置了一个随机数(假设随机数为y)。服务器使用ACK和ack通知客户端它知道连接请求,并发送自己的SYN和seq来请求与客户端建立连接。第三次握手客户端收到TCP请求,首先验证ACK是否为1,ack是否为x+1。如果是,则说明服务器发送的是第一次握手对应的返回。客户端发送另一个TCP请求:ACK设置为1。ack设置为服务器的ack+1的值(即y+1)。三次握手后,TCP连接建立。总结三次握手,简单来说就是这样:client->server:SYN=1,seq=x(x为随机数)。Server->Client:ACK=1,ack=x+1,SYN=1,seq=y(y为随机数)。客户端->服务器:ACK=1,ack=y+1。
