上篇文章跟大家介绍了TCP通信常见的前10个面试题,没看过的小伙伴可以点击下方链接进行查看:
今天就后面的10个面试题接着做下说明:欢迎关注【dotNet工控上位机】公众号:thinger_swj
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理解有所帮助。
今日直播
为了让大家对TCP通信原理有更好的认识,今晚直播课主题《西门子S7协议抓包分析及应用》,扫描下方二维码或查看原文,进入后点击下方免费订阅即可。