TCP(Transmission Control Protocol 传输控制协议) 三次握手是一个老生长谈的问题,此处也讲一讲,让自己再次加深一下记忆并深化讲一下。
这里先引用一个从朋友那里看到的例子:A和B进行通信
A:您好,我是A
B:您好,我是B
A:您好 B
我们也常称为“请求-应答-应答之应答”的三个回合,这个说起来简单,其实里面还是有很多的学问,很多的细节。
首先,为什么要三次,而不是两次?按说两个人打招呼,一来一回就可以了啊?为了可靠,为什么不是四次?
我们还是假设这个通路是非常不可靠的,A要发起一个连接,当发了第一个请求了无音讯的时候,会有很多可能性,比如第一个请求包丢了。或者没有丢,只是饶了弯路,超时了。还有可能是B没有响应,不想和A进行连接。
A不能确认结果,于是再发,再发。终于,有一个请求包到了B,但是请求包到了B的这件事情,目前A还是不知道的,A还有可能再发。
B收到了请求包,就知道了A的存在,并且知道了A要和它建立连接,如果B不乐意建立连接,则A会重试一阵后放弃,连接建立失败,没有问题。如果B是乐意建立连接的,则会发送应答包给A。
当然对于B来说,这个应答也是一入网络深似海,不知道能不能到达A,这个时候B自然不能认为连接是简历好了,因为应答包仍然会丢,会绕弯路或者A已经挂了都有可能。
而且这个时候B还能碰到一个诡异的现象就是,A和B原来建立了连接,做了简单通信后,结束了连接。还记得吗?A建立连接的时候,请求包重发了几次,有的请求饶了一大圈又回来了,B认为这也是一个正常的请求的话,因此建立了连接,可以想象,这个连接不会进行下去,也没有终结的时候,纯属单相思了,因此两次握手肯定不行。
B发送的应答可能会发送多次,但是只要一次到达A,A就认为连接已经建立了,因为对于A来讲,它的消息有去有回,A会给B发送应答之应答,而B也在等这个消息,才能确认连接的建立,只有等到这个消息,对于B来讲,才算它的消息有去有回。
---------------------------------------------------------------------------------------------------------手动分割线
TCP协议是主机对主机层的连接控制协议,位码即tcp标志位,有6种标示:SYN(synchronous建立联机)、 ACK(acknowledgement 确认)、 PSH(push传送) 、FIN(finish结束) 、RST(reset重置) 、URG(urgent紧急)、Sequence number(顺序号码) 、Acknowledge number(确认号码)。
下面给出TCP三次握手图文详解:
请求过程:
第一次握手:客户端请求与服务端时,客户端发送SYN包(syn=1 Seq=X)到服务器,并进入SYN_SEND状态,等待服务器确认
第二次握手:服务器收到SYN包,必须确认客户端发送的SYN包(syn=1),同时自己也发送一个SYN+ACK包(SYN=1 ACK= X+1 Seq = Y),此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,先确认收到了SYN+ACK包是否正确,然后会再次服务器发送确认包ACK(ACK=Y+1,Seq=Z),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.。