1、网络操作系统体系结构,Network Operating System,2,2019/6/20,1、对等(Peer to Peer)模式 对等式局域网操作系统的特点是网络上的所有连接站点地位平等,因此又称为同类网。,对等网络的规划一般都比较简单,通常采用如图所示的两种结构,2.1 体系结构工作模式,3,2019/6/20,2、文件服务器模式 文件服务器模式如上图所示,在这种模式中,应用程序和数据都存放在一台指定的计算机中,这台计算机称之为文件服务器,一般均由专业服务器或性能较高的微机担任。 文件服务器模式的优点: 文件服务器与工作站之间分工明确,使工作站从网络管理中解脱出来,信息处理能力明显增
2、强; 数据保密性好,可根据不同需求给用户不同的权限,资源共享性好; 文件安全管理较好,可靠性高。,2.1 体系结构工作模式,4,2019/6/20,3 客户机与服务器 客户和服务器都运行于相同的微内核中,让用户和服务器都以用户进程的方式运行,一台机器可以运行单个进程、多个客户、多个服务器或二者的混合。(其主要目的是为了避免面向连接的协议加复杂的报文头)。 C/S模式常常以简单的请求/应答协议为基础。,2.1 体系结构工作模式,5,2019/6/20,客户机与服务器,2.1 体系结构工作模式,6,2019/6/20,客户机与服务器 上图的优点 “简单”,客户发送一个请求,得到一个应答,在使用前无
3、须建立连接也不用释放连接,应答的消息同时也是对请求的确认。 有效性,协议栈比较短,因而也更有效。网络接口层(或OSI中的数据链路层和物理层)处理发送到服务器的数据和返回的数据,这些由硬件完成。,2.1 体系结构工作模式,7,2019/6/20,客户机与服务器 因此这种简单的结构可以简化为系统通过微内核提供的两个调用: send(dest,&mptr)负责发送报文 receive(addr,&mptr)负责接收报文,2.1 体系结构工作模式,8,2019/6/20,客户机与服务器 Send函数将要发送的消息用指针mptr传给进程,用dest标记目的地,然后阻塞调用者,直到发送完毕为止。 rece
4、ive进程阻塞调用者直到消息被接收为止,当调用结束时将消息拷贝到mptr指向的缓冲区,同时调用这不再被阻塞,addr参数正在监听接收的地址。,2.1 体系结构工作模式,9,2019/6/20,客户机和服务器模式的实现 寻址。 客户为了发送信息给服务器,它必需知道服务器的地址。 在Unix系统中采用32位地址指定具体的机器,采用16位的id号来表示本地ID字段,即采用machine.process(机器.进程)的方式。,2.1 体系结构工作模式,10,2019/6/20,客户机和服务器模式的实现 阻塞和非阻塞原语 当一个进程调用send原语,它指定了目的地及发送到该目的地的缓冲区数据。消息传送时
5、,发送的进程被阻塞(挂起)。直到消息传递完毕,其后的指令才能继续执行。 同样调用receive时,直到一条消息被实际接收并放入缓冲区时才返回控制权,在一条消息到达前调用receive的进程一直挂起。,2.1 体系结构工作模式,11,2019/6/20,客户机和服务器模式的实现 阻塞和非阻塞原语 在有些系统中,接收者可以指明希望从哪个发送者接收消息,这种情况下它保持阻塞直到该发送者发送的消息到达。 和阻塞原语对应的是非阻塞原语(有时候也叫异步原语)。,2.1 体系结构工作模式,12,2019/6/20,客户机和服务器模式的实现 阻塞和非阻塞原语 这种方法的优点是:调用发送进程可以和消息传送并行,
6、而不是让处理器空闲(假设没有其它进程可运行),阻塞原语和非阻塞原语的选择一般取决于系统设计者。,2.1 体系结构工作模式,13,2019/6/20,客户机和服务器模式的实现,2.1 体系结构工作模式,14,2019/6/20,客户机和服务器模式的实现 有缓冲和无缓冲原语 像系统设计者可以选择阻塞和非阻塞原语一样,他们也可以选择优缓冲和无缓冲原语,上面描述的基本上是无缓冲原语,意味着一个地址指定给一个特定的进程。 如果调用receive(addr,&m),告诉运行的机器内核,调用的进程正在监听地址addr,并且准备接收发送到那个地址的消息。m指出了一个消息缓冲区用于保存传送来的消息。当消息到来,
7、调用接收原语的内核将消息拷贝到缓冲区,并解除该进程的阻塞。,2.1 体系结构工作模式,15,2019/6/20,客户机和服务器模式的实现,2.1 体系结构工作模式,16,2019/6/20,客户机和服务器模式的实现 有缓冲和无缓冲原语 只要服务器在服务器在客户机上调用send原语之前调用receive原语,就能运行良好。 receive调用只是这样一种机制,它告诉服务器内核服务器正在使用的地址以及存放到来消息的位置,当发送比接收先发上就会产生问题。,2.1 体系结构工作模式,17,2019/6/20,2.1 体系结构系统内核,内核模块 以Linux为例介绍内核及其组件的基本结构,讲述那些重要的
8、内核领域,譬如不同内核的活动形式、存储管理、设备驱动程序、定时器及模块等。 主要目标是介绍Linux网络体系结构的运行框架。 下列所有领域负责阐明首要网络服务所需要的基本功能。因此,了解这些功能就是理解Linux联网体系结构实现的基本前提。,18,2019/6/20,2.1 体系结构系统内核,内核模块 下图给出了Linux内核体系结构。 Linux内核可以划分为6个不同的部分;每一部分负责处理一项明确的功能,同时又向其它内核组件提供这项功能。 这种体系结构反映到内核的源码上这6个部分都形成了各自的子树。,19,2019/6/20,2.1 体系结构系统内核,内核模块,20,2019/6/20,2
9、.1 体系结构系统内核,内核模块 进程管理 进程管理部分负责进程及其它内核活动(如软件中断等)的创建和终止。 另外,进程间通信(如信号、管道等)也处在这一部分。调度程序是进程管理的主要组件。 调度程序负责处理所有的活动进程、等待进程及阻塞进程,它还负责保证所有的应用程序进程都能公平的分享到处理器的计算时间。,21,2019/6/20,2.1 体系结构系统内核,内核模块 内存管理 计算机的存储器是最重要的资源之一。计算机的性能十分依赖于它所配置的内存。 另外,内存管理还要负责为每条进程分配各自的存储区,并且保护这些存储区不配其它进程访问。,22,2019/6/20,2.1 体系结构系统内核,内核
10、模块 文件系统 在Linux系统中,文件系统是个中心角色。和其它操作系统(如windows NT)不同,Linux内核中几乎所有的项目都是以文件系统接口加以处理,例如,设备驱动程序可以表现成一些文件,Proc文件系统则允许访问内核中的数据和参数。,23,2019/6/20,2.1 体系结构系统内核,内核模块 设备驱动程序 设备驱动程序是从各种操作系统中的底层的硬件抽象出来的,从而允许访问这些硬件。 尽管Linux是一种整体式内核,但Linux的模块化概念也具备一种运行时添加或删除设备的手段。,24,2019/6/20,2.1 体系结构系统内核,内核模块 网络子系统 由于某些网络操作无法分派给某
11、个特定进程(譬如传入分组处理),因此所有的网络操作都必须交由操作系统处理。传入分组是异步事件。 在进程处理它们之间,就必须先收集、标识及转发这些分组。因此,才会由内核负责处理跨程序、跨网络接口的分组。,25,2019/6/20,2.1 体系结构系统内核,内核模块 在内核中,明确驱动的接口有助于新功能的设计。例如,假设有个接口指向虚拟文件系统,则该接口即可用于添加新的文件系统。Linux可以支持数十种文件系统,这也明确展现了接口确实是Linux开发人员做出的一项优秀设计决策因为还没有其它操作系统能支持如此之多的文件系统。 Linux网络体系结构中还包含了很多支持动态添加协议及网络及网络驱动程序接
12、口。,26,2019/6/20,2.1 体系结构系统内核,内核中的活动 Linux是一种多任务系统。意味着多条应用程序可以同是处于活动状态,也意味着可以同时使用多个应用程序或进程。 不过进程并不是Linux系统中唯一可以执行的活动形式。,27,2019/6/20,2.1 体系结构系统内核,内核中的活动 进程和系统调用 进程(process)通常是一些启动已运行的某种特定应用程序的活动,它们会随着应用程序的结束而终止。 进程的创建、控制和销毁等任务都由操作系统内核负责处理。 进程互斥地运行在处理器的用户地址空间(即出于未保护的模式下);进程从这里只能访问分配给自己的存储区。,28,2019/6/
13、20,2.1 体系结构系统内核,内核中的活动 进程和系统调用 尝试访问其它进程的存储区或内核地址空间都会带来异常,该异常必须由内核进行处理。 不过进程如果希望访问设备或使用操作系统内核的某项功能,则必须利用系统调用来做得到这一点。 系统调用会让处理器变为受保护模式,而对内核地址空间的访问则是系统调用的一项功能。在受保护模式下可以访问所有设备及存储区,但只有时用内核方法才能做到这一点。,29,2019/6/20,2.1 体系结构系统内核,内核中的活动 进程和系统调用 进程和系统调用的工作可以被其它活动打断。这时它们当前的状态会保存下来;如果这个被中断的进程或系统调用重新工作起来,则会恢复那些被保
14、存下来的状态。,30,2019/6/20,2.1 体系结构系统内核,内核中的活动 进程和系统调用 进程和系统调用可以自愿停止,也可以是非自愿停止。 前一种情况下它们会自愿放弃处理例如,进城和系统调用等待某项系统资源(外部设备)而出于睡眠状态,直至得到这项资源为止。 非自愿放弃处理是由中断造成的,中断告诉内核一项重要行动一项内河必须处理活动,中断可以是一种关于早期繁忙资源重新可用的通知。,31,2019/6/20,2.1 体系结构系统内核,内核中的活动 除了正常进程和系统调用的进程外,我们还要区分Linux内核中的其它活动形式。 这些活动形式对Linux网络体系结构的重要向具有决定的意义因为网络
15、功能正是在内核中进行处理的。 这些活动形式包括:,32,2019/6/20,2.1 体系结构系统内核,内核中的活动 中断(硬中断) 外设利用硬件中断(hardware interrupt,HW IRQ)向操作系统通知一些重要的事件(如鼠标移动、键盘按下等)硬件中断打断了处理器正在处理的当前活动,然后去执行相关的中断处理例程。,33,2019/6/20,2.1 体系结构系统内核,内核中的活动 中断(硬中断) request_irq()函数可以在运行时注册特定的中断处理例程。 free_irq()可以用于释放中断的处理例程,这样就不会再执行它。,34,2019/6/20,2.1 体系结构系统内核,
16、内核中的活动 中断(硬中断) Linux内核中需要区分两种中断: 一种是快速中断,它的特征是拥有非常小的中断处理例程,只会很短暂的打断当前的活动,并且在执行期间锁定本地CPU的所有其它中断,在该中断例程执行的过程中是不可以被打断。 另一种是慢速中断,在执行的过程中可以被打断,中断处理例程一般较长,因此它们占用处理器的时间一般也较长。,35,2019/6/20,2.1 体系结构系统内核,内核中的活动 软件中断(software interrupt,soft IRQ) 实际上是一种不同于真正的中断的、调度后才执行的活动。硬件中断和软件中的主要差别在于,硬件中断会主动打断另一种活动;触发硬件中断会导
17、致打断正在运行的活动。 相反软件中断要由一种内核活动来调度它的执行,并不会打断当前正在运行的活动。在Linux系统中定义了32种软件中断。,36,2019/6/20,2.1 体系结构系统内核,内核中的活动 任务蕾(tasklet) 是可以并行可执行的软件中断和旧下半区的一种混和体。,37,2019/6/20,2.1 体系结构系统内核,内核中的活动 下半区(bottom half) 一旦出发中断会执行中断处理例程,从而短暂地打断了当前的活动。 但并非所有的任务都只用几条语句就可以完成的。例如,若要处理网络适配器收到的分组,则需要数千个时钟嘀嗒标记,然后才能将这个分组传递给用户地址空间的相关进程。
18、,38,2019/6/20,2.1 体系结构系统内核,内核中的活动 下半区(bottom half) 尽管中断出发了这项任务,但该任务并非在中断处理例程中执行的。为了保持中断处理的尽可能的小,这种耗时的任务被划分成了两个部分: 上半区(top half) 下半区(bottom half)。,39,2019/6/20,2.1 体系结构系统内核,内核中的活动 下半区(bottom half) 上半区负责在出发中断之后单纯地运行那些重要的任务,上半区对应着中断处理例程。例如:网络适配器的中断处理例程只负责将接收到的分组复制到内核中,在内核中该分组会被缓存在一个挂起的队列中,其详细的处理由对应的协议实
19、体负责。,40,2019/6/20,2.1 体系结构系统内核,内核中的活动 下半区(bottom half) 下半区运行着所有不太紧急的运算及因时间原因而无法在中断处理例程中执行的运算。运行上半区的同时会调度下半区的执行,一旦中断结束而再次调用调度程序,则很可能会运行下半区。,41,2019/6/20,五、操作系统的体系结构,Windows2000的系统结构,42,2019/6/20,2.1 体系结构UNIX体系结构,UNIX System V系统核心框图,43,2019/6/20,2.1 体系结构常用的网络操作系统,具有代表性的网络操作系统有: Microsoft公司的Windows NT
20、Server、Windows 2000 Server和Windows Server 2003 UNIX UNIX派生的自由软件Linux Novell公司的Netware,44,2019/6/20,2.1 体系结构常用的网络操作系统,1.Windows 2000 Windows 2000有四个版本:Professional、Server、Advanced Server和Datacenter Server。 2.WINDOWS 2003 它包括Standard Edition(标准版)、Enterprise Edition(企业版)、Datacenter Edition(数据中心版)、Web E
21、dition(网络版)四个版本,每个版本均有32位和64位两种编码。,45,2019/6/20,2.1 体系结构常用的网络操作系统,46,2019/6/20,2.2 网络子系统,Linux 操作系统的最大特性之一就是它的网络栈。它最初源于 BSD((Berkeley Software Distribution,伯克利软件套件 )的网络栈,具有一套非常干净的接口,组织得非常好。 接口范围从协议无关层(例如通用 socket 层接口或设备层)到各种网络协议的具体层。Linux 中基本网络栈的介绍分为四层的 Internet 模型,47,2019/6/20,2.2 网络子系统,48,2019/6/2
22、0,2.2 网络子系统,这个栈的最底部是链路层。链路层是指提供对物理层访问的设备驱动程序,这可以是各种介质,例如串口链路或以太网设备。 链路层上面是网络层,它负责将报文定向到目标位置。 再上一层称为传输层,负责端到端的通信(例如,在一台主机内部)。尽管网络层负责管理主机之间的通信,但是传输层需要负责管理主机内部各端之间的通信。 最后一层是应用层,它通常是一个语义层,能够理解要传输的数据。例如,超文本传输协议(HTTP)就负责传输服务器和客户机之间对 Web 内容的请求与响应。,49,2019/6/20,2.2 网络子系统,网络栈的各个层次有一些更为人所熟知的名字。 1、在链路层上,可以找到以太
23、网,这是最常用的一种高速介质。更早的链路层协议包括一些串口协议,例如:SLIP(Serial Line Internet Protocol)CSLIP(Compressed SLIP)PPP(Point-to-Point Protocol)。,50,2019/6/20,2.2 网络子系统,2、最常见的网络层协议是 IP(Internet Protocol),但是网络层中还存在一些满足其他需求的协议,例如 ICMP(Internet Control Message Protocol)ARP( Address Resolution Protocol),51,2019/6/20,2.2 网络子系统,
24、3、在传输层上是 TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)。4、最后,应用层中包含很多大家都非常熟悉的协议,包括标准的 Web 协议 HTTP 和电子邮件协议 SMTP(Simple Mail Transfer Protocol)等Linux 网络栈的架构以及如何实现这种 Internet 模型。 ?,52,2019/6/20,2.2 网络子系统,53,2019/6/20,2.2 网络子系统,最上面是用户空间层,或称为应用层,其中定义了网络栈的用户。 底部是物理设备,提供了对网络的连接能力。 中间是内核空间,
25、即网络子系统。流经网络栈内部的是 socket 缓冲区sk_buffs),它负责在源和汇点之间传递报文数据。,54,2019/6/20,2.2 网络子系统,系统调用接口 系统调用接口可以从两个角度进行描述。用户发起网络调用时,通过系统调用接口进入内核的过程应该是多路的。 最后调用 ./net/socket.c 中的 sys_socketcall 结束该过程,然后进一步将调用分路发送到指定目标。系统调用接口的另一种描述是使用普通文件操作作为网络I/O。,55,2019/6/20,2.2 网络子系统,系统调用接口 例如,典型的读写操作可以在网络 socket 上执行(socket 使用一个文件描述
26、符表示,与一个普通文件一样)。 因此,尽管有很多操作是网络专用的(使用 socket 调用创建一个socket,使用 connect 调用连接一个收信方,等等),但是也有一些标准的文件操作可以应用于网络对象,就像操作普通文件一样。最后,系统调用接口提供了在用户空间应用程序和内核之间转移控制的方法。,56,2019/6/20,2.2 网络子系统,协议无关接口 socket 层是一个协议无关接口,它提供了一组通用函数来支持各种不同协议。socket 层不但可以支持典型的 TCP 和 UDP 协议,而且还可以支持 IP、以太网和其他传输协议,例如SCTP(Stream Control Transfe
27、r Protocol)。 通过网络栈进行的通信都需要对 socket 进行操作。Linux 中的 socket 结构是 struct sock,这个结构是在 linux/include/net/sock.h 中定义的。这个巨大的结构中包含了特定 socket 所需要的所有状态信息,其中包括 socket 所使用的特定协议和在 socket 上可以执行的一些操作。,57,2019/6/20,2.2 网络子系统,协议无关接口 网络子系统可以通过一个定义了自己功能的特殊结构来了解可用协议。每个协议都维护了一个名为 proto 的结构(可以在 linux/include/net/sock.h 中找到)
28、。这个结构定义了可以在从 socket 层到传输层中执行特定的 socket 操作(例如,如何创建一个 socket,如何使用 socket 建立一个连接,如何关闭一个 socket 等)。,58,2019/6/20,2.2 网络子系统,网络协议 对一些可用的特定网络协议作出了定义(例如 TCP、UDP 等)。 它们都是在 linux/net/ipv4/af_inet.c 文件中一个名为 inet_init 的函数中进行初始化的(因为 TCP 和 UDP 都是 inet 簇协议的一部分)。 inet_init 函数使用 proto_register 函数来注册每个内嵌协议。这个函数是在 lin
29、ux/net/core/sock.c 中定义的,除了可以将这个协议添加到活动协议列表中之外,如果需要,该函数还可以选择分配一到多个 slab 缓存。,59,2019/6/20,2.2 网络子系统,网络协议 通过 linux/net/ipv4/ 目录中 udp.c 和 raw.c 文件中的 proto 接口,可以了解各个协议是如何标识自己的。这些协议接口每个都按照类型和协议映射到 inetsw_array,该数组将内嵌协议与操作映射到一起。inetsw_array 结构及其关系如图所示。 最初,会调用 inet_init 中的 inet_register_protosw 将这个数组中的每个协议都
30、初始化为 inetsw。函数 inet_init 也会对各个 inet 模块进行初始化,例如 ARP、ICMP 和 IP 模块,以及 TCP 和 UDP 模块。,60,2019/6/20,2.2 网络子系统,网络协议,61,2019/6/20,2.2 网络子系统,网络协议proto 结构定义了传输特有的方法,而 proto_ops 结构则定义了通用的 socket 方法。可以通过调用 inet_register_protosw 将其他协议加入到 inetsw 协议中。 例如,SCTP 就是通过调用linux/net/sctp/protocol.c 中的 sctp_init 加入其中的。 soc
31、ket 中的数据移动是使用一个所谓的 socket 缓冲区(sk_buff)的核心结构实现的。 sk_buff 中包含了报文数据,以及涉及协议栈中多个层次的状态数据。所发送或接收的每个报文都是使用一个 sk_buff 表示的。sk_buff 结构是在 linux/include/linux/skbuff.h 中定义的,62,2019/6/20,2.2 网络子系统,网络协议,63,2019/6/20,2.2 网络子系统,网络协议 多个 sk_buff 可以针对某个给定连接链接在一起。每个 sk_buff 都在设备结构(net_device)中标识报文发送的目的地,或者接收报文的来源地。 由于每个
32、报文都是使用一个 sk_buff 表示的,因此报文头都可以通过一组指针(th、iph 和 mac用于 Media Access Control 或者 MAC 头)方便地进行定位。由于 sk_buff 是 socket 数据管理的中心,因此创建了很多支持函数来对它们进行管理。其中有些函数用于创建和销毁 sk_buff 结构,或对它进行克隆或排队管理。 针对给定的 socket,Socket 缓冲区可以链接在一起,这样可以包含众多信息,包括到协议头的链接、时间戳(报文是何时发送或接收的),以及与这个报文相关的设备。,64,2019/6/20,2.2 网络子系统,设备无关接口 这一层提供了一组通用函
33、数供底层网络设备驱动程序使用,让它们可以对高层协议栈进行操作。 首先,设备驱动程序可能会通过调用 register_netdevice 或 unregister_netdevice 在内核中进行注册或注销。调用者首先填写 net_device 结构,然后传递这个结构进行注册。 内核调用它的 init 函数(如果定义了这种函数),然后执行一组健全性检查,并创建一个 sysfs 条目,然后将新设备添加到设备列表中(内核中的活动设备链表)。 在 linux/include/linux/netdevice.h 中可以找到这个 net_device 结构。这些函数都是在 linux/net/core/d
34、ev.c 中实现的。,65,2019/6/20,2.2 网络子系统,设备驱动程序 网络栈底部是负责管理物理网络设备的设备驱动程序。例如,包串口使用的 SLIP 驱动程序以及以太网设备使用的以太网驱动程序都是这一层的设备。 在进行初始化时,设备驱动程序会分配一个 net_device 结构,然后使用必须的程序对其进行初始化。这些程序中有一个是 dev-hard_start_xmit,它定义了上层应该如何对 sk_buff 排队进行传输。这个程序的参数为 sk_buff。,66,2019/6/20,2.2 网络子系统,设备驱动程序 设备驱动程序在 dev 结构中配置好自己的接口之后,调用 regi
35、ster_netdevice 便可以使用该配置。在 linux/drivers/net 中可以找出网络设备专用的驱动程序。,67,2019/6/20,2.3 网络通信协议,ISO/OSI参考模型,68,2019/6/20,2.3 网络通信协议,ISO/OSI参考模型,69,2019/6/20,2.3 网络通信协议,链路层 面向比特的链路控制规程HDLC 各字段的意义,数据链路层的数据传送是以帧为单位的。一个帧的结构具有固定的格式,如图所示。,70,2019/6/20,2.3 网络通信协议,链路层 面向比特的链路控制规程HDLC 分组和桢。分组是把要传输的信息划分为多个子数据段,然后分别传输,每
36、个子数据段称为一个分组。 桢是指分组在具体网络上的实现,一个网络上的数据桢是该网络传输数据的最小单元,因此桢只能用于表示数据链路层的分组,因为这一层传输的才是数据的最小单元(其它各层都会加上额外部分,而到了物理层不会再加)。,71,2019/6/20,2.3 网络通信协议,链路层 面向比特的链路控制规程HDLC HDLC采用零比特填充法使一帧中两个F字段之间不会出现6个连续1。 零比特填充的具体做法是:在发送端,当一串比特流数据尚未加上标志字段时,先用硬件扫描整个帧(用软件也能实现,但要慢些)。只要发现有5个连续1,则立即填入一个0。因此经过这种零比特填充后的数据,就可以保证在数据中不会出现6
37、个连续1。 在接收一个帧时,先找到F字段以确定一个HDLC帧的边界。接着再用硬件对其中的比特流进行扫描。每当发现5个连续1时,就将这5个连续1后的一个0删除,以还原成原来的比特流,如图所示。,72,2019/6/20,2.3 网络通信协议,链路层 面向比特的链路控制规程HDLC,73,2019/6/20,2.3 网络通信协议,链路层 面向比特的链路控制规程HDLC HDLC帧划分为三大类,即信息帧、监督帧和无编号帧,其简称分别是I (Information)、S (Supervisory)和U (Unnumbered)。下图是对应于这3种帧的控制字段以及控制字段中的各比特的作用。,74,201
38、9/6/20,2.3 网络通信协议,链路层 面向比特的链路控制规程HDLC,75,2019/6/20,2.3 网络通信协议,TCP/IP体系结构,76,2019/6/20,2.3 网络通信协议,UDP协议,77,2019/6/20,2.3 网络通信协议,UDP协议 用户数据报的格式用户数据报UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节,如下图所示,由4个字段组成,每个字段都是两个字节。各字段意义如下所述。 源端口字段:源端口号。 目的端口字段:目的端口号。 长度字段:UDP用户数据报的长度。 检验和字段:防止UDP用户数据报在传输中出错。,78,2019/6/20,2.3
39、 网络通信协议,UDP协议 用户数据报的格式注意:UDP数据报中计算校验和方法有点特殊,在计算校验和时在UDP数据报前加12字节的伪首部,伪首部并不是真正的首部,只是在计算校验和时得到的一个临时的过渡的数据报。伪首部既不向下传递以不向上提交。,79,2019/6/20,2.3 网络通信协议,UDP协议,80,2019/6/20,2.3 网络通信协议,TCP协议 传输控制协议TCP TCP是TCP/IP体系中面向连接的运输层协议,它提供全双工的可靠交付的服务。 一个TCP报文段分为首部和数据两部分,如下图所示。TCP报文段首部的前20个字节是固定的,后面有4N字节是根据需要而增加的选项(N必须是
40、整数)。因此TCP首部的最小长度是20字节。,81,2019/6/20,2.3 网络通信协议,TCP协议,82,2019/6/20,2.3 网络通信协议,TCP协议 传输控制协议TCP 首部固定部分各字段的意义如下所述。 源端口和目的端口,各占两字节。 序号,4字节。TCP是面向数据流的,在传送的数据流中,每一字节都有一个序。例如,一报文段序号为200,而其数据共100字节,那么下一报文段序号就为300。 确认序号,4字节,期望收到的下一报文的数据的第一个字节的序号。也就是下一报文段首部序号。序号长度4GB可以保证序号重复时,旧序号早已在网络中消失了。,83,2019/6/20,2.3 网络通
41、信协议,TCP协议 首部固定部分各字段的意义如下所述 数据偏移,指出数据开始处距离TCP报文段的起始处多远。实际上也就是TCP报文段首部的长度。偏移单位是32位字。 保留,暂时不用。留作后用。 紧急比特URG (URGent),当URG为1时表示此TCP应当尽快传递(高优先级),而不是按原先排队传递。 确认比特ACK,只有当ACK=1时确认号字段才有意义,ACK=0确认号字段没意义。,84,2019/6/20,2.3 网络通信协议,TCP协议 首部固定部分各字段的意义如下所述 推送比特PSH (PuSH),当PSH为1时表明请求立即将本数据报传送给应用层,而不是等缓存都填满后再传送。 复位比特
42、RST (ReSeT),当RST=1时表明严重差错,必须立刻释放连接,然后再重新连接。 同步比特SYN,连接建立时使用,当SYN=1,而ACK=0表明是一个连接请求报文段,如果对方同意建立连接则发送SYN=1,ACK=1。,85,2019/6/20,2.3 网络通信协议,TCP协议 首部固定部分各字段的意义如下所述 终止比特FIN (FINal),用来释放连接,当FIN=1,表明欲发送的字符已经发完,并请求断开连接。 窗口,该窗口告诉对方在未收到确认的情况下,能发送的字节数之多是此窗口大小。 检验和,计算和UDP类似。 选项,长度可变,即最大TCP报文长度。MSS(maximum segeme
43、nt size),告诉对方我的缓存最多能够接收的报文段最大长度为MSS字节。当没有选项时,TCP首部长度为20字节。,86,2019/6/20,2.3 网络通信协议,TCP协议,87,2019/6/20,2.3 网络通信协议,TCP协议 TCP的运输连接管理。TCP是面向连接的协议。运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。 在连接建立过程中要解决以下三个问题。 要使每一方能够确知对方的存在。 要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。 能够运输实体资源(如缓存大小,连接表中的项目等)进行分配。,88,2019/6/20,2.3 网络通信协议,TC
44、P协议 TCP的连接和建立都是采用客户服务器方式。主动发起连接建立的进程叫做客户(client),而被动等待连接建立的进程叫做服务器(server)。,89,2019/6/20,2.3 网络通信协议,TCP协议,90,2019/6/20,2.4 TCP/IP体系与网络互联,IP数据报格式,91,2019/6/20,2.4 TCP/IP体系与网络互联,IP数据报格式 IP数据报的格式能够说明IP协议具有什么样的功能。从图中可以看出一个IP数据报由首部和数据两个部分组成。首部的前一部分是长度固定的20字节,后一部分则是长度可变的。其各自段的含义如下: 版本,占4bit,指明IP协议的版本,通信双方
45、使用的IP协议版本要一致,目前的IP协议版本是4(IP Version 4)。以前的三个版本目前已经不再是使用了。,92,2019/6/20,2.4 TCP/IP体系与网络互联,IP数据报格式 首部长度,占4bit,可表示的最大数值为15个单位(一个单位为4字节)。因此IP数据报的首部最大长度可以为60字节。当IP分组首部长度不是4字节的整数倍时,必须理由最后一个填充字段进行填充。因此数据部分永远在4N(N=5,6,7)时开始,这样实现起来较为方便。,93,2019/6/20,2.4 TCP/IP体系与网络互联,IP数据报格式 服务类型,占8bit,用来获得更好的服务。 服务类型的前3bit表
46、示优先级,它可以使数据报具有8个优先级中的一个。 第4bit为D bit表示要求有更低的时延。 第5bit为T bit要求有更高的吞吐量。 第6bit为R bit表示要求有更高的可靠性,即在数据报传输的过程中被节点交换机丢弃的可能性尽可能的小。 第7bit为C bit是新增加的,是要求选择费用更低廉的路由。 最后1bit目前尚未使用。 在相当长的时间内服务类型(Type of Service)字段并没有引起很多人的重视。直到最近几年,当需要将实时媒体在因特网上传输时,服务类型字段才引起大家的重视。,94,2019/6/20,2.4 TCP/IP体系与网络互联,IP数据报格式 总长度,表示首部和
47、数据部分的长度和,单位为字节。总长度字段占16bit,因此数据报的最大长度为216-1(65535)字节,然而实际应用中却很少有长度超过1500字节的数据报。当有很长的数据报需要传送时,总长度是指分割受的数据报长度,而不是指未分片前的总长度。 标识,主要作用是使分片后的数据报在接收端能够被准确的重新组装成原先的数据报。注意:标识没有顺序的号的意思,因为IP数据报时无连接的服务,数据报不存在按序接收的问题。,95,2019/6/20,2.4 TCP/IP体系与网络互联,IP数据报格式 标志,占3bit,目前只有前2bit有意义。低位为MF(More Fragment)。MF=1表示后面还有分片的
48、数据报,MF=0表示这是若干数据报分片中的最后一个。中间的一位为DF(Dont Fragment),意思为不能分片,只有当DF=0时才允许分片。 片偏移,指出较长的分组在分片后,某片在原分组中的相对偏移位置。也就是说,相对于用户数据字段的起点,该片从何处开始,片偏移以8字节为偏移单位。,96,2019/6/20,2.4 TCP/IP体系与网络互联,IP数据报格式 寿命,即TTL,即数据报在网络中的生存时间,其单位为s,寿命的建议值为32s,但也可以设置为34s,甚至255s。 协议,占8bit,协议字段指出此数据报携带传输层数据使用的是什么协议,以便目的主机的IP层指导将此IP数据报上交给那个
49、进程。常见的协议和相应的协议字段值为:UDP(17),TCP(6)等。,97,2019/6/20,2.4 TCP/IP体系与网络互联,IP数据报格式 首部校验和,此字段只检验数据包的首部,不包括数据部分。因为数据报每经过一个节点,节点处理机就会计算一次首部校验和(一些字段如寿命、标志等可能发生变化)如果连数据部分一起计算那么计算量就太大了。 地址,首部中最为重要的字段。源IP地址和目标IP地址字段各占4字节。,98,2019/6/20,2.4 TCP/IP体系与网络互联,IP数据报格式 可变部分字段,IP数据报的可变部分字段就是一个选项字段。选项字段用来支持排错、安全等措施,内容丰富。此字段长
50、度可变,从1字节到40字节不等,取决于所选择的项目。但这个字段较少时用。,99,2019/6/20,2.4 TCP/IP体系与网络互联,数据报的实现 操作系统网络子系统最重要的任务之一就是根据使用的协议处理数据报文。 在系统设计上,除了考虑到这些协议的性能和正确性外,协议实现的多样性和灵活性也扮演着重要的角色。,100,2019/6/20,2.4 TCP/IP体系与网络互联,数据报的实现 许多网络协议表面上看有很大差异,但是,当操作系统内部进行实现时,很快就会发现在数据报文上的算法和操作是类似的,并且它们大多可以被复用。 这里以Linux为例来说明数据报文具体是如何实现的,以及有哪些常用的处理方法。,