【计算机网络-自顶向下方法】
第一章:
端系统彼此交换报文,源端系统将报文划分为较小的数据块,称之为分组。在源和目的之间,每个分组都通过通信链路和分组交换机。
多数分组交换机在链路的输入端使用存储转发传输,即交换机要先接收并缓存所有分组,才开始传输,这里就存在一个存储转发时延。然后分组还要承受输出缓存的排队时延,就是发现要传输到的那条链路正在忙于传输其他分组,这个时延的大小就取决于网络中的拥塞程度。由于缓存大小有限,一个到达的分组可能会发现该缓存已经被等待传输的分组占满了,这种情况就会出现分组丢失(丢包),到达的分组或者等待的分组之一将会被丢弃。
路由器(一种分组交换机)如何决定分组向哪条链路转发呢。当源主机向目的主机发送一个分组时,源在该分组的首部加上了目的地的IP地址。每台路由器有一个转发表,用于将目的地址映射为输出链路。相当于分组走到了一个路由器,这个路由器从转发表就查到了当前该往哪走,然后又走到一个路由器,又查到当前该往哪走(像是一个人走一段就问一次路)。因特网具有一些路由选择协议来自动设置这些转发表。
电路交换预先分配了传输链路的使用(相当于你预定了,你不用也不会有别人用),而分组交换按需分配链路的使用。
分组在每个节点(主机或路由器)会经受几种不同的时延:处理时延(检查分组首部,决定将分组导向何处等),排队时延(分组在链路前面排队等待传输),传输时延(当所有已经到达的分组传输后,才能传播刚到达的分组,也就是节点将分组推出去所需要的时间,相当于上传到链路上的时间),传播时延(节点在链路上需要的时间)等。
传输时延时分组长度和链路传播速度的函数,和两个节点的距离无关,而传播时延只和两个节点的距离有关,和分组长度以及链路传播的速度无关(因为取决于物理媒体)。
因特网协议栈由五个层次组成:应用层(此处的分组称为报文),运输层(此处的分组称为报文段),网络层(此处的分组称为数据报),链路层(此处的分组称为帧),物理层。
封装:一个应用层报文被传输给运输层,运输层收到后加上首部信息构成运输层报文段,然后运输层向网络层传输该报文段,网络层收到后加上首部信息构成网络层数据报,然后传递给链路层,链路层加首部信息(有时包括尾部)构成链路层帧。
第二章:
网络应用程序体系结构:客户—服务器体系结构,对等(P2P)体系结构。
多数应用程序是由通信进程对组成,每对中的两个进程互相发送报文。从一个进程向另一个进程发送的报文必须通过下面的网络。进程通过套接字(socket)这个接口向网络发送报文以及从网络接受报文。套接字是同一台主机内应用层和运输层之间的接口。主机由IP地址标识,特定进程由端口号标识。
因特网(更一般的是TCP/IP网络)为应用程序提供两个运输层协议:UDP和TCP。
应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文。
Web(World Wide Web 万维网)的应用层协议是超文本传输协议(HTTP)。HTTP由两个程序实现,一个服务器端,一个客户端。Web浏览器实现了HTTP的客户端,Web服务器实现了HTTP的服务器端。HTTP定义了Web客户向Web服务器请求Web页面的方式,以及Web服务器向Web客户传送Web页面的方式。HTTP使用TCP作为它的支撑运输协议。HTTP并不保存关于客户的任何信息,所以它是一个无状态协议。
HTTP支持非持续连接和持续连接(默认)。在采用持续连接的情况下,服务器在发送响应后保持该TCP连接打开,在相同的客户与服务器之间的后续请求和相应报文能够通过相同的连接进行传送。例如一个完整的Web界面(可能里面有十几个对象)可以用单个持续TCP连接进行传送。但如果是非持续连接,那十几个对象就要每次都建立连接。
HTTP请求报文:第一行是请求行,然后是首部行,然后空行,后面可以有实体主体(或叫消息体)。请求行有三个字段:方法字段(如GET,POST,HEAD,DELETE,PUT),URL字段(带有请求对象的标识),HTTP版本字段。使用GET方法时,实体为空,使用POST时才用到实体主体。HTTP定义了很多首部行。
形式如下:
方法[空格]URL[空格]版本[回车][换行]
首部字段名[冒号][空格]值[回车][换行]
......(多行首部行)
[回车][换行]
实体主体
HTTP相应报文:第一行是状态行,然后是首部行,然后空行,后面是实体主体(包含了请求的对象)。状态行有三个字段:协议版本字段,状态码,相应状态信息。
常用状态:
200 OK 请求成功,信息在返回的相应报文中
400 Bad Request 请求不能被服务器理解
404 Not Found 被请求的文档不在服务器上
形式如下:
版本[空格]状态码[空格]状态信息[回车][换行]
首部字段名[冒号][空格]值[回车][换行]
......(多行首部行)
[回车][换行]
实体主体
HTTP是无状态的,但有些Web站点希望可以识别用户,所以HTTP使用了cookie,它允许站点对用户进行跟踪。cookie技术有四个组件:①HTTP响应报文中的一个cookie首部行,②HTTP请求报文中的一个cookie首部行,③在用户端系统中保留一个cookie,并由用户端的浏览器管理cookie文件,④位于Web站点的一个后端数据库。
Web缓存器(也叫代理服务器),它有自己的磁盘存储空间,保存最近请求过的对象的副本。可以配置用户的浏览器,使得对某对象的浏览器请求先被定向到该Web缓存器(意思就是先来这里找一下,没有的话再和服务器连接,接收到对象的时候存一份副本)。但是存在一个问题,有可能这里面存的已经是旧的了,服务器那边有可能已经更新了。HTTP有一种机制叫做条件GET方法。如果请求报文使用GET方法,并且包含一个“If-Modified-Since”首部行,这就是一个条件GET请求报文。这个首部行后面是一个日期,就是一个上次得到的最后修改日期。这个条件GET请求报文告诉服务器,如果在指定日期后面修改过,才发送该对象,如果没有修改过,响应报文中不会包含请求对象(就不用浪费带宽再发一遍了),状态是304,Not Modified。它告诉缓存器可以使用它缓存的那个对象(没改过)。
还有一种文件传输协议FTP,它也运行在TCP协议上,不过FTP使用了两个并行的TCP连接来传输文件,一个是控制连接,一个是数据连接(用于实际发送一个文件)。因为FTP使用一个独立的控制连接,所以也称FTP的控制连接是带外传送的。相对的,HTTP的控制连接是带内的。
SMTP:简单邮件传输协议。它和HTTP的其中一个区别,HTTP主要是一个拉协议,用户(想接收文件的人)主动来拉取信息,而SMTP基本上是一个推协议,就是要发送的那一方发起连接(主动把邮件推向接收端)。
DNS:域名系统。是一个主机名到IP地址转换的目录服务。DNS协议运行在UDP之上。DNS通常是被应用层的其他协议所使用的,比如HTTP、FTP、SMTP,将用户提供的主机名转换成IP地址。DNS采用分布式的设计方案:根DNS服务器,顶级DNS服务器(负责顶级域名比如com,edu),权威DNS服务器,本地DNS服务器(严格来讲不是层次结构中的)。DNS查询可以是迭代的或者递归的。
本地主机想要查另一个主机名的IP地址,先发一个查询报文给本地DNS服务器,这个本地DNS服务器将报文分别转发给根DNS服务器(获得顶级DNS服务器的地址)、顶级DNS服务器(获得权威DNS服务器的地址)、权威DNS服务器(获得目标主机的IP地址),最后本地DNS服务器把获得的IP地址发回给本地主机。这个流程中,本地主机和本地DNS服务器之间的查询是递归的,本地服务器和其他三个服务器之间的查询是迭代的(是一个一个分别发的,而不是我给你,你给他这样传递)。
为了改善时延性能并且减少因特网上传输的DNS报文数量,DNS广泛使用了缓存技术。当某DNS服务器收到一个DNS回答,它能将其中的信息缓存在本地存储器中,一段时间后丢弃。