三次握手
TCP在建立连接时采用了三次握手的方式
举个例子~
你去下馆子
你 :老板,来碗拉面!
老板:好,十块!
你 :好,给你。
这里的每一句话,粗略的可以看作一次握手。
第一句,算是你发给老板的请求(SYN)
第二句,老板“好”,算是答复(ACK),“十块”算是老板发给你的请求(SYN)
第三句,算是你给老板的答复(ACK)
每说一次答复都可以让对方知道,我方可以正确的接收到对方的信息。
过程
由上图可见,双方都是在接收到ACK之后,就建立连接成功。
-
client:
第一次握手中,向server发送SYN+seq凭条。
第二次握手中,收到server发送的ACK+seq凭条。
以上两点,证明了server可以正确收到并回复client的信息。 -
server:
第二次握手中,向client发送SYN+seq凭条。
第三次握手中,收到client发送的ACK+seq凭条。
以上同理可证client可以正确收到并回复server的信息。
以上,通过这种平等的双方证明,可以建立起稳定的连接,防止资源浪费。
为什么不两次握手
试想一下,如果是两次握手,那么情况就是:
这样子对两边来说是个什么情况呢?
对于client来说,好像还行,client可以知道对方读懂了我的意思。
对于server来说就有点懵逼了,收到个东西,然后回复,然后就没有然后了。都不知道对方到底懂不懂自己的意思。
更可怕的是什么呢?
如果server仅凭一个SYN就建立连接,那么如果这个SYN是过期的,那么就会造成server的单相思,也就是资源的浪费。
为什么不四次握手
三次握手就能解决的问题为啥要多一次嘞~(ˉ▽ˉ;)(我太菜了,我没深究)
重传机制
举个例子~
还是下馆子
如果你喊话老板没反应,你就会继续喊:“(#`O′)老板!这里要买东西嘞!”
如果老板后来听到了,交易就可以继续
如果老板后来没听到,你喊多了就累了:“算了,今天不买了。”
如果老板把说好,报了价钱,但是这时你上厕所去了,无法回应
这时老板就会继续喊:“(#`O′)哎,你还买不买啊!”
如果你马上提了裤子就出来回话,交易就可以继续
如果一直没回应,老板做拉面出来没人给他钱,他会亏本的
以上的继续喊这个动作,就是重传机制。
当发送一个SYN请求之后,内核就会将这个SYN的复制版本放到一个专门的队列里,每隔一段时间,就去查看是否收到了相应的ACK包,如果没有收到,那么就会再发一次,默认会重新发五次。
四次挥手
举个例子~
还是下馆子
老板:您好,我们要打烊了
你 :要关门了是吧,让我检查一下我有没有落下东西
过了一会儿
你 :我完事了,我这就走,再见
老板:慢走
四次挥手其实也是在让双方确认对方的信息,只不过把三次握手的第二次拆开,使得被呼叫关闭的一方有时间来整理资源,不会造成损失。