一个连接命名管道道可以被多个客户端连接么

(1)面向连接:采用C/S模型

①流量控制:解决接收方不能不及时处理数据的问题

②拥塞控制:解决因网络通信延迟带来的数据丢失问题

③差错控制:解决数据被破坏、重复、时序和丢失的问题

3.为什么TCP连接需要三次握手,两次不可以吗?为什么?

(1)建立连接时,客户端发送SYN(SYN=j)包到服务器,并进入SYN_SEND状态,等待服务器响应、、确认

(2)服务器收到SYN包,必须确认客户端的SYN(ACK=j+1),同时自己也发送一个SYN包,即SYN+ACK包此时服务器进入SYN_RECV状态

(3)客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕客户端和服务器端进入ESTABLISHED状态,完成三次握手

为了保证服务端能收到客户端的信息并能做出正确的响应而进行前两次握手,为了保证客户端能够收到服务端的信息并能做出正确的响应而进行后两次响应

代理服务器有很多种,大体分为三类:HTTP、FTP、SOCKS,其中又分为透明代理和不透明代理,透明代理一般是网关,为硬件

(1)客户端先和代理服务器通讯,建立TCP连接,目的IP是代理服务器的IP

(2)客户端发出GET命令,GET命令中包含URL或IP地址、明文

(3)代理服务器将其中的URL转换为IP地址,可能会有DNS,将源数据包中的数据拷贝下来,去掉URL,重新组包再发出去

(4)代理服务器和真实服务器通讯,源IP是代理服务器的IP

5、TCP和UDP分别有什么优缺点

TCP的可靠体现在TCP在传输数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完之后,还会断开连接用来节约系统资源

缺点:慢,效率低,占用系统资源高,易被攻击

在传递数据之前要先建立连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞机制等都会消耗大量时间,而且要在每台设备上维护所有的传输连接。然而,每个链接都会占用系统的CPU、内存等硬件资源。因为TCP有确认机制、三次握手机制,这些也导致TCP容易被利用,实现DOS、DDOS、CC等攻击

优点:快,比TCP稍安全

UDPm没有TCP拥有的各种机制,是一个无状态的传输协议,所以传递数据非常快,没有TCP的这些机制,被攻击利用的机制就少一些,但是也无法避免被攻击

因为没有TCP的那些机制,UDP在传输数据时,如果网络质量不好,就会很容易丢包,造成数据的缺失

TCP:当对网络通讯质量有要求时,比如HTTP、HTTPS、FTP等传输文件的协议, POP、SMTP等邮件传输的协议

UDP:对网络通讯质量要求不高时,要求网络通讯速度要快的场景

6、面向对象和面向过程的区别

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就行。

面向对象是把构成问题事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。面向对象是以功能来划分问题,而不是步骤

7、HTTP请求的过程与原理

HTTP是一种无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。HTTP遵循请求/应答模型

(2)Web浏览器向Web服务器发送请求命令

(3)Web浏览器发送请求头信息

(5)Web服务器发送应答头信息

(6)Web服务器向浏览器发送数据

HTTP的长连接与短连接:

在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接,在服务端不保留连接的有关信息。

从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

建立连接----数据传输-----关闭连接。。。建立连接-----数据传输----关闭连接

建立连接---数据传输。。(保持连接)。。数据传输---关闭连接

长连接和短连接的优点和缺点

长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。但是会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某一个客户端连累后端服务。

短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

8、常见HTTP状态码

成功的状态码(基本以2开头):这一类型的状态码,代表请求已成功被服务器接收、理解、并接受

200--请求已成功,请求所希望的响应头或数据体将随此响应返回

202--服务器已接受请求,但尚未处理

205--服务器成功处理了请求,且没有返回任何内容

内容被重定向(基本以3开头):需要客户端采取进一步的操作才能完成请求

301--被请求的资源已永久移动到新位置

302--请求的资源临时从不同的 URI响应请求

303--对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源

305--被请求的资源必须通过指定的代理才能被访问

307--请求的资源临时从不同的URI 响应请求

请求失败的状态码(基本以4开头):

400--语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求或者请求参数有误

401--当前请求需要用户验证

403--服务器已经理解请求,但是拒绝执行

404--请求的网页不存在

405--请求行中指定的请求方法不能被用于请求相应的资源

服务器端的错误(基本以5开头):了服务器在处理请求的过程中有错误或者异常状态发生

500--服务器内部错误

503--服务器暂时不可用

进程死锁,它是操作系统或系统软件运行的一种状态:在多任务系统下,当一个或多个进程等待系统资源,而资源又被进程本身或其他进程占用时,就形成了死锁

②进程运行推进的顺序不合适

产生死锁的四个必要条件:

①互斥条件:一个资源每次只能被一个进程使用

②请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放

③不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺

④循环等待条件:若干进程之间形成一种头尾相连的循环等待资源关系

①进行系统的重新启动(最简单粗暴)

银行家算法是一种最有代表性的避免死锁的算法

我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

在被动关闭连接的情况下,在已经接收到FIN,但是还没有发送自己FIN的时刻,连接处于close_wait状态。通常来讲,close_wait状态持续的时间应该很短,如SYN_RECV状态,但是在一些特殊情况下,就会出现连接长时间处于close_wait状态的情况。出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket连接,但是我方忙于读或者写。没有关闭连接,代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。

主动关闭的socket端会进入此状态,并且持续2MSL(最大分节生命期)时间长度,这是一个IP数据包能在互联网上生存的最长时间,超过这个时间将在网络消失。

a:可靠的实现TCP全双工连接的终止

b:允许老的重复分节在网络中消失

管道、消息队列、共享内存(速度最快)、信号量、文件映射、匿名/命名管道

本文永久更新链接地址


}

