三次握手
我们假设A和B是通信的双方。我理解的握手实际上就是通信,发一次信息就是进行一次握手。
- 第一次握手: A给B打电话说,你可以听到我说话吗?
- 第二次握手: B收到了A的信息,然后对A说: 我可以听得到你说话啊,你能听得到我说话吗?
- 第三次握手: A收到了B的信息,然后说可以的,我要给你发信息啦!
在三次握手之后,A和B都能确定这么一件事: 我说的话,你能听到; 你说的话,我也能听到。 这样,就可以开始正常通信了。
主要步骤如下:
1. 连接开始时,连接建立方(Client)发送SYN包,并包含了自己的初始序号a;
2. 连接接受方(Server)收到SYN包以后会回复一个SYN包,其中包含了对上一个a包
的回应信息ACK,回应的序号为下一个希望收到包的序号,即a+1,然后还包含
了自己的初始序号b;
3. 连接建立方(Client)收到回应的SYN包以后,回复一个ACK包做响应,其中包含了
下一个希望收到包的序号即b+1。
如果两次,那么B无法确定B的信息A是否能收到,所以如果B先说话,可能后面的A都收不到,会出现问题 。
如果四次,那么就造成了浪费,因为在三次结束之后,就已经可以保证A可以给B发信息,A可以收到B的信息; B可以给A发信息,B可以收到A的信息。
四次挥手
四次挥手步骤:
A:“喂,我不说了 (FIN)。”A-->FIN_WAIT1
B:“我知道了(ACK)。等下,我还没说完。Balabala…..(传输数据)”B-->CLOSE_WAIT | A-->FIN_WAIT2
B:”好了,说完了,我也不说了(FIN)。”B->LAST_ACK
A:”我知道了(ACK)。”A->TIME_WAIT | B->CLOSED
A等待2MSL,保证B收到了消息,否则重说一次”我知道了”,A->CLOSED
这样,通过四次挥手,可以把该说的话都说完,并且A和B都知道自己没话说了,对方也没花说了,然后就挂掉电话(断开链接)了 。