在了解三次握手原则之前,我们先来了解一下UDP和TCP协议之间的关联和关系和区别;
在网络数据传输协议中,可划分为三个层次,分别是:网络层、传输层、应用层。
在传输层中,就有TCP和UDP协议,而HTTP则位于应用层,除此之外,应用层还有FTP、TELNET、SMTP、DNS等协议。
这三种协议在日常生活中的应用较为广泛,比如无线广播就是使用的UDP协议,其特点就是传输效率高,但是UDP协议传输数据不安全,容易出现数据丢失的问题并且没有重发机制。UDP不可靠,不保证消息送达。
而TCP协议相对于UDP而言就安全多了,TCP 可靠保证消息送达,有重发机制。TCP是面向连接的,也就是每次通信之前,都需要先建立好连接,然后再进行通信。
上面讲到,TCP是需要建立连接的,那么,这个连接是如何建立起来的呢?我们一起来看看。
TCP的连接是需要进行三次握手从而建立起连接的,那么,这个三次握手是如何建立的呢?为何必须是三次握手呢?
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
我们通过一组图来看一下TCP三次握手的过程:
如图所示,甲和乙两个人通过三次交流从而建立起连接。那么,可能就会有小伙伴会问了,从这里,好像也没有看出三次握手的特别性啊。我们接着往下面看。
首先,TCP建立连接前,需要先进行三次握手从而建立连接。为什么必须是三次握手呢,还是以上面的图为例;
假设,甲给乙发消息:你瞅啥
情况一:假如乙没有收到甲发送的消息,可能是由于网络原因之类的一些不确定因素导致数据传输失败,那么发送出去的消息乙并没有接收到。显而易见,连接建立失败了;
情况二:假如乙成功收到了甲发送过来的数据,然后也积极的给甲回复了一条信息:瞅你肿么啦; 这个时候,如果乙给甲发送数据的时候,由于一些不确定的因素,导致数据丢失,甲没有收到乙发送过来的消息,那么,本次连接还是建立失败了。
情况三:假如乙成功的收到了甲发送过来的数据,然后乙发送给甲的数据甲也成功的收到了。这个时候,甲再回一句:你再瞅试试; 这个时候,数据发送失败,乙没有收到甲的消息,此时,连接还是建立失败了。
所以必须先建立连接双方才能有效通信。那么,上面的例子,为什么当三次握手时数据丢失即连接失败呢?
我们一起来分析一下:
首先,甲给乙发消息,那么,甲如何能够得知自己的消息乙成功接收到了呢?这个时候,乙再给甲回一个消息,当甲成功收到消息时,这个时候甲就能够确定,首先,自己这边发送消息功能正常,并且接收消息功能正常,然后再再给乙回一个消息。
这个时候再来看看乙。首先,乙刚刚收到了甲发过来的:”你瞅啥”;乙这个时候能够确认自己的接收功能正常,然后乙给甲回了一个”瞅你肿么了”;但是乙并不能确定自己的发送功能是否正常,甲是否能够接收到自己发送的消息,所以,需要第三次握手,也就是甲给乙再回一句:”你再瞅试试”;当乙成功收到甲发送过来的消息时,这个时候,乙就能肯定,自己的发送功能和接收功能都是正常的。可以开始建立通信了。
是不是感觉有点神奇。
当甲和乙三次握手建立成功时,这个时候TCP连接就建立成功了,此时就建立起了一个连接。
而HTTP协议则是建立在TCP协议之上的,所以HTTP协议也是一种安全可靠的协议并且是一种无状态的协议。
关于HTTP协议,我会在后面的文章中陆续学习和记录。