传输层(一)
传输层(一)概述传输层是整个网络体系结构中的关键层次之一,主要负责向两个主机中进程之间的通信提供服务。传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。传输层在给定的链路上通过流量控制、分段/重组和差错控制来保证数据传输的可靠性。主要的传输协议有TCP和UDP。
服务过程:
发送方:将应用层的报文分成报文段,然后传递给网络层
接收方:将报文段重组成报文,然后传递给应用层
服务类型:
可靠的、保序的传输: TCP
多路复用、解复用
拥塞控制
流量控制
建立连接
不可靠、不保序的传输:UDP
多路复用、解复用
没有为尽力而为的IP服务添加更多的其它额外服务
都不提供的服务:
延时保证
带宽保证
多路复用和解复用
在发送方主机多路复用:
从多个套接字接收来自多个进程的报文,根据套接字对应的IP地址和端口号等信息对报文段用头部加以封装(该头部信息用于以后的解复用)
在接收方主机多路解复用:
根据报文段的头部信息中的IP地址和端口号将接收到的报文段发给正确的套接字(和对应的应用进程)
面向连接的解复用(TCP):
由于UDP的Socket需要关联 ...
套接字编程
套接字编程TCP套接字编程
服务器首先运行,等待连接建立(服务器进程必须先处于运行状态)
创建欢迎socket
和本地端口捆绑
在欢迎socket上阻塞式等待接收用户的连接
客户端主动和服务器建立连接
创建客户端本地套接字(隐式捆绑到本地port)
指定服务器进程的IP地址和端口号,与服务器进程连接
当与客户端连接请求到来时
服务器接受来自用户端的请求,解除阻塞式等待,返回一个新的socket(与欢迎socket不一样),与客户端通信
允许服务器与多个客户端通信,使用源IP和源端口来区分不同的客户端
连接API调用有效时,客户端P与服务器建立了TCP连接
UDP套接字编程UDP:在客户端和服务器之间没有连接
传输层提供端到端的进程之间的网络传输服务。
没有握手
发送端在每一个报文中明确地指定目标的IP地址和端口号(因为socket只绑定了本地的IP和端口)
服务器必须从收到的分组中提取出发送端的IP地址和端口号
应用层协议
应用层协议HTTPHTTP:超文本传输协议,并且HTTP是无状态的(不需要维护客户端状态 ),使用TCP建立连接,客户发起一个与服务器的TCP连接(建立套接字) ,端口号为80;HTTP/1.1 默认使用持久连接以及流水线请求方式。
客户/服务器模式:
客户:请求、接收和显示Web对象的浏览器
服务器:对请求进行响应,发送对象的Web服务器
请求报文:
请求方式:
GET:发送一个请求来取得服务器上的某一资源。
POST:向 url 指定的资源提交数据或附加新的数据。
HEAD:只请求页面的首部。
PUT:数据发送到服务器以创建或更新资源,侧重于创建数据,对应insert操作。
DELETE:删除服务器上的某资源。
响应报文:
响应状态码:
1XX:表示【临时响应】并需要请求者继续执行操作的状态代码
2XX:代表请求已成功被服务器接收、理解、并接受。
200(成功)服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
201(已创建)请求成功并且服务器创建了新的资源。
202(已接受)服务器已接受请求,但尚未处理。
203(非授权信息)服务器已成功处理了请求,但返 ...
应用层基础
应用层基础应用层也称为应用实体,它由若干个特定应用服务元素和一个或多个公用应用服务元素组成。
网络应用的实例:互联网流行的应用层协议
HTTP
FTP
SMTP / POP3 /IMAP
DNS
编程:网络应用程序
Socket API
体系结构客户-服务器(C/S)体系结构服务器:
一直运行
固定的IP地址和周知的端口号(约定)
扩展性差
客户端:
主动与服务器通信
与互联网有间歇性的连接
可能是动态IP 地址
不直接与其它客户端通信
对等体(P2P)体系结构特点:
(几乎)没有一直运行的服务器
任意端系统之间可以进行通信,并且每一个节点既是客户端又是服务器
参与的主机间歇性连接且可以改变IP 地址
缺点:
难以管理
也有C/S和P2P体系结构的混合体:
Napster
相关概念
数据丢失率
有些应用则要求100%的可靠数据传输(如文件)
有些应用(如音频)能容忍一定比例以下的数据丢失
吞吐
一些应用(如多媒体)必须需要最小限度的吞吐,从而使得应用能够有效运转
一些应用能充分利用可供使用的吞吐(弹性应用)
延迟
一些应用出于有效性 ...
计算机网络和因特网
计算机网络和因特网InternetInternet,中文正式译名为因特网,又叫做国际互联网。它是由那些使用公用语言互相通信的计算机连接而成的全球网络。一旦你连接到它的任何一个节点上,就意味着您的计算机已经连入Internet网上了。Internet目前的用户已经遍及全球,有超过几亿人在使用Internet,并且它的用户数还在以等比级数上升。
从服务的角度来看:
Internet就是使用通信设施进行通信的分布式应用,其中通信基础设施为apps提供编程接口(通信服务),为app应用提供无连接不可靠服务和面向连接的可靠服务。
具体构成
节点:
主机及其上运行的应用程序
路由器、交换机等网络交换设备
边:通信链路
接入网链路:主机连接到互联网的链路
主干链路:路由器间的链路
协议:对等层实体在通信交换过程中应该遵守的规则协议。协议定义了在两个或多个通信实体之间交换的报文格式和次序,以及在报文传输和/或接收或其他事件方面所采取的动作
网络边缘边缘系统:如果要用现有的技术术语描述的话,边缘网络包括汇聚层网络和接入层网络的一部分或全部, 是接入用户的最后一段网络。由主机和应用程序(客户端 ...
死锁
死锁死锁的条件死锁的产生需要如下4 个条件:
互斥:线程对于需要的资源进行互斥的访问(例如一个线程抢到锁)。
持有并等待:线程持有了资源(例如已将持有的锁),同时又在等待其他资源(例如,需要获得的锁)。
非抢占:线程获得的资源(例如锁),不能被抢占。
循环等待:线程之间存在一个环路,环路上每个线程都额外持有一个资源,而这个资源又是下一个线程要申请的。
如果这4 个条件的任何一个没有满足,死锁就不会产生。
破坏互斥:如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。比如: SPOOLing技术。操作系统可以采用SPOOLing技术把独占设备在逻辑上改造成共享设备。类似于在两者之间加了一个中间层输出进程来进行接收 进程请求。
破坏持有并等待:可以采用静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行。一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源了。
破坏非抢占:方案一:当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时再重新申请。也就是说,即使某些资源尚未使用完,也需要主动 ...
内存管理(三)
内存管理(三)超越物理内存:机制操作系统如何利用大而慢的设备,透明地提供巨大虚拟地址空间的假象?
不仅是一个进程,增加交换空间让操作系统为多个并发运行的进程都提供巨大地址空间的假象。
交换空间我们要做的第一件事情就是,在硬盘上开辟一部分空间用于物理页的移入和移出。在操作系统中,一般这样的空间称为交换空间(swap space),因为我们将内存中的页交换到其中,并在需要的时候又交换回去。
交换空间的大小是非常重要的,它决定了系统在某一时刻能够使用的最大内存页数。
存在位硬件(或操作系统,在软件管理TLB 时)判断是否在内存中的方法,是通过页表项中的一条新信息,即存在位(present bit)。如果存在位设置为1,则表示该页存在于物理内存中,并且所有内容都如上所述进行。如果存在位设置为零,则页不在内存中,而在硬盘上。访问不在物理内存中的页,这种行为通常被称为页错误(page fault)。
当TLB 未命中发生的时候有3 种重要情景:
第一种情况,该页存在(present)且有效(valid)(第18~21 行)。在这种情况下,TLB 未命中处理程序可以简单地从PTE 中获取PFN,然 ...
内存管理(二)
内存管理(二)分页概述第一种是将空间分割成不同长度的分片,就像虚拟内存管理中的分段。遗憾的是,这个解决方法存在固有的问题。具体来说,将空间切成不同长度的分片以后,空间本身会碎片化(fragmented),随着时间推移,分配内存会变得比较困难。
因此,值得考虑第二种方法:将空间分割成固定长度的分片。在虚拟内存中,我们称这种思想为分页。
分页不是将一个进程的地址空间分割成几个不同长度的逻辑段(即代码、堆、段),而是分割成固定大小的单元,每个单元称为一页。相应地,我们把物理内存看成是定长槽块的阵列,叫作页帧(pageframe)。每个这样的页帧包含一个虚拟内存页。
组成部分
为了记录地址空间的每个虚拟页放在物理内存中的位置,操作系统通常为每个进程保存一个数据结构,称为页表(page table)。页表的主要作用是为地址空间的每个虚拟页面保存地址转换(address translation),从而让我们知道每个页在物理内存中的位置。为了转换(translate)该过程生成的虚拟地址,我们必须首先将它分成两个组件:虚拟页面号(virtual page number,VPN)和页内的偏移量(off ...
内存管理(一)
内存管理(一)地址空间操作系统需要提供一个易用(easy to use)的物理内存抽象。这个抽象叫作地址空间(address space),是运行的程序看到的系统中的内存。
一个进程的地址空间包含运行的程序的所有内存状态。比如:程序的代码(code,指令)必须在内存中,因此它们在地址空间里。
在程序运行时,地址空间有两个区域可能增长(或者收缩)。它们就是堆(在顶部)和栈(在底部)。堆在代码(1KB)之下开始并向下增长(当用户通过malloc()请求更多内存时),栈从16KB 开始并向上增长(当用户进行程序调用时)。
虚拟化内存
虚拟内存系统负责为程序提供一个巨大的、稀疏的、私有的地址空间的假象,其中保存了程序的所有指令和数据。操作系统在专门硬件的帮助下,通过每一个虚拟内存的索引,将其转换为物理地址,物理内存根据获得的物理地址但获取所需的信息。
当我们描述地址空间时,所描述的是操作系统提供给运行程序的抽象(abstract)。程序不在物理地址0~16KB 的内存中,而是加载在任意的物理地址。
当操作系统这样做时,我们说操作系统在虚拟化内存(virtualizing memory),因为运 ...
进程管理(二)
进程管理(二)进程调度我们还不知道操作系统调度程序采用的上层策略(policy)。接下来会介绍一系列的调度策略(sheduling policy)。
调度指标
相关指标:周转时间(turnaround time)、响应时间(response time)。
T 周转时间= T 完成时间−T 到达时间
T 响应时间= T 首次运行−T 到达时间
基础调度算法先进先出(FIFO)
我们可以实现的最基本的算法,被称为先进先出(First In First Out 或FIFO)调度,有时候也称为先到先服务(First Come First Served 或FCFS)。
优点:
它很简单,而且易于实现。
缺点:
存在护航效应:一些耗时较少的潜在资源消费者被排在重量级的资源消费者之后,会等很长时间。
最短任务优先(SJF)
策略:先运行最短的任务,然后是次短的任务,如此下去。
优点:
改善了平均周转时间和平均带权周转时间,缩短作业的等待时间。
提高系统的吞吐量。
缺点:
存在护航效应:一些耗时较多的潜在资源消费者被排在轻量级的资源消费者之后,会等很长时间。
未能依据作业的紧迫程度来划分 ...