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

关注公众号获取更多干货
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通信灵魂二十问【上】的更多相关文章
- 上位机面试必备——TCP通信灵魂二十问【下】
上篇文章跟大家介绍了TCP通信常见的前10个面试题,没看过的小伙伴可以点击下方链接进行查看: 上位机面试必备——TCP通信灵魂二十问[上] 今天就后面的10个面试题接着做下说明:欢迎关注[dotNet ...
- <转>二十问全链路压测干货汇总(上)
本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...
- java 网络编程之TCP通信和简单的文件上传功能
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- 面渣逆袭:二十二图、八千字、二十问,彻底搞定MyBatis!
大家好,我是老三,面渣逆袭系列继续,这节我们的主角是MyBatis,作为当前国内最流行的ORM框架,是我们这些crud选手最趁手的工具,赶紧来看看面试都会问哪些问题吧. 基础 1.说说什么是MyBat ...
- MIP改造常见问题二十问
在MIP推出后,我们收到了很多站长的疑问和顾虑.我们将所有疑问和顾虑归纳为以下二十个问题,希望对大家理解 MIP 有帮助. 1.MIP 化后对其他搜索引擎抓取收录以及 SEO 的影响如何? 答:在原页 ...
- Python脚本控制的WebDriver 常用操作 <二十六> 上传文件
测试用例场景 上传文件的方法是找到上传文件的对象,通常是的对象.然后直接往这个对象send_keys,传入需要上传文件的正确路径.绝对路径和相对路径都可以,但是上传的文件必须存在,否则会报错. Pyt ...
- awk二十问-【AWK学习之旅】
---===AWK学习之旅===--- 一行命令: 1.打印输入每行的字段总数: 最后一行的字段总数:END{print NF} 每行都显示字段总数: {print NF} 2.打印指定行: aw ...
- 上位机开发之西门子PLC-S7通信实践
写在前面: 就目前而言,在中国的工控市场上,西门子仍然占了很大的份额,因此对于上位机开发而言,经常会存在需要与西门子PLC进行通信的情况.然后对于西门子PLC来说,通信方式有很多,下面简单列举一下: ...
- 【精讲版】上位机C#/.NET与西门子PLC通信
618来啦 亲们,腾讯课堂101机构打榜了,快来助力<新阁教育>,<免费赠送课程>! 1.手机QQ(微信请也来一遍)扫下方二维码↓,找到<新阁教育> 2.点击“支持 ...
随机推荐
- 前端基础进阶(十三):透彻掌握Promise的使用,读这篇就够了
Promise的重要性我认为我没有必要多讲,概括起来说就是必须得掌握,而且还要掌握透彻.这篇文章的开头,主要跟大家分析一下,为什么会有Promise出现. 在实际的使用当中,有非常多的应用场景我们不能 ...
- 3.key的操作
我们之前使用Redis简单存储了三个参数: 在语句set name jack中,其中name就是一个key.我们Java中的变量名是有一定规则的,比如组成内容可以是“数字”,“字母”以及“下划线”. ...
- Java并发编程 (四) 线程安全性
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.线程安全性-原子性-atomic-1 1.线程安全性 定义: 当某个线程访问某个类时,不管运行时环境 ...
- Physic Design:Floorplan算法概览
仅用于学习交流,转载请联系本人. 1 floorplan是什么 floorplan常被翻译成布图规划,是指在芯片级别上对模块进行布局,也就是哪个单元放在什么地方,但是单元内部的具体布局并不关心.该步骤 ...
- Java实现 LeetCode 661 图片平滑器(暴力)
661. 图片平滑器 包含整数的二维矩阵 M 表示一个图片的灰度.你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元 ...
- Java实现 蓝桥杯 算法提高 学霸的迷宫
算法提高 学霸的迷宫 时间限制:1.0s 内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二 ...
- Java实现 LeetCode 543 二叉树的直径
543. 二叉树的直径 给定一棵二叉树,你需要计算它的直径长度.一棵二叉树的直径长度是任意两个结点路径长度中的最大值.这条路径可能穿过根结点. 示例 : 给定二叉树 1 / \ 2 3 / \ 4 5 ...
- Python——day3
看到右边的时钟了吗? 我想世界最公平的一件事就是每个人的每一小时.每一天.每一年都是相同的,每个人的时间都是一样的. 一直保持温热感是一件很了不起的事,加油,屏幕前的你和我. 明天,还在等你 回顾d ...
- cocos2dx 实现遮罩
参考博文:http://blog.csdn.net/myarrow/article/details/19913653 参考博文:http://blog.csdn.net/song_hui_xiang/ ...
- 01-Python初体验
本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...