什么是tcp的三次握手,我们先以大白话形象来解释下,以生活中最常见的例子来来讲讲三次握手:
打电话的生活实例:
我:老王,你是不是在隔壁呀?
老王:你怎么知道我在隔壁呀?
我:老王,你除了能在隔壁,你还能在哪?
从上面这段对话,我们能确定,老王听到了我说的话,我也听到了老王说的话,那么要确定我和老王之间的对话是否能够被对方所听到,就需要经过三次连接,这就是三次握手。
那么三次握手是发生是tcp通讯的什么时候呢?
每一次TCP连接都需要经过三个阶段:连接建立、数据传送和连接释放。三次握手就发生在连接建立阶段。
我们可以看看百度百科是如何解释三次握手的过程:
从百度百科的内容我们可以看到,客户端需要发送内容给服务器,服务器也要发送给客户端,那么这些信息是什么?从哪里开始发出的呢?
我们一起来看下TCP报文段的首部格式:
在三次握手的整个过程中,我们会用到两个序号和三个标志位
(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
了解了,TCP数据报的数据部分,我们再看看百度百科的解释:
第一次握手:客户端发送syn包给服务器,这个时候syn=j,这个时候,客户端的状态进入SYN_SENT状态,需要等待服务器确认。(大白话说就是客户端发了个包给服务器,我客户端就处在发送状态了,但是不知道服务器有没有收到,我就需要服务就确认有没有收到,这个时候客户端处在SYN_SENT状态,sent是)
第二次握手:服务器收到syn包,确认了客户端的syn,ack=j+1,,同时服务器也给客户端发送一个syn包(syn=k),注意,服务器发给客户端的是SYN+ACK包,此时服务器进入SYN_RECV状态(大白话说就是,我服务器收到了你客户端发来的信息了,收到之后,ack值就要变为j+1,为了让你客户端知道我服务器收到了你的信息,我先回复你的SYN,然后我再加上我自己想对你说的话一起发送给你ACK,所以发送的是SYN_ACK包,然后我服务器就等着你客户端给我回应,就处在SYN_RECV状态)
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(established中文意思是已建立))
至于为什么是三次握手,不是四次握手?
三次握手,是确定客户端与服务器是否确定连接的最小值,还不明白为什么是最小值得话,可以再琢磨琢磨我和老王的对话。
本文纯小白瞎写,经验不足,还需各位批评指正,博文内容后续还将继续更新维护。