主要从事一些机械自动化和电气化领域的设计和现场制造经验,希望能够和各位网友交流技术 ,分享经验谢谢大家。

}

      管道是一种两个进程间进行单向通信的机制 管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。管道又分为匿名管道和命名管道。管道有如下特质

(1)其本质是一个伪文件(实为内核缓冲区)

(2) 由两个文件描述符引用,一个表示读端,一个表示写端。

(3) 规定数据从管道的写端流入管道,从读端流出。

(1)只能进行单向通信;

(2)只适用于有血缘关系之间的进程;

(4)在进行通信时面向字节流服务;

(5)生命进程随周期。

     管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。

     因为管道传递数据的单向性,管道又称为半双工管道。管道的这一特点决定了器使用的局限性。

① 数据自己读不能自己写。

② 数据一旦被读走,便不在管道中存在,不可反复读取。

③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。

④ 只能在有公共祖先的进程间使用管道。

常见的通信方式有,单工通信、半双工通信、全双工通信。

函数调用成功返回r/w两个文件描述符。无需open,但需手动close。规定:fd[0] → r; fd[1] → w,就像0对应标准输入,1对应标准输出一样。向管道文件读写数据其实是在读写内核缓冲区。

管道创建成功以后,创建该管道的进程(父进程)同时掌握着管道的读端和写端。如何实现父子进程间通信呢?通常可以采用如下步骤:

1. 父进程调用pipe函数创建管道,得到两个文件描述符fd[0]、fd[1]指向管道的读端和写端。

2. 父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。

3. 父进程关闭管道读端,子进程关闭管道写端。父进程可以向管道中写入数据,子进程将管道中的数据读出。由于管道是利用环形队列实现的,数据从写端流入管道,从读端流出,这样就实现了进程间通信。

  使用管道需要注意以下4种特殊情况(假设都是阻塞I/O操作,没有设置O_NONBLOCK标志):

1. 如果所有指向管道写端的文件描述符都关闭了(管道写端引用计数为0),而仍然有进程从管道的读端读数据,那么管道中剩余的数据都被读取后,再次read会返回0,就像读到文件末尾一样。

2. 如果有指向管道写端的文件描述符没关闭(管道写端引用计数大于0),而持有管道写端的进程也没有向管道中写数据,这时有进程从管道读端读数据,那么管道中剩余的数据都被读取后,再次read会阻塞,直到管道中有数据可读了才读取数据并返回。

3. 如果所有指向管道读端的文件描述符都关闭了(管道读端引用计数为0),这时有进程向管道的写端write,那么该进程会收到信号SIGPIPE,通常会导致进程异常终止。当然也可以对SIGPIPE信号实施捕捉,不终止进程。具体方法信号章节详细介绍。

4. 如果有指向管道读端的文件描述符没关闭(管道读端引用计数大于0),而持有管道读端的进程也没有从管道中读数据,这时有进程向管道写端写数据,那么在管道被写满时再次write会阻塞,直到管道中有空位置了才写入数据并返回。

1. 管道中有数据,read返回实际读到的字节数。

(1) 管道写端被全部关闭,read返回0 (好像读到文件结尾)

(2) 写端没有全部被关闭,read阻塞等待(不久的将来可能有数据递达,此时会让出cpu)

1. 管道读端全部被关闭, 进程异常终止(也可使用捕捉SIGPIPE信号,使进程不终止)

2. 管道读端没有全部关闭:

(2) 管道未满,write将数据写入,并返回实际写入的字节数。


命名管道(FIFO):

 FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。命名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。值得注意的是,FIFO(first input first output)总是按照先进先出的原则工作,第一个被写入的数据将首先从管道中读出。

命名管道是通过网络来完成进程之间的通信的,命名管道依赖于底层网络接口,其中包括有 DNS 服务,TCP/IP 协

议 等等机制,但是其屏蔽了底层的网络协议细节。

Linux下有两种?式创建命名管道。一是在Shell下交互地建立一个命名管道,一是在程序中使用系统函数建立命名管

道。Shell方式下可使用mknodmkfifo命令,下面命令使用mknod创建了一个命名管道:

创建命名管道的系统函数有两个:mknodmkfifo。两个函数均定义在头文件sys/stat.h

函数mknod参数中path为创建的命名管道的全路径名:mod为创建的命名管道的模式,指明其存取权限dev为设

备值,该值取决于文件创建的种类,它只在创建设备文件时才会用到。这两个函数调用成功都返回0,失败都返回

这两个函数都能创建一个FIFO文件,注意是创建一个真实存在于文件系统中的文件,filename指定了文件名,

mode则指定了文件的读写权限。mknod是比较老的函数,而使用mkfifo函数更加简单和规范,所以建议在可能的

情况下,尽量使用mkfifo而不是mknod

mkfifo函数的作用是在文件系统中创建一个文件,该文件用于提供FIFO功能,即命名管道。前边讲的那些管道都没有

名字,因此它们被称为匿名管道,或简称管道。对文件系统来说,匿名管道是不可见的,它的作用仅限于在父进程和

子进程两个进程间进行通信。而命名管道是一个可见的文件,因此,它可以用于任何两个进程之间的通信,不管这两

个进程是不是父子进程,也不管这两个进程之间有没有关系。 

    下面就用一个例子程序来说明一下,两个进程如何通过FIFO实现通信吧。这里有两个源文件,一个fifo write.c,它在需要时创建管道,然后向管道写入数据,数据由文件Data.txt提供,大小为10M,内容全是字符‘0’。另一个源文件为fifo read.c,它从FIFO中读取数据,并把读到的数据保存到另一个文件DataFormFIFO.txt中。为了让程序更加简洁,忽略了有些函数调用是否成功的检查。


}

我要回帖

更多关于 连接命名管道 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信