为什么TCP须要三次握手而不是两次
大家好,我是岛主小风哥,当天来聊聊为什么TCP须要3次握手而不是2次。
假定有一条河,河的高低游有两团体,这两团体只能借助这条河交流信息:
岸边有很多叶子,因此它们把信息写到岸边的叶子上:
并假定抢先的叶子会飘向下游,下游的叶子会飘向抢先。
但由于水流的作用,同一个方向叶子先登程的有或许后到(乱序),也有或许沉到水里(失落)。
也就是说假设a发了四片叶子,每片叶子上写两个字,记载的是“码农的荒岛求生”,a依次把【码农】【的荒】【岛求】【生】放到河里,这四片叶子抵达b后或许变成了【岛求】【码农】 【生】 【的荒】(乱序),也有或许丢了一片叶子,变成了【的荒】 【码农】 【生】(乱序+数据失落):
那么在这种状况下该怎样让b知道a想说的其实是“码农的荒岛求生”呢?
很便捷,只需两种机制:编号以及确认。
编号针对与乱序疑问,确认机制针对的是失落疑问。
a放到河里的恣意一片叶子都带上一个编号,这些编号依次递增,b收到叶子后依据编号重组起来,这样即使叶子抵达的顺序是乱的b也能依据编号复原信息:
乱序疑问处置了,叶子失落疑问依托确认机制:b收到每一片叶子后会回复一个收到,并附带接纳叶子的编号+1,也就是等候a收回的下一片叶子的编号:
这样a在接纳到【3 收到】后就确信b曾经收到了【2 的荒】,假设a在必定期间内没有收到【3 收到】那么就会从新拿起一片叶子再次发送【2 的荒】。
可以看到应用这种重传机制确保即使叶子或许沉到水里也能把信息发给b。
有了编号和确认机制,即使在河流这种无法靠的介质中a也可以把信息牢靠的传递给b。
当然b也可以应用这种机制把信息牢靠的发送给a。
由于须要对每片叶子启动编号,因此a向b发送信息之前必定把叶子的初始编号通知b,又由于b也可以向a发送信息,因此双方在通讯之前必定知道对方叶子的初始编号,这样才干正确的启动叶子收到后确实认以及对叶子依据编号启动重排。
于是ab双方协议,聊天动员方先把编号通知聊天接纳方,聊天接纳方收到动员方编号后也把自己的编号通知动员方。
依然假定a先动员通讯,a先发送了一片叶子,写着“SYN X”,SYN示意这是一片通知你我的初始编号的叶子(在TCP中SYN是synchronization的简写,示意同步,但作用和这里一样),X示意自己的初始编号。
依据之前提到确实认机制,b在收到须要对这片叶子启动确认,于是b发送一片叶子:“ACK X+1”,示意“我确认曾经接纳到了你的叶子,等候接纳X+1号叶子”(在TCP中ACK是acknowledge的简写,示意确认,作用和这里一样)。
不要忘了,b也要把自己的编号通知a,于是b紧接着又发送了一片叶子“SYN Y”,示意“这是一片通知你我的初始编号的叶子,我的初始编号是Y”:
雷同的a收到后也要启动确认,于是a发送一片叶子:“ACK Y+1”,示意“我确认曾经接纳到了你的叶子,等候接纳你Y+1号叶子”。
就这样经过起码四片叶子,a和b就能知道对方的初始编号是多少,留意看这里:
可以看到这两片叶子都是b发向a的,因此这两片叶子的信息可以兼并在一同,这样就可以少发送一片叶子:
可以看到,双方至少须要发送3片叶子才干知道对方的初始编号,而假设只发送两片叶子没方法保障这一点。