说下TCP三次握手 第三次没有收到ACK包会怎样?

  • 客户端–发送带有 SYN 标志的数据包–一次握手–服务端
  • 服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端
  • 客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端

为什么不是两次握手?

三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
如果是两次握手,服务器端没有确定客户端有接受收能力,在传输链路遇到故障发送时间特别长下,会造成资源浪费Client反复发送,滞后的包传到了Server,Server又会返回包确认, 但是由于Client已经清除了上次的包,所以Client会丢弃掉这个包,但是Server又会保持这个相当于“僵尸”的连接.

为什么不是四次握手?

没有必要将第二步的ack+syn拆开发送

第2次握手传回了ACK,为什么还要传回SYN?

接收端传回发送端所发送的ACK是为了告诉客户端,我接收到的信息确实就是你所发送的信号了,这表明从客户端到服务端的通信是正常的。而回传SYN则是为了建立并确认从服务端到客户端的通信

第三次没有收到ACK包会怎样?

由于Server没有收到ACK确认,因此会重发之前的SYN+ACK(默认重发五次,之后自动关闭连接),Client收到后会重新传ACK给Server。如果Client向服务器发送数据,服务器会以RST包响应

如果已经建立了连接,但客户端出现了故障怎么办?

服务器每收到一次客户端的请求后都会重新复位一个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。


初始序列号是什么?

TCP连接的一方A,随机选择一个32位的序列号作为发送数据的初始序列号,比如为1000,以该序列号为原点,对要传送的数据进行编号:1001、1002...三次握手时,把这个初始序列号传送给另一方B,以便在传输数据时,B可以确认什么样的数据编号是合法的;同时在进行数据传输时,A还可以确认B收到的每一个字节,如果A收到了B的确认编号(acknowledge number)是2001,就说明编号为1001-2000的数据已经被B成功接受。


#Java研发工程师实习#
全部评论
😀
1 回复 分享
发布于 2020-11-17 12:00
真不错,住在牛客真不错
点赞 回复 分享
发布于 2020-09-10 13:47
a的seq号和b的seq号有关系吗
点赞 回复 分享
发布于 2020-09-10 15:13
欢迎分类补充问题😅
点赞 回复 分享
发布于 2020-09-11 08:49

相关推荐

2024-12-29 11:08
湖南工业大学 Java
程序员牛肉:简历没什么大问题了。 而且不要再换项目了。三月份就开暑期实习了,现在都一月份了。实在来不及重新开一下项目了。把一个项目写完或许很快,但是把一个项目搞懂吃透并不简单。所以不要换项目了,把你简历上面的两个项目好好挖一挖吧。 具体 体现在:你能不能流利的说出你的项目的每一个功能点代码实现?你能不能说出在这块除了A技术之外,还有其他技术能够实现嘛?如果有其他技术能够实现,那你这块为什么选择了你当前用的这个技术?
投递牛客等公司10个岗位
点赞 评论 收藏
分享
评论
11
78
分享

创作者周榜

更多
牛客网
牛客企业服务