科创梦想,节效未来
INEWS / 新闻中心

上位机开发中C#实现文本读取的方法

来源: | 作者:何先生 | 发布时间: 1059天前 | 714 次浏览 | 分享到:

TCP/IP通信协议应该是上位机软件开发中应用最广泛的协议。无论是西门子S7协议,三菱MC协议,还是欧姆龙Fins-TCP协议等。它是TCP通信协议的典型应用。很多人会被问到一些关于TCP通信的问题,比如三次握手和四次波形,TCP和Socket之间的连接等等。为了方便大家更好的理解TCP通信,我整理了一套关于TCP和Socket的常见问题。也方便最近找工作面试的同学。

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

上位机开发——Socket与TCP经典面试题汇总

如上图所示,OSI参考模型是7层模型,依次由应用层、表示层、会话层、传输层、网络层、数据链路层、物理层组成。TCP/IP模型在OSI参考模型的基础上进行一定程度的简化,形成4层模型。在层级关系上,两者都采用分层架构,是对等的层间通信。不同之处在于,TCP/IP参考模型比OSI参考模型更清晰、更简洁。在功能上,两者差别不大,都是为了两个或两个以上终端之间的通信。

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

TCP(传输控制协议)是面向连接的、可靠的和基于字节流的传输层通信协议。无论是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个字节,包括活动端口号、目标端口号、序列号、响应号、控制位、校验和等。,如下图所示:

上位机开发——Socket与TCP经典面试题汇总

07、简单解释一下TCP三次握手。


服务器和客户端都处于关闭状态。服务器主动监控端口,并处理客户端在监听状态下发送的SYN消息。服务器用seq=x,SYN=1,ack=x+1回复SYN+ACK消息。客户端用ack=y+1和ACK=108回复ACK消息。

08、简要解释TCP会波动四次

服务器和客户端都处于已建立状态。客户端打算关闭连接,发送FIN消息并进入FIN_WAIT_1状态。回复来自服务器的ACK消息,进入CLOSED_WAIT状态。收到ACK响应消息后,客户端进入FIN_WAIT_2状态。处理完数据后,服务器向客户端发送FIN消息,进入LAST_ACK状态。客户端回复ACK响应消息,然后进入TIME_WAIT状态。收到ACK响应消息后,服务器进入关闭状态,服务器完成连接关闭。经过2MSL的时间,客户端自动进入关闭状态,客户端完成连接的关闭。

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

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

不使用“双向握手”和“四向握手”的原因:

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

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

10、为什么TCP会四次波动?

回顾下四波双方发鳍包的过程,就能明白为什么要四波了:

当连接关闭,客户端向服务器发送FIN时,只意味着客户端可以接收数据但不再发送数据。当服务器从客户端接收到FIN消息时,它首先返回ACK响应消息,而服务器可能仍然有数据要处理和发送。当服务器不再发送数据时,它向客户机发送FIN消息,表示它同意现在关闭连接。因为服务器通常需要等待数据的发送和处理,所以服务器的ACK和FIN通常是分开发送的,这就导致比三次握手多了一次。

11、四波中的TIME_WAIT状态?

首先明确一点:主动关闭连接的一方会有TIME_WAIT状态。

需要TIME_WAIT状态有两个主要原因:

为了防止同一个端口重新连接,服务器接收停留在网络之间的数据包,以确保被动关闭连接的一方可以正确关闭,也就是说,被动关闭方可以接收到最后一个ACK,从而帮助它正常关闭。

12、为什么TIME_WAIT time是2MSL?

MSL是最大数据段生存期,即最大消息生存期,它是任何消息在网络上存在的最长时间。过了这段时间,该消息将被丢弃。比如被动关闭方没有收到最后一条断开的ACK报文,就会触发FIN报文超时重传。另一方收到FIN后,会向被动关闭方重新发送ACK,正好需要两个MSL才能到达。

2MSL 2的时间从客户端收到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是什么关系?

网络有一个关于套接字和TCP/IP协议之间关系的陈述,很容易理解:

TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须具体实现,同时要提供对外的操作接口。就像操作系统会提供一个标准的编程接口,比如Win32编程接口,TCP/IP也应该提供一个接口给程序员做网络开发,这就是Socket编程接口。

因此,套接字与TCP/IP没有必然联系,套接字编程接口是为了适应其他网络协议而设计的。Socket的出现只是让使用TCP/IP协议栈变得更容易。它对TCP/IP进行了抽象,形成了一些基本的功能接口,如发送、监听。

16、什么是SYN攻击?

我们都知道TCP连接的建立需要三次握手。假设攻击者在短时间内伪造了不同IP地址的SYN报文,服务器每次收到SVN报文都会进入SYN_RCVD状态。而服务器发送的ACK+SYN报文无法得到未知IP主机的ACK响应,久而久之就会填满服务器的SYN接收队列(未连接队列),使服务器无法服务正常用户。

17、如何避免SYN攻击?

两种避免SYN攻击的方案:

通过修改内核参数,控制队列大小,并确定当队列已满时该做什么。比如队列满了之后,直接回复新的SYN,丢弃连接。当SYN队列已满时,后续收到的SYN并不直接进入SYN队列,而是先计算Cookie值再发送,以便后面验证ACK包的合法性。

18、服务器的TCP Socket编程流程

上位机开发——Socket与TCP经典面试题汇总

初始化服务器套接字,获取文件描述符,由服务器调用Bind,由绑定到IP地址和端口的服务器调用Listen,由监控服务器调用Accept,建立客户端连接,通过Send向客户端发送消息,通过Receive从客户端接收消息。

19、客户端TCP套接字编程过程

初始化客户端的套接字并获取文件描述符。客户端调用Connect,连接服务器成功调用Send向客户端发送消息,并通过Receive接收客户端消息20。

Listen中backlog参数的意义是什么?

Linux内核中维护着两个队列:

不完整连接队列(SYN Queue):收到一个SYN连接请求,处于SYN_RCVD状态;

已完成连接队列(Accpet queue): TCP三次握手过程已完成,处于已建立状态;

内核2.2以后,backlog变成了接受队列,也就是已经建立连接的队列的长度,所以现在一般认为是接受队列。

免责声明:本网站内容来源网络,转载是出于传递更多信息之目的,并不意味赞成其观点或证实其内容真实性。转载稿涉及版权等问题,请立即联系网站编辑,我们会予以更改或删除相关文章,保证您的权利。