关注公众号获取更多干货

TCP通信协议应该是上位机开发中应用最广泛的协议,无论是西门子S7协议、三菱MC协议或者是欧姆龙的Fins-TCP协议等,都是TCP通信协议的典型应用。很多人在上位机面试时,都会被问到关于TCP通信的一些问题,比如三次握手和四次挥手、TCP与Socket之间的联系等,为了便于大家更好地理解TCP通信,我整理了一套关于TCP通信的20个常见的面试题:

01、OSI参考模型与TCP/IP参考模型

如上图所示,OSI参考模型为7层模型,依次为应用层、表示层、会话层、传输层、网络层、数据链路层及物理层,TCP/IP模型是在OSI参考模型的基础上做了一定的精简,形成一个4层模型。在层次关系上,两者都采用了分层体系结构,都是对等的层间通信,不同之处在于TCP/IP参考模型比OSI参考模型层次更清晰简练,在功能上,两者差别不大,都是为了实现两个或多个终端之间的通信。

02、TCP通信位于网络模型的哪一层?

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,无论是OSI参考模型,还是TCP/IP参考模型,TCP都位于传输层,TCP是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。

03、如何理解面向连接、可靠、字节流?

面向连接:意味着TCP是点对点之间的通信,不能像UDP那样可以一个主机同时向多个主机发送消息,也就是无法实现一对多的情形。

可靠的:无论网络链路如何变化,TCP都可以保障报文能够到达接收端。

字节流:基于字节流,意味着无论我们消息有多大都可以进行传输。并且消息是有序的,当前一个消息没有收到的时候,即使它先收到了后面的字节已经收到,那么也不能扔给应用层去处理,同时对重复的报文会自动丢弃。

04、为什么需要TCP协议?

因为IP层是不可靠的,它不保证网络包的一定交付、不保证按序交付、也不保证完整交付。因此如果需要保证网络数据包的可靠性,就必须要通过上层即传输层的TCP协议来保证。

05、TCP与UDP之间区别及联系?

TCP与UDP都属于传输层协议,区别如下:

  • 连接机制

TCP 是面向连接的传输层协议

UDP 是不需要连接

  • 服务对象

TCP 是一对一的两点服务

UDP 支持一对一、一对多、多对多

  • 可靠性

TCP 保证数据不丢失、不重复、按需到达

UDP 是尽最大努力交付,不保证交付数据

  • 拥塞控制、流量控制

TCP 有拥塞控制和流量控制机制

UDP 则没有拥塞控制和流量控制机制

06、TCP首部报文分析

TCP的首部至少占用20个字节,包含的内容有源端口号、目标端口号、序列号、应答号、控制位、校验和等,具体如下所示:

07、简要说明TCP三次握手

  • 服务器与客户端均处于CLOSE状态

  • 服务器先主动监听某端口,处理LISTEN状态

  • 客户端发送SYN报文,seq=x,SYN=1

  • 服务器回复SYN+ACK报文,seq=y,ack=x+1,SYN=1,ACK=1

  • 客户端回复ACK报文,ack=y+1,ACK=1

08、简要说明TCP四次挥手

  • 服务器与客户端均处于ESTABLISHED状态

  • 客户端打算关闭连接,发送一个 FIN 报文,进入 FIN_WAIT_1 状态。

  • 服务端回复 ACK报文,进入 CLOSED_WAIT 状态。

  • 客户端收到 ACK 应答报文后,进入 FIN_WAIT_2 状态。

  • 服务端处理完数据后,向客户端发送 FIN 报文,进入 LAST_ACK 状态。

  • 客户端回复一个 ACK 应答报文,之后进入 TIME_WAIT 状态

  • 服务器收到 ACK 应答报文后,进入了 CLOSE 状态,服务端完成连接的关闭。

  • 客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,客户端也完成连接的关闭。

09、TCP握手为什么刚好是三次?

TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。

不使用「两次握手」和「四次握手」的原因:

两次握手:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;

四次握手:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

10、TCP挥手为什么需要四次?

回顾下四次挥手双方发 FIN 包的过程,就能理解为什么挥手需要四次:

  • 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。

  • 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

由于服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都会分开发送,从而比三次握手导致多了一次。

今日直播

  为了让大家对TCP通信原理有更好的认识,今晚直播课主题《TCP三次握手及四次挥手原理分析》,扫描下方二维码或查看原文,进入后点击下方免费订阅即可。

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

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

    上篇文章跟大家介绍了TCP通信常见的前10个面试题,没看过的小伙伴可以点击下方链接进行查看: 上位机面试必备——TCP通信灵魂二十问[上] 今天就后面的10个面试题接着做下说明:欢迎关注[dotNet ...

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

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

  3. java 网络编程之TCP通信和简单的文件上传功能

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  4. 面渣逆袭:二十二图、八千字、二十问,彻底搞定MyBatis!

    大家好,我是老三,面渣逆袭系列继续,这节我们的主角是MyBatis,作为当前国内最流行的ORM框架,是我们这些crud选手最趁手的工具,赶紧来看看面试都会问哪些问题吧. 基础 1.说说什么是MyBat ...

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

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

  6. Python脚本控制的WebDriver 常用操作 <二十六> 上传文件

    测试用例场景 上传文件的方法是找到上传文件的对象,通常是的对象.然后直接往这个对象send_keys,传入需要上传文件的正确路径.绝对路径和相对路径都可以,但是上传的文件必须存在,否则会报错. Pyt ...

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

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

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

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

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

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

随机推荐

  1. Jenkins在Pod中实现Docker in Docker并用kubectl进行部署

    Jenkins在Pod中实现Docker in Docker并用kubectl进行部署 准备工作 安装Jenkins Jenkins的kubernetes-plugin使用方法 说明 Jenkins的 ...

  2. nacos 配置

    具体请访问 https://nacos.io/zh-cn/docs/what-is-nacos.html 网站查看文档,现在开始使用Nacos. 1. 下载Nacos源码 Nacos可以通过 http ...

  3. fastjson漏洞利用备忘

    预备知识: 起rmi服务 用marshalsec-0.0.3-SNAPSHOT-all.jar起一个rmi服务. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar ...

  4. SpringAOP使用及源码分析(SpringBoot下)

    一.SpringAOP应用 先搭建一个SpringBoot项目 <?xml version="1.0" encoding="UTF-8"?> < ...

  5. 【Java8新特性】关于Java8中的日期时间API,你需要掌握这些!!

    写在前面 Java8之前的日期和时间API,存在一些问题,比如:线程安全的问题,跨年的问题等等.这些问题都在Hava8中的日期和时间API中得到了解决,而且Java8中的日期和时间API更加强大.立志 ...

  6. .net remoting(一)

    一.远程对象 ①RemoteHello.csproj 类库项目,程序集名称 RemoteHello ,默认命名空间 Wrox.ProCSharp.Remoting: ②派生自System.Marssh ...

  7. Chisel3 - Tutorial - Tbl

    https://mp.weixin.qq.com/s/e8vJ8claauBtiuedxYYaJw   实现可以动态索引的表.   参考链接: https://github.com/ucb-bar/c ...

  8. Java实现第九届蓝桥杯测试次数

    测试次数 题目描述 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后 ...

  9. java实现第四届蓝桥杯带分数

    带分数 题目描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一 ...

  10. 【CSS】常用色值

    常用颜色: 嫣红(red):#e54d42 桔橙(orange):#f37b1d 明黄(yellow):#fbbd08 橄榄(olive):#8dc63f 森绿(green):#39b54a 天青(c ...