物理层就是把电脑连接起来的物理手段。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。先把电脑连起来,可以用光缆、电缆、双绞线、无线电波等方式。 单纯的0和1没有任何意义,必须规定解读方式:多少个电信号算一组?每个信号位有何意义?这就是"链接层"的功能,它在"实体层"的上方,确定了0和1的分组方式。 1.Physical 物理层。它在物理线路上传输 bit 信息,处理与物理介质有关的机械的,电气的,功能的和规程的特性。它是硬件连接的接口。 2.Data Link 数据链路层。它负责实现通信信道的无差错传输,提供数据成帧,差错控制,流量控制和链路控制等功能。 3.NetWork 网络层。负责将数据正确迅速的从源点主机传送到目的点主机,其功能主要有寻址以及与相关的流量控制和拥塞控制等。物理层,数据链路层和网络层构成了通信子网层。通讯子网层与硬件的关系密切,它为网络的上层(资源子网)提供通讯服务。 4.Transport 传输层。为上层处理过程掩盖下层结构的细节,保证把会话层的信息有效的传到另一方的会话层。 5.Session 会话层。它提供服务请求者和提供者之间的通讯,用以实现两端主机之间的会话管理,传输同步和活动管理等。 6.Presentation 表示层。它的主要功能是实现信息转换,包括信息压缩,加密,代码转换及上述操作的逆操作等。 7.Application 应用层。它为用户提供常用的应用,如电子邮件,文件传输,Web 浏览等等。 OSI 模型并不是一个网络结构,因为它并没有定义每个层所拥有的具体的服务和协议,它只是告诉我们每一个层应该做什么工作。但是,ISO 为所有的层次提
供了标准,每个标准都有其自己的内部标准定义。
第三层是网络层,它包含四个协议:IP,ICMP,ARP 和反向 ARP。最高层包含了 FTP,TELNET,SMTP,DNS,HTTP 等协议。 网络层的主要功能由互连网协议(IP)提供,它提供端到端的分组分发,表示网络号及主机结点的地址,数据分块和重组;并为相互独立的局域网建立互连网络的服务 A 类地址 其 W 的高端位为 0,允许有 126 个 A 类地址,分配给拥有大量主机的网络。 B 类地址 由 W.X 表示网络 ID,其高端前二位为二进制的 10,它用于分配中等规模的网络,可有 16384 个 B 类地址。 C 类地址 其高端前三位为二进制 110,允许大约 200 万个 C 类地址,每个网络只有 254 个主机,用于小型的局域网。 以太网规定,一组电信号构成一个数据包,叫做"帧"(Frame)。每一帧分成两个部分:标头(Head)和数据(Data)。 "标头"包含数据包的一些说明项,比如发送者、接受者、数据类型等等;"数据"则是数据包的具体内容。"标头"的长度,固定为18字节。"数据"的长度,最短为46字节,最长为1500字节。因此,整个"帧"最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送。 教材上把ARP协议划到网络层,是因为ARP协议属于TCP/IP协议簇。在TCP/IP模型中,它所有定义的协议是在网际层上的。 原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据包套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。 Socket可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定与网络驱动建立关系。此后,应用程序送给Socket的数据,由Socket交给网络驱动程序向网络上发送出去。计算机从网络上收到与该Socket绑定IP地址和端口号相关的数据后,由网络驱动程序交给Socket,应用程序便可从该Socket中提取接收到的数据,网络应用程序就是这样通过Socket进行数据的发送与接收的。 ZMQ这是个类似于 Socket 的一系列接口,他跟 Socket 的区别是:普通的 socket 是端到端的(1:1的关系),而 ZMQ 却是可以N:M 的关系,人们对 BSD 套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而 ZMQ 屏蔽了这些细节,让你的网络编程更为简单。ZMQ 用于 node 与 node 间的通信,node 可以是主机或者是进程。 ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ 并不像是一个传统意义上的消息队列服务器,事实上,它也根本不是一个服务器,它更像是一个底层的网络通讯库,在 Socket API 之上做了一层封装,将网络通讯、进程通讯和线程通讯抽象为统一的 API 接口。 ZMQ 不仅能通过 TCP 完成节点间的通信,也可以通过 Socket 文件完成进程间的通信。 只有UDP才有广播、组播的传递方式;而TCP是一对一连接通信。多播的重点是高效的把同一个包尽可能多的发送到不同的,甚至可能是未知的设备。但是TCP连接是一对一明确的,只能单播。 组播就是只在必要的时候才复制数据保,从而来节省带宽,因而多数用于UDP IGMP是IP组播的基础。在IP协议出现以后为了加入对组播的支持,IGMP产生了。IGMP所做的实际上就是告诉路由器,在这个路由器所在的子网内有人对发送到某一个组播组的数据感兴趣,这样当这个组播组的数据到达后面,路由器就不会抛弃它,而是把他转送给所有感兴趣的客户。假如不同子网内的A和B要 进行组播通信,那么位于AB之间的所有路由器必须都要支持IGMP协议,否则AB之间不能进行通信。 i n t e r n e t意思是用一个共同的协议族把多个网络连接在一起。而 I n t e r n e t指的是世界范围内通过T C P / I P互相通信的所有主机集合(超过 1 0 0万台)。I n t e r n e t是一个i n t e r n e t,但i n t e r n e t不等于I n t e r n e t。
单播(Unicast)传输:在发送者和每一接收者之间实现点对点网络连接。如果一台发送者同时给多个的接收者传输相同的数据,也必须相应的复制多份的相同数据包。如果有大量主机希望获得数据包的同一份拷贝时,将导致发送者负担沉重、延迟长、网络拥塞;为保证一定的服务质量需增加硬件和带宽。
广播(Broadcast)传输:是指在IP子网内广播数据包,所有在子网内部的主机都将收到这些数据包。广播意味着网络向子网每一个主机都投递一份数据包,不论这些主机是否乐于接收该数据包。所以广播的使用范围非常小,只在本地子网内有效,通过路由器和网络设备控制广播传输。
组播解决了单播和广播方式效率低的问题。当网络中的某些用户需求特定信息时,组播源(即组播信息发送者)仅发送一次信息,组播路由器借助组播路由协议为组播数据包建立树型路由,被传递的信息在尽可能远的分叉路口才开始复制和分发。
在组播方式中,信息的发送者称为“组播源”,信息接收者称为该信息的“组播组”,支持组播信息传输的所有路由器称为“组播路由器”。加入同一组播组的接收者成员可以广泛分布在网络中的任何地方,即“组播组”没有地域限制。需要注意的是,组播源不一定属于组播组,它向组播组发送数据,自己不一定是接收者。多个组播源可以同时向一个组播组发送报文。
假设只有 Host B、Host D 和Host E 需要信息,采用组播方式时,可以让这些主机加入同一个组播组(Multicast group),组播源向该组播组只需发送一份信息,并由网络中各路由器根据该组播组中各成员的分布情况对该信息进行复制和转发,最后该信息会准确地发送给Host B、Host D 和Host E。
协议层常需要和组群打交道,进行发现、通知、查询等工作。IP用组播IP地址在第三层组播,一个multicast IP address 可以有多个成员,组播数据包会被IP层路由器转发到组群成员所在的路由器,然后用以太网的组播功能把数据包送到组播成员的网卡接口。
以太网具有广播属性,一个节点发送的数据包会被以太网泛洪,导致每一个以太网网卡接口都会收到这个数据包。接口收到数据包后,并不马上交给节点CPU处理,而是进行MAC地址比较,如果数据包的目的MAC地址和接口的MAC地址一样,它才接受,把数据包交给计算机,否则就把数据包丢弃。组群成员的网卡接口除了硬件MAC地址 (unicast MAC),还有组播MAC地址 (multicast MAC)。接口收到组播包,会把此包的目的MAC地址 (是个组播MAC)和自己的MAC地址比较,如果组播地址相同,就会接受此包。这样,局网内这个组群的所有成员,都会收到送往该组群的组播包。
组播报文的目的地址使用D类IP地址, D类地址不能出现在IP报文的源IP地址字段。单播数据传输过程中,一个数据包传输的路径是从源地址路由到目的地址,利用“逐跳”的原理在IP网络中传输。然而在ip组播环中,数据包的目的地址不是一个,而是一组,形成组地址。所有的信息接收者都加入到一个组内,并且一旦加入之后,流向组地址的数据立即开始向接收者传输,组中的所有成员都能接收到数据包。组播组中的成员是动态的,主机可以在任何时刻加入和离开组播组。
使用套接字进行数据处理有两种基本模式:同步和异步。
同步模式:
同步模式的特点是在通过Socket进行连接、接收、发送数据时,客户机和服务器在接收到对方响应前会处于阻塞状态,即一直等到收到对方请求才继续执行下面的语句。可见,同步模式只适用于数据处理不太多的场合。当程序执行的任务很多时,长时间的等待可能会让用户无法忍受。
异步模式:
异步模式的特点是在通过Socket进行连接、接收、发送操作时,客户机或服务器不会处于阻塞方式,而是利用callback机制进行连接、接收、发送处理,这样就可以在调用发送或接收的方法后直接返回,并继续执行下面的程序。可见,异步套接字特别适用于进行大量数据处理的场合。
目录就是由 inode 所组成的特殊文件 $ls | wc –ll 这个命令就会使 shell 建立两个进程,以并发运行命令 ls 和 wc,把目录列表命令 ls 的输出通过管道送至字计数命令 wc。 exit()除了停止进程的运行外,它还有一些其它作用,其中最重要的是,它将关闭所有已打开的文件。如果父进程因执行了 wait()调用而处于睡眠状态,那么子进程执行 exit()会
重新启动父进程运行。另外,exit()还将完成一些系统内部的清除工作,例如缓冲区的清除工作等。
系统给每个进程定义了一个标识该进程的非负正数,称作进程标识符。当某一进程终止后,其标识符可以重新用作另一进程的标识符。不过,在任何时刻,一个标识符所代表
的进程是唯一的。系统把标识符 0 和 1 保留给系统的两个重要进程。进程 0 是调度进程,它按一定的原则把处理机分配给进程使用。进程 1 是初始化进程,它是程序/sbin/init 的执
行。进程 1 是 UNIX 系统那其它进程的祖先,并且是进程结构的最终控制者。
系统以整型变量 nice 为基础,来决定一个特定进程可得到的 CPU 时间的比例。nice 之值从 0 至其最大值。我们把 nice 值称为进程的优先数。进程的优先数越大,其优先权就越
低。普通进程可以使用系统调用 nice()来降低它的优先权,以把更多的资源分给其它进程。具体的做法是给系统调用 nice 的参数定一个正数,nice()调用将其加到当前的 nice 值上。
为什么需要有独立于终端之外的进程呢?首先,处于安全性的考虑我们不希望这些进程在执行中的信息在任何一个终端上显示。其次,我们也不希望这些进程被终端所产生的
中断信号所打断。最后,虽然我们可以通过&将程序转为后台执行,我们有时也会需要程序能够自动将其转入后台执行。因此,我们需要守护进程。
守护进程建立: 1.fork 首先需要 fork 一个子进程并将父进程关闭。如果进程是作为一个 shell 命令在命令行上前台启动的,当父进程终止时,shell 就认为该命令已经结束。这样子进程就自动称为了后
台进程。而且,子进程从父进程那里继承了组标识符同时又拥有了自己的进程标识符,这样保证了子进程不会是一个进程组的首进程。这一点是下一步 setsid 所必须的。
2.setsid
setsid()调用创建了一个新的进程组,调用进程成为了该进程组的首进程。这样,就使该进程脱离了原来的终端,成为了独立于终端外的进程。
3.忽略 SIGHUP 信号,重新 fork
这样使进程不在是进程组的首进程,可以防止在某些情况下进程意外的打开终端而重新与终端发生联系。
4.改变工作目录,清除文件掩码
改变工作目录主要是为了切断进程与原有文件系统的联系。并且保证无论从什么地方启动进程都能正常的工作。清除文件掩码是为了消除进程自身掩码对其创建文件的影响。
5.关闭全部已打开的文件句柄
这是为了防止子进程继承了在父进程中打开的文件而使这些文件始终保持打开从而产生某些冲突。
6.打开 log 系统
以上就是建立一个守护进程的基本步骤。当然,一个实际的守护进程要比这个例子复杂许多,但是万变不离其宗,原理都是相同的。通过上面几步,我们可以正确的建立自己的守护进程
管道就是将一个程序的输出和另外一个程序的输入连接起来的单向通道。当进程创建一个管道的时候,系统内核同时为该进程设立了一对文件句柄(一个流),
一个用来从该管道获取数据(read),另一个则用来做向管道的输出(write)。进程通过句柄 fd[0]向管道写入(write)数据,同时通过 fd[1]从管道读出(read)数据。
相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。 传输控制协议(TCP)和用户数据报文协议(UDP) Internet 协议(IP)。该协议被设计成互联分组交换通信网,以形成一个网际通信环境。它负责在源主机和目的地主机之间传输来自其较高层软件的称为数据报文的数据块,它在源和目的地之间提供非连接型传递服务。 网际控制报文协议(ICMP)。它实际上不是 IP 层部分,但直接同 IP 层一起工作,报告网络上的某些出错情况。允许网际路由器传输差错信息或测试报文。 地址识别协议(ARP)。ARP实际上不是网络层部分,它处于IP和数据链路层之间,它是在32位IP地址和48位局域网地址之间执行翻译的协议。 数据链路层:设备驱动程序及接口卡,以太网,PPP(点对点协议) 在TCP/IP分层中,数据链路层用MTU(Maximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头,如以太网的MTU为1500字节,实际上数据帧的最大长度为1512字节,其中以太网数据帧的帧头为12字节。
当发送的IP数据报的大小超过了MTU时,IP层就需要对数据进行分片,否则数据将无法发送成功。在网络编程中,我们要避免出现IP分片,那么为什么要避免呢?原因是IP层是没有超时重传机制的,如果IP层对一个数据包进行了分片,只要有一个分片丢失了,只能依赖于传输层进行重传,结果是所有的分片都要重传一遍,这个代价有点大。由此可见,IP分片会大大降低传输层传送数据的成功率,所以我们要避免IP分片。
对于UDP包,我们需要在应用层去限制每个包的大小,一般不要超过1472字节,即以太网MTU(1500)—UDP首部(8)—IP首部(20)。
对于TCP数据,应用层就不需要考虑这个问题了,因为传输层已经帮我们做了