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

今天就后面的10个面试题接着做下说明:
【上位机面试必备——TCP通信灵魂二十问(下篇)】11
四次挥手中的TIME_WAIT状态?
首先要明确一点:主动关闭连接的一方 , 才会有TIME_WAIT状态 。
之所以需要TIME_WAIT状态 , 主要是两个原因:
防止相同的端口重新连接时 , 服务器收到的是停留在网络间的数据包保证被动关闭连接的一方能被正确的关闭 , 即保证最后的ACK能让被动关闭方接收 , 从而帮助其正常关闭12
为什么TIME_WAIT时间为2MSL?
上位机面试必备——TCP通信灵魂二十问(下篇)
文章图片
MSL是MaximumSegmentLifetime , 报文最大生存时间 , 它是任何报文在网络上存在的最长时间 , 超过这个时间报文将被丢弃 。 比如如果被动关闭方没有收到断开连接的最后的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编程流程
上位机面试必备——TCP通信灵魂二十问(下篇)
文章图片
服务端初始化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理解有所帮助 。


    推荐阅读