这篇文章是写给什么人看的?
网络编程是现代计算机编程中不可缺少的一个环节,这里面的程序员主要分为两种类型:一种是专门搞网络编程的,估计是一些通信专业的童鞋,他们的任务是管理整个网络的通信;第二种是使用网络作为一个传输介质的的,最常见的就是使用socket编程的人,他们一般只是使用一些接口函数来完成通信任务。这两种人的关系就好比是修路人和走路人的关系,而这一篇文章是面向走路人的,更确切的说,就是帮助你通过网络编程面试的。
这篇文章的主要内容是什么?
正因为TCP三次握手信号非常重要,也非常基础,所以是很多企业判断一个人是否了解网络编程的常用武器。就好像一提到C++就必须问的多态及虚函数那一套东西一样,所以本文就以一个外行人的视角(事实上本人也确实是个外行),来帮助你理解一下著名的三次握手协议。好了,步入正题。
首先,为什么要连接?
这是最基本问题之一,人家不一定会问,但为了对TCP有个较深入的理解,还是知道的好,因为也不复杂,就是一句话:因为TCP是面向连接的,只有连接好了才可以进行通信。
然后,先了解一下什么叫协议?
协议其实就是通信双方的一种规定。在计算机领域,就是大家规定好一些标志位,它们分别对应着一些特殊的意义。比如说收到对方一个字节信息,这个字节的第一位表示对方是男是女,后面6位表示对方年龄,还剩一位是校验位。
TCP中的标志位有哪些?
理解了上面这一点,那我们就来看看TCP协议都规定了哪些标志位,当然,这些位很多,我们只讲跟连接相关的几个。而且为了略去无关信息,把这些位在报文中的位置信息也省去了,总之它们都是出现在TCP的报文中的。
①序列号seq,就是给报文的一个编号,因为这个编号不一定从0或者1开始,但肯定是一个一个往上加的,但注意收发两端的序列号是分开计数的
②确认号ack,是期待接收到对方下一个报文的序列号,如果确认号为n,则说明前n-1个报文正确接收
③确认ACK,就是对方确认收到你信息的标志位,当ACK=1时,确认号才有意义
④同步SYN,这是专门用来连接时的标志位,当SYN=1,而ACK=0时证明这是一个请求连接信号
⑤终止FIN,这是专门用来是放一个连接的标志位,当FIN=1时,表示要释放连接了
再强调一下,三次握手协议就是通过设置上面这些标志位来实现的,而这些标识为都出现在TCP的报文中。
三次握手到底如何进行?
好了,下面开始讲三次握手过程,即TCP协议是如何建立一个连接的。为了方便叙述,我们先看一下示意图。
建立连接的过程大致如下:
①刚开始时,客户端和服务器都处于关闭状态
②服务器创建一个传输控制块TCB,用于记录连接信息,此后,服务器进入监听状态,及等待连接状态
③客户端有连接需求时,首先也创建一个传输控制块TCB,然后开始发送信息
④第一次握手,客户端向服务器发送一个同步信号报文,其中的同步信号SYN=1,还有一个序列号seq=x
⑤第二次握手,服务器接收到客户端发来的连接信号后,回一个同步信号报文,其中的SYN=1,确认标志ACK=1,确认序列号ack=x+1,序列号seq=y
⑥第三次握手,客户端收到服务器发来的确认信号后,会回一个确认信号,其中ACK=1,seq=x+1,ack=y+1
然后连接就建立好啦,双方想传啥就传啥吧...
如果去除序列号和确认号这些附加信息,三次握手就可以简化为同步信号,确认同步信号,确认信号三个。