工控课堂

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

工控课堂 首页 工控文库 工控编程 查看内容

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

2020-6-24 22:50| 发布者: gkket| 查看: 25| 评论: 1|原作者: gkket

摘要: 今天就后面的10个面试题接着做下说明:11四次挥手中的TIME_WAIT状态?首先要明确一点:主动关闭连接的一方,才会有TIME_WAIT状态。之所以需要TIME_WAIT状态,主要是两个原因:防止相同的端口重新连接时,服务器收到 ...

今天就后面的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理解有所帮助。



f89b45b9a12541bd835c93ecc2648a91.jpg

路过

雷人

握手

鲜花

鸡蛋

相关阅读

发表评论

最新评论

马伟明 2020-6-24 23:30
加油,加油,不要沉下去,我是最热贴

查看全部评论(1)

热门文章

QQ|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 || 沪公网安备 31010602005455号 )|网站地图

GMT+8, 2020-7-1 10:12 , Processed in 0.065200 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

返回顶部