上篇文章跟大家介绍了TCP通信常见的前10个面试题,没看过的小伙伴可以点击下方链接进行查看:

上位机面试必备——TCP通信灵魂二十问【上】

今天就后面的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协议抓包分析及应用》,扫描下方二维码或查看原文,进入后点击下方免费订阅即可。

上位机面试必备——TCP通信灵魂二十问【下】的更多相关文章

  1. 上位机面试必备——TCP通信灵魂二十问【上】

    关注公众号获取更多干货 TCP通信协议应该是上位机开发中应用最广泛的协议,无论是西门子S7协议.三菱MC协议或者是欧姆龙的Fins-TCP协议等,都是TCP通信协议的典型应用.很多人在上位机面试时,都 ...

  2. <转>二十问全链路压测干货汇总(上)

    本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...

  3. MIP改造常见问题二十问

    在MIP推出后,我们收到了很多站长的疑问和顾虑.我们将所有疑问和顾虑归纳为以下二十个问题,希望对大家理解 MIP 有帮助. 1.MIP 化后对其他搜索引擎抓取收录以及 SEO 的影响如何? 答:在原页 ...

  4. awk二十问-【AWK学习之旅】

    ---===AWK学习之旅===--- 一行命令: 1.打印输入每行的字段总数: 最后一行的字段总数:END{print NF} 每行都显示字段总数: {print NF}   2.打印指定行: aw ...

  5. 上位机开发之西门子PLC-S7通信实践

    写在前面: 就目前而言,在中国的工控市场上,西门子仍然占了很大的份额,因此对于上位机开发而言,经常会存在需要与西门子PLC进行通信的情况.然后对于西门子PLC来说,通信方式有很多,下面简单列举一下: ...

  6. 【精讲版】上位机C#/.NET与西门子PLC通信

    618来啦 亲们,腾讯课堂101机构打榜了,快来助力<新阁教育>,<免费赠送课程>! 1.手机QQ(微信请也来一遍)扫下方二维码↓,找到<新阁教育> 2.点击“支持 ...

  7. 【安富莱原创开源应用第1期】花式玩转网络摄像头之TCP上位机软件实现,高端大气上档次,速度2MB/S,华丽丽的界面效果

    说明:1.例子是两年前做的,一直没有顾上整理出来,今天特地整理出来,开源出来给大家玩.2.上位机是emWin模拟器开发的,大家估计很难猜到,所以你会emWin话的,就可以轻松制作上位机.做些通信和控制 ...

  8. 上位机开发之三菱Q系列PLC通信实践

    经常关注我们公众号或者公开课的学员(如果还没有关注的话,左上角点击一波关注)应该知道,我们会经常使用西门子PLC,其实对于其他品牌的PLC,我们都会讲到,包括三菱.欧姆龙.基恩士.松下及国产台达.信捷 ...

  9. 【专题教程第8期】基于emWin模拟器的USB BULK上位机开发,仅需C即可,简单易实现

    说明:1.如果你会emWin话的,就可以轻松制作上位机.做些通信和控制类上位机,比使用C#之类的方便程度一点不差,而且你仅会C语言就可以.2.并且成功将emWin人性化,可以做些Windows系统上的 ...

随机推荐

  1. Ajax的load方法演示

    load方法的参数形式为: load(url,[data],[callback]); 其中url为请求HTML页面的URL地址.[data]表示发送至服务器的key/value数据.callback表 ...

  2. Android JSON,Gson,fastjson实现比较

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  3. 常用html元素的取值和赋值方法总结

    1.获得type类型为TEXT或者AREATEXT的值 var textval = $("#text_id").attr("value"); var textv ...

  4. android activity中监听View测量完成的4种方式

    在开发中经常碰到需要在activity初始化完成后获得控件大小的情况. 但是这个操作我们不能在oncreate.onresume等生命周期方法中调用,因为我们不知道何时view才能初始化完成 为此,特 ...

  5. 外部IIS/Apache/Nginx来代理FMS的http服务

    默认FMS在安装的时候,会安装Apache2.2,并监听8134端口,代理http服务器:当如也可以用外部的服务器,此时建立站点,并指向目录:C:\Program Files\Adobe\Flash ...

  6. 小甲鱼OD学习第6讲

    这次我们的任务是破解这个通讯录的软件,首先,我们在通讯录一个分组添加第5个人,发现弹出对话框,限制每组只能添加4个人 并且发现最多只能添加3个分组 我们把程序载入OD,运行,添加人,这个时候点击暂停, ...

  7. 【centos7】 Failed to start LSB Bring up/down

    今天碰到几个问题: 1. Failed to start LSB Bring up/down 归结一下 百度 的答案: 1). 90% 修改MAC 地址 2).10% 重启 networkmanage ...

  8. Confluence 6 嵌入的 H2 数据库

    为了让你的 Confluence 在安装成功后就可以使用而不需要使用任何外部的数据库,Confluence 使用一个嵌入的 H2 数据库. 当你选择对 Confluence 进行评估和测试的时候,H2 ...

  9. [Automation] 自动化测试工具和测试框架大集合

    8 Open Source Test Automation Tools for Desktop Applications written in WinForms/ WPF: Tool Comment ...

  10. AndroidStudio生成自己的Compile依赖

    在AndroidStudio中经常使用compile的方式来导入第三方代码,如图所示: 想要拥有自己的依赖,可参考本篇的方法 在github上托管一个带有Android Libray的项目,我们要co ...