面试被问到这样的问题,求大神指教?
为什么不是两次:
A->B: 洞幺洞幺,我是洞拐,收到请回复,Over。
B->A: 洞拐洞拐,洞幺收到,Over。
请问根据以上对话判断,
B是否能收到A的信息? (答案是肯定的)
A是否能收到B的信息? (你猜?)
为什么不是四次:
A->B: 洞幺洞幺,我是洞拐,收到请回复,Over。
B->A: 洞拐洞拐,洞幺收到,收到请回复,Over。
A->B: 洞幺洞幺,洞拐收到,收到请回复,Over。
B->A: 洞拐你是鱼吗。。。 (传说鱼只有7秒记忆。)
你问她 你喜欢吃什么
她告诉你我喜欢吃苹果
然后你知道了她喜欢吃苹果,回答了一句‘哦’。
女神在你说了‘哦’之后就不理你了,这个话题就终结了。
你说是不是这个道理?三次握手不就是这样的吗?(调侃向)
tcp/ip connect: tcp/ip的三次握手
syn握手信号
------------->
syn/ack确认字符
client <------------- server
ack确认包
-------------->
哈,有意思的问题。
tcp三次握手,四次挥手。
我的理解是:
tcp是全双工双向通信,因此通信双方都要发送syn握手信号,而对方都要回复一个ack确认信号。
因此握手通常应该是2个syn+2个ack=4个信号包,tcp里服务端发送ack信号和发送syn信号,可以合并成一个包,所以可以减少一个包,因此就变成了3个包。
挥手也是4个信号包(2个fin+2个ack=4)哈,那能不能模仿握手合并信号包呢?答案是不能,因为ack信号后,可能有部分数据没有发送完,还要等待一段时机(比如发送某些数据后),才能发送fin信号。
简单理解就是,双向可靠通信,4个包,握手可以节省一个包,挥手不能节省包。
我的理解是这样的:
第一次握手:人群中有人向你向你喊了一声:草拟马!(syn=j)
第二次握手:然后你听到有人骂你找到那个人回复了一句:我(syn=k)听到有人骂我了是你(ask=j+1)喊的吗?
第三次握手:那个人回答你:是我(ask=k+1)。
开始交互数据: 开始打到一方逃跑为止。
上面那个说两次洞幺的,你没考虑到一个问题吗?
你用着呼叫机,你打电话给你朋友。开始第一次:你吃饭了吗?(你问)
第二次:还没吃(你朋友回到)
然后到这里,你就没声音了。你不在回一句朋友怎么知道你有没有听到?
电话打进来,问了一句就没消息,会不会觉得你消失了,或出事了?
建立连接过程中需要确定,双方都能收到消息。不然就是UDP了
7 回答5.3k 阅读
6 回答6.9k 阅读✓ 已解决
5 回答4.8k 阅读✓ 已解决
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
4 回答2.4k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
我简单点说吧。
无论多少次握手都不能满足传输的绝对可靠。
TCP的核心思想:保证数据可靠传输
其次:保证传输效率。
那么,就可以开始回答了:
为什么要握手(为什么不是2次握手)?
为什么是3次而不是4次?
详情可以查看我的这篇博客:计算机网络五层协议——TCP协议实例图解