linux 建立http连接失败,【linux】http请求建立连接的时候为啥是tcp三次握手,而不是二次或者四次?...

面试被问到这样的问题,求大神指教?

回答

我简单点说吧。

无论多少次握手都不能满足传输的绝对可靠。

TCP的核心思想:保证数据可靠传输

其次:保证传输效率。

那么,就可以开始回答了:

为什么要握手(为什么不是2次握手)?

**为了保证传输的可靠。**

第一次握手CLIENT告诉SERVER“我将要开始传输数据了”。

第二次握手SERVER告诉CLIENT“我已经知道你将要传输数据了,我已经做好准备”。

第三次握手CLIENT告诉SERVER“我已经知道你已经知道'我知道你已经做好准备'”,SERVER端收到这个信号,开始传输数据。

但是此时CLIENT并不知道SERVER已经知道“CLIENT 已经知道SERVER已经知道”(有点绕,可以忽略这一句)。

为什么是3次而不是4次?

**为了提高传输的效率**

总之不管多少次握手,总会有一方不知道对方已经知道。因此为了传输效率,只要3次握手就认为已经可以开始传输数据,三次握手之后,

CLIENT和SERVER就进入ESTABLISHED状态,开始数据传输。

为什么不是两次:

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

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了

http协议就是这么规定的,还想咋握手

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值