关注公众号获取更多干货

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. C#中方法的静态和非静态

    在代码中,给方法加上static就成为了一个静态的方法,然而静态方法是隶属于类的,由类名点出来! 不给方法加static就是一个非静态方法,非静态的方法,是隶属于对象的,需要把类实例化之后,用对象名去 ...

  2. Android_适配器(adapter)之BaseAdapter

    BaseAdapter是应用最多的一种适配了.它是一个抽象类,需要重写方法完成自定义适配器的功能,这就比较自由灵活,能实现各种想要的效果. 之前讲到的SimpleAdapter和ArrayAdapte ...

  3. Spring boot Sample 004之spring-boot-configuration-yaml

    一.环境 1.1.Idea 2020.1 1.2.JDK 1.8 二.目的 通过yaml文件配置spring boot 属性文件 三.步骤 3.1.点击File -> New Project - ...

  4. Spring ( 二 ) IOC 依赖注入

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.什么是IOC IOC 全称指的是 Inverse Of Control 控制反转. 原来我们使用Sp ...

  5. Java实现第八届蓝桥杯国赛 数字划分

    标题:数字划分 w星球的长老交给小明一个任务: 1,2,3-16 这16个数字分为两组. 要求: 这两组数字的和相同, 并且,两组数字的平方和也相同, 并且,两组数字的立方和也相同. 请你利用计算机的 ...

  6. Java实现 LeetCode 706 设计哈希映射(数组+链表)

    706. 设计哈希映射 不使用任何内建的哈希表库设计一个哈希映射 具体地说,你的设计应该包含以下的功能 put(key, value):向哈希映射中插入(键,值)的数值对.如果键对应的值已经存在,更新 ...

  7. Java实现 LeetCode 581 最短无序连续子数组(从两遍搜索找两个指针)

    581. 最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: ...

  8. Java实现 LeetCode 202 快乐数

    202. 快乐数 编写一个算法来判断一个数是不是"快乐数". 一个"快乐数"定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过 ...

  9. Java实现 洛谷 P1103 书本整理

    题目描述 Frank是一个非常喜爱整洁的人.他有一大堆书和一个书架,想要把书放在书架上.书架可以放下所有的书,所以Frank首先将书按高度顺序排列在书架上.但是Frank发现,由于很多书的宽度不同,所 ...

  10. 第三届蓝桥杯JavaB组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.数量周期 [结果填空](满分9分) 复杂现象背后的推动力,可能是极其简单的原理.科学的目标之一就是发现纷繁复杂的自然现象背后的简单法则 ...