问题一:为什么三次握手能保证可靠连接?
问题二:tcp服务端怎么感知到丢包?
要弄清TCP建立连接需要几次交互才行,我们需要弄清建立连接进行初始化的目标是什么。TCP进行握手初始化一个连接的目标是:分配资源、初始化序列号(通知peer对端我的初始序列号是多少),知道初始化连接的目标,那么要达成这个目标的过程就简单了,握手过程可以简化为下面的四次交互:
- 1)client端首先发送一个SYN包告诉Server端我的初始序列号是X。
- 2)Server端收到SYN包后回复给client一个ACK确认包,告诉client说我收到了。
- 3)接着Server端也需要告诉client端自己的初始序列号,于是Server也发送一个SYN包告诉client我的初始序列号是Y。
- 4)Client收到后,回复Server一个ACK确认包说我知道了。
整个过程4次交互即可完成初始化,但是,细心的同学会发现两个问题:
[1]. Server发送SYN包是作为发起连接的SYN包,还是作为响应发起者的SYN包呢?怎么区分?比较容易引起混淆
[2].Server的ACK确认包和接下来的SYN包可以合成一个SYN ACK包一起发送的,没必要分别单独发送,这样省了一次交互同时也解决了问题[1]. 这样TCP建立一个连接,三次握手在进行最少次交互的情况下完成了Peer两端的资源分配和初始化序列号的交换。
问题一回答:为什么三次握手能保证可靠连接?
2018、12、5:从交互形式来看,要想建立可靠的连接,应该是四次握手,也就是双方确定一个初始的序号,并把序号传递给对方,并需要响应对方的序号操作。但是服务端将回答和确认操作放在了一个包中上,所以可以进行单独的三次。
问题二回答:tcp服务端怎么感知到丢包?
2018、12、5:目前能看到的情况来看上,可以通过对方传递的ack的号码能不能和服务端上一次发送的seq+1对上。