找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2717|回复: 12

上位机面试必备——TCP通信灵魂二十问(下篇)

 火.. [复制链接]
  • 打卡等级:常驻代表
  • 打卡总天数:34
  • 打卡月天数:6
  • 打卡总奖励:9027
  • 最近打卡:2025-12-17 23:15:51

2823

主题

541

回帖

2万

积分

管理员

积分
22569
发表于 2020-6-24 22:50:39 | 显示全部楼层 |阅读模式

今天就后面的10个面试题接着做下说明:

11

四次挥手中的TIME_WAIT状态?

首先要明确一点:主动关闭连接的一方,才会有TIME_WAIT状态。

之所以需要TIME_WAIT状态,主要是两个原因:

  • 防止相同的端口重新连接时,服务器收到的是停留在网络间的数据包
  • 保证被动关闭连接的一方能被正确的关闭,即保证最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭

12

为什么TIME_WAIT时间为2MSL?




MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。比如如果被动关闭方没有收到断开连接的最后的 ACK 报文,就会触发超时重发 FIN 报文,另一方接收到 FIN 后,会重发 ACK 给被动关闭方,一来一去正好 2 个 MSL。

2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果在 TIME-WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报文,那么 2MSL 时间将重新计时。在Linux系统中,2MSL默认值是60秒。

13

什么是TCP的保活机制?

定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP保活机制会开始作用,每隔一个时间间隔,发送一个探测报文,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到响应,则认为当前的TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。

14

已经建立连接,客户端故障怎么办?

这种情况就会触发TCP的保活机制,对应的参数包括保活时间、保活探测的次数、保活探测的时间间隔,其中保活时间默认为7200秒,保活探测次数为9,保活探测时间间隔为75秒。

也就意味着,如果客户端突然故障,会经过7200+75*9=7875秒即2小时11分15后,服务器才会判断该连接失效,以上参数可以手动设置。

15

TCP/IP协议与Socket之间是什么关系?

网络有一段关于Socket和TCP/IP协议关系的说法比较容易理解:

TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如Win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。

所以,Socket跟TCP/IP并没有必然的联系,Socket编程接口在设计的时候,就希望能适应其他的网络协议。Socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了一些最基本的函数接口,比如Send,Listen等。

16

什么是SYN攻击?

我们都知道 TCP 连接建立是需要三次握手,假设攻击者短时间伪造不同 IP 地址的 SYN 报文,服务端每接收到一个SVN 报文,就进入SYN_RCVD 状态,但服务端发送出去的 ACK + SYN 报文,无法得到未知IP 主机的 ACK 应答,久而久之就会占满服务端的 SYN 接收队列(未连接队列),使得服务器不能为正常用户服务。

17

如何避免SYN攻击?

避免SYN攻击的两个方案:

  • 通过修改内核参数,控制队列大小,并确定好当队列满之后应该如何处理,比如队列满之后,对新的SYN直接回复RST,丢弃连接。
  • 当SYN队列满了之后,后续收到的SYN,不直接进入SYN队列,而是先计算Cookie值,再发送,后续可以验证ACK包的合法性

18

TCP服务器Socket编程流程



  • 服务端初始化 Socket,得到文件描述符
  • 服务端调用 Bind,将绑定在 IP 地址和端口
  • 服务端调用 Listen,进行监听
  • 服务端调用 Accept,建立客户端连接
  • 通过Send向客户端发送消息
  • 通过Receive接收客户端消息

19

TCP客户端Socket编程?

  • 客户端初始化 Socket,得到文件描述符
  • 客户端调用Connect,连接服务器
  • 连接成功调用Send向客户端发送消息
  • 通过Receive接收客户端消息

20

Listen中的backlog参数什么意义?

Linux内核中会维护两个队列:

未完成连接队列(SYN 队列):接收到一个 SYN 建立连接请求,处于 SYN_RCVD 状态;

已完成连接队列(Accpet 队列):已完成 TCP 三次握手过程,处于 ESTABLISHED 状态;

在内核 2.2 之后,backlog 变成 Accept 队列,也就是已完成连接建立的队列长度,所以现在通常认为 backlog 是 Accept 队列。

以上即为TCP通信常见的二十问,希望对大家面试及TCP理解有所帮助。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
工控课堂 www.gkket.com

0

主题

187

回帖

741

积分

中级会员

积分
741
发表于 2020-6-24 23:30:18 | 显示全部楼层
加油,加油,不要沉下去,我是最热贴
工控课堂 www.gkket.com

0

主题

404

回帖

1266

积分

中级会员

积分
1266
QQ
发表于 2025-11-17 01:47:39 | 显示全部楼层
救命!这波发言太秀了,直接原地封神~
疯狂认同!楼主说出了我不敢说的话
工控课堂 www.gkket.com

0

主题

87

回帖

138

积分

新手上路

积分
138
发表于 2025-11-21 08:54:38 | 显示全部楼层
楼主太会说了,字字句句都在理
工控课堂 www.gkket.com

0

主题

108

回帖

297

积分

注册会员

积分
297
发表于 2025-11-21 09:07:19 | 显示全部楼层
浅评一下:内容优质,值得推荐~
工控课堂 www.gkket.com

0

主题

152

回帖

383

积分

注册会员

积分
383
发表于 2025-11-21 09:08:31 | 显示全部楼层
水个经验,支持楼主,加油呀
工控课堂 www.gkket.com

0

主题

92

回帖

138

积分

新手上路

积分
138
发表于 2025-11-21 09:11:14 | 显示全部楼层
被戳中笑点 / 泪点,太真实了!
工控课堂 www.gkket.com

0

主题

73

回帖

108

积分

新手上路

积分
108
发表于 2025-11-21 09:11:59 | 显示全部楼层
评论区人才辈出,笑到停不下来😂
工控课堂 www.gkket.com

0

主题

87

回帖

129

积分

新手上路

积分
129
发表于 2025-11-21 09:14:50 | 显示全部楼层
这逻辑绝了,分析得太到位了吧
工控课堂 www.gkket.com

0

主题

77

回帖

147

积分

新手上路

积分
147
发表于 2025-11-21 09:16:24 | 显示全部楼层
同款经历!简直是世另我
工控课堂 www.gkket.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-22 14:05 , Processed in 0.090224 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表