前言
其实TCP三次握手不会很难,但是很多时候记起来或者理解起来就是少了这么一点东西。但看完这个文章你会理解很清楚而且还记得蛮牢固。
如果你去矿洞找一个人,你会怎么做?
首先,我们先不去研究TCP三次握手,我们先看看当我们在黑漆漆的矿洞中找一个人,我们会怎么做呢?
如果是我,我会先在矿洞大声叫我想找的人的名字。然后我想找的人在黑暗中听到我的呼喊,然后也大声喊了我的名字说,我在这里。那么我听到他的声音的方位,那我会告诉他:我大概听出你在哪个方位了,你待在那里不要走,我去找你。
那么,这个案例和TCP三次握手有什么关系吗?
其实,TCP三次握手和上面这个很类似,都是在一个未知的环境,去找到我们知道的目标,而且在这个过程中去多次去确认对方是否知道我们的位置。
TCP三次握手过程
现在,我们用上面的过程去叙述下三次握手的过程:
- 我在矿洞呼喊要找的人的名字 -> 客户端向服务端发出请求,这时候服务端始终在监听是否有人发出请求,而发出的信息是SYN(同步序列号)为j,然后自身处于SYN_send状态
- 那个人听到我的呼喊,回应我并且大喊我的名字,说听到了我的声音吗? -> 服务端收到请求,这时候服务端处于SYN_revd状态,并且给客户端发送确认请求,请求信息为SYN为k,ACK为j+1 (为了让客户端知道服务端收到的是客户端发出来的消息,就用客户端发送的SYN的信息加1)
- 然后我确听到他的声音,并且大概推测他的位置,并告诉他我听到他的声音,让他在原地等我 -> 客户端收到服务端发来的确认请求,这时候客户端处于SYN_ESTABLISH状态,然后告诉服务端已经建立的确认请求,这时候的请求信息为ACK为上次请求的SYN+1(k+1).然后服务端收到请求,这时候连接建立起来,服务端的状态为ESTABLIS_END。
总结
其实,按照这样去理解TCP三次握手会没有说很混乱。三次握手本质上就是两次确认对方是否能听到自己的声音,就是能否收到自己的信息,当然在这其中就得有一个方法去辨识你怎么知道我收到你的信息,这时候SYN和ACK就发挥很大的作用。ACK的值每次都是Syn+1,这样双方才知道是否能收到彼此的信息。