目录
1、进程与计算机网络之间的接口
进程通过一个称为套接字的软件接口向网络发送报文和从网络接收报文。这里,进程可以类比于一个房子,而它的套接字相当于它的门,当一个进程想向位于另一台主机上的另一个进程发送报文时,就把报文推出该门(套接字)。一旦该报文抵达目的主机,它通过接受进程的门(套接字)传递,然后接收进程对该报文进行处理。
由于该套接字是建立网络应用程序的可编程接口,因此套接字也称为应用程序与网络之间的应用程序编程接口。
2、何为应用层协议
应用层协议定义了在运行在不同端系统上的应用程序如何相互传递报文,具体:
- 交换的报文类型,例如请求报文和响应报文。
- 各种报文类型的语法。
- 字段的语义,即字段中包含信息的含义。
- 一个进程何时以及如何发送报文,对报文响应的规则。
3、SSL
因为隐私和其它安全问题对许多应用而言已经成为至关重要的问题,所以安全套接字层(Secure Sockets Layer,SSL)应运而生。SSL提供了关键的进程到进程的安全性服务,包括加密,数据完整性和端点鉴别。需要强调的是,SSL不是与TCP和UDP在相同层次的运输协议,而是一种对TCP的加强,这种加强实在应用层实现的。
4、HTTP
HTTP定义了Web客户向Web服务器请求Web页面的方式,以及服务器向客户传送Web页面的方式。HTTP服务器并不保存关于客户的任何信息,所以我们说HTTP是一个无状态协议。
HTTP可以使用非持续连接或持续连接。非持续连接中每个TCP连接在服务器发送一个对象后关闭,即该连接不为其它的对象而持续下来,只传输一个请求报文和一个响应报文。而持续连接中,如果一条连接经过一定时间间隔仍未被使用,HTTP服务器才关闭该连接。HTTP的默认模式是使用带流水线的持续连接。
(1)HTTP请求报文格式
下面提供了一个典型的HTTP 请求报文:
GET /somedir/page.html HTTP/l.l
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
HTTP 请求报文的第一行叫做请求行 (request line) ,其后继的行叫做首部行( header line)。请求行有个字段:方法字段、URL字段和HTTP 版本字段。你也许认为该首部行是不必要的,因为在该主机中已经有一条 TCP连接存在了,但是,该首部行提供的信息是 Web 代理高速缓存所要求的。通过包含Connection: close 首部行,该浏览器告诉服务器不希望麻烦地使用持续连接,它要求服务器在发送完被请求的对象后就关闭这条连接。User- agent: 首部行用来指明用户代理,即向服务器发送请求的浏览器的类型。
通用格式如下:
值得注意的是,这里的请求包体不需要编码为ASCII码。
(2)HTTP响应报文格式
下面我们提供了一条典型的 HTTP 响应报文:
HTTP/ 1. 1 200 OK
Connection: close 应用层
Date: Tue , 09 Aug 2011 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue , 09 Aug 2011 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ...)
它有三个部分:初始状态行 (sLatus line) ,首部行 (header 1ine) ,实体体 (enLity body)。
通用格式如下:
一些常见的状态码和相关短语包括:
200 OK:表示客户端请求成功;
400 Bad Request:表示客户端请求有语法错误,不能被服务器所理解;
401 Unauthonzed:表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用;
403 Forbidden:表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因;
404 Not Found:请求的资源不存在,例如,输入了错误的URL;
500 Internal Server Error:表示服务器发生不可预期的错误,导致无法完成客户端的请求;
503 Service Unavailable:表示服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常;
(3)cookie
HTTP协议作为无状态协议,对于HTTP协议而言,无状态同样指每次request请求之前是相互独立的,当前请求并不会记录它的上一次请求信息。那么问题来了,既然无状态,那完成一套完整的业务逻辑,发送多次请求的情况数不胜数,使用http如何将上下文请求进行关联呢?机智的人类通过优化,找到了一种简单的方式记录http协议的请求信息。
浏览器发送request请求到服务器,服务器除了返回请求的response之外,还给请求分配一个唯一标识ID,协同response一并返回给浏览器。
同时服务器在本地创建一个MAP结构,专门以key-value(请求ID-会话内容)形式将每个request进行存储。
此时浏览器的request已经被赋予了一个ID,第二次访问时,服务器先从request中查找该ID,根据ID查找维护会话的content内容,该内容中记录了上一次request的信息状态。
根据查找出的request信息生成基于这些信息的response内容,再次返回给浏览器。如果有需要会再次更新会话内容,为下一次请求提供准备。
所以当我们有cookie时,往往能在一个网站直接显示登录账号和登录密码,这两个信息是存在服务器的而不是本机的(以前一直都有的疑惑),通过cookie生成的响应报文包含了账号密码信息。以前还有一个疑惑,就是当本地删除了cookie文件后,下次访问该网站又会生产新的cookie,那难道服务器的账号密码信息一直存着不就占位子吗,实际上,服务器上的cookie信息都是有过期时间的,这在报文中其实也会有记录(expire time)的并存在cookie文件中。
一般cookie所具有的属性,包括:
Domain:域,表示当前cookie所属于哪个域或子域下面。
对于服务器返回的Set-Cookie中,如果没有指定Domain的值,那么其Domain的值是默认为当前所提交的http的请求所对应的主域名的。比如访问 http://www.example.com,返回一个cookie,没有指名domain值,那么其为值为默认的www.example.com。
Path:表示cookie的所属路径。
Expire time/Max-age:表示了cookie的有效期。expire的值,是一个时间,过了这个时间,该cookie就失效了。或者是用max-age指定当前cookie是在多长时间之后而失效。如果服务器返回的一个cookie,没有指定其expire time,那么表明此cookie有效期只是当前的session,即是session cookie,当前session会话结束后,就过期了。对应的,当关闭(浏览器中)该页面的时候,此cookie就应该被浏览器所删除了。
secure:表示该cookie只能用https传输。一般用于包含认证信息的cookie,要求传输此cookie的时候,必须用https传输。
httponly:表示此cookie必须用于http或https传输。这意味着,浏览器脚本,比如javascript中,是不允许访问操作此cookie的。
(4)web缓存
Web缓存器也叫代理服务器,它能够缓存最近请求过的对象的副本,若Web缓存器中有请求的资源,则立刻返回之,而不需要再向目标服务器请求该资源。
但是如何确保缓存服务器中自身副本是最新的呢?使用的是条件GET方法:
如果请求报文使用GET方法,且包含一个”If-Modified-Since”首部行,那么这个报文就是一个条件GET请求报文。
每次有新的请求,Web服务器就会发送一个条件GET请求报文(上次缓存该资源会记录该资源最后修改的时间),来判断该资源从自己缓存后是否有修改过,这样就确保了自身副本的有效性。
5、FTP
HTTP FTP 都是文件传输协议,并且有很多共同的特点,例如,它们都运行在 TCP,然而,这两个应用层协议也有一些重要的区别 其中最显著的就是 FTP 使用了两个并行的 TCP 连接来传输文件, 个是控制连接 (control connection) ,一个是数据连接( data connection) 控制连接用于在两主机之间传输控制信息,如用户标识、口令、改变远程目录的命令以及"存放”(put)” 和”获取(get) “文件的命令。数据连接用于实际发送一个文件。而对FTP传输而言,控制连接贯穿了整个用户会话期间,但是对会话巾的每一次文件传输都需要建立一个新的数据连接(即数据连接是非持续的)。FTP 服务器必须在整个会话期间保留用户的状态( state) 。
一些较为常见的命令如下:
• USER usemame: 用于向服务器传送用户标识
• PASS password: 用于向服务器发送用户口令
• LIST: 用于请求服务器回送当前远程目录中的所有文件列表 该文件列表是经一个(新建且非持续连接)数据连接传送的,而不是在控制 TCP 连接上传送。
• RETR filename: 用于从远程主机当前目录检索(即get) 文件 该命令引起远程主机发起一个数据连接,并经该数据连接发送所请求的文件。
• STOR filename: 用于在远程主机的当前目录上存放(即 put) 文件 。
一些典型的回答连同它们可能的报文如下所示:
• 331 Usemame OK , Password required (用户名 OK ,需要口令)
• 125 Data connection already open; transfer starting (数据连接已经打开,开始传送)
• 425 Can' L open data connection (无法打开数据连接)
• 452 Error writing file (写文件差错)
6、电子邮件
电子邮件系统有三个主要的组成部分:
用户代理,邮件服务器和简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)。其中用户代理允许用户阅读、回复、转发、保存和撰写报文。
(1)STMP
STMP使用TCP可靠数据传输服务,用的是持续连接:如果发送邮件服务器有几个报文同时发往同一个接受邮件服务器,它可以通过同一个TCP连接发送这些报文。
一个典型的报文首部如下:
From: alice@crepes.fr
To: bob@hamburger.edu
Subject: Searching for the meaning of life.
每个首部必须含有一个From:首部行和一个To:首部行;一个首部也许包含一个Subject:首部行以及其它可选的首部行。在报文首部之后,紧接着是一个空白行,然后是以ASCII格式表示的报文主体。
多用途因特网邮件扩展(MIME)是对RFC 822的扩展。
支持多媒体的两个关键MIME首部是Content-Type:和Content-Transfer-Encoding:。
简单比较一下STMP和HTTP,他们都是传送文件的协议,并且持续的HTTP和SMTP都使用的是持续连接。但是他们也有一些区别:
- HTTP主要是一个拉协议,用户使用HTTP从服务器拉去一些信息,特别是TCP连接是由想接受文件的机器发起的。而STMP基本是一个推协议,TCP连接是由要发送该文件的机器发起的。
- STMP要求每个报文使用7比特的ASCII码格式,HTTP不受这种限制。
- HTTP将每个对象封装到自己的HTTP响应报文中,而SMTP则把所有报文对象放在一个报文之中。
(2)邮件访问协议
在Alice向Bob发送邮件的过程中,Bob是如何通过运行在他本地PC上的用户代理,获得位于某ISP的邮件服务器上的他的邮件呢?注意到Bob的用户代理不能使用SMTP来取回邮件,因为取邮件时一个拉操作,而SMTP是一个推协议。因此我们要引入邮件访问协议。
邮件访问协议有:
·POP3:第三版邮局协议 [RFC 1939]
·IMAP:互联网邮件访问协议 [RFC 1730]
·HTTP:Hotmail , Yahoo! Mail等
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,是TCP/IP协议族中的一员(默认端口是110)。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。
IMAP全称是Internet Mail Access Protocol,即互联网邮件访问协议,是一个应用层协议(端口是143)。IMAP服务器把每一个把每个报文与一个文件夹联系起来;当报文第一次到达服务器时,它与收件人的INBOX文件夹相关联。收件人则能够把邮件移动到一个新的、用户创建的文件夹中,阅读和删除邮件。IMAP另一个重要特性是它具有允许用户代理获取报文组件的命令,比如比读取一个报文的首部或多部份MIME报文的一部分。
IMAP和POP3的区别:
(1)IMAP提供Webmail与电子邮件客户端之间的双向通信,客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上。而POP3在客户端的操作不会反馈到服务器上。
(2)IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。
(3)POP3需要下载未阅读的邮件,IMAP可以不用把所有的邮件全部下载,而是通过客户端直接对服务器上的邮件进行操作。所有通过IMAP传输的数据都会被加密,从而保证通信的安全性。
7、DNS
能进行主机名到地址转换的目录服务,就是域名系统(Domain Name System , DNS) 的主要任务。DNS 是:
①一个由分层的 DNS 服务器( DNS server) 实现的分布式数据库
②一个使得主机能够查询分布式数据库的应用层协议
DNS 服务器通常是运行 BIND (Berkeley Internet Name Domain) 软件[ BIND 2012 UNJX 机器。DNS协议运行在UDP之上,使用 53 号端口。
为了使用户的主机能够将一个 HTTP请求报文发送到Web服务器 www someschool. edu,该用户主机必须获得www. someschool. edu的IP地址,其做法如下:
- 同一台用户主机上运行着 DNS 应用的客户端。
- 浏览器从上述 URL中抽取出主机名 www. someschool. edu ,并将这台主机名传给DNS 应用的客户端。
- DNS 客户向 DNS 服务器发送一个包含主机名的请求。这里客户首先与根服务器之一联系,它将返回顶级域名edu的TLD(Top-Level Domain,顶级域)服务器的IP地址。该客户则与这些TLD服务器之一联系,它将为 someschool. edu返回权威服务器的 IP 地址。最后,该客户与someschool. edu权威服务器之一联系,它为主机名www. someschool. edu返回其IP地址。
- DNS 客户最终会收到一份回答报文,其中含有对应于该主机名的 IP 地址。
- 一旦浏览器接收到来自 DNS 的该IP地址,它能够向位于该 lP 地址80端口的HTTP服务器进程发起一个 TCP 连接。
除了主机名到IP地址的转换外,DNS还提供一些重要的服务:
- 主机别名。有着复杂主机名的主机能拥有一个或多个别名。应用程序可以调用DNS来获得主机别名对应的规范主机名以及主机的IP地址。
- 邮件服务器别名。
- 负载分配。一个IP地址集合可以与同一个规范主机名相联系。DNS数据库中存储着这些IP地址的集合。当客户对映射到某地址集合的名字发出一个DNS请求时,该服务器用IP地址的整个集合进行响应,但在每个回答中循环这些地址的次序。所以就循环分配了负载。 这里DNS服务器的分配算法采用的最简单的轮询算法。
使用DNS进行负载分配的缺点:
- 目前的DNS是多级解析的,每一级DNS都可能缓存A记录,当某台服务器下线之后,即使修改了A记录,要使其生效也需要较长的时间,这段时间,DNS任然会将域名解析到已下线的服务器上,最终导致用户访问失败。
- 不能够按服务器的处理能力来分配负载。DNS负载均衡采用的是简单的轮询算法,不能区分服务器之间的差异,不能反映服务器当前运行状态,所以其的负载均衡效果并不是太好。
- 可能会造成额外的网络问题。为了使本DNS服务器和其他DNS服务器及时交互,保证DNS数据及时更新,使地址能随机分配,一般都要将DNS的刷新时间设置的较小,但太小将会使DNS流量大增造成额外的网络问题。
DNS系统还有一个非常重要的特色:DNS缓存。DNS缓存的原理非常简单。在一个请求链中,当某DNS服务器接收一个DNS回答时,它能将该回答中的信息缓存在本地存储器中,一段时间后(通常设置为两天)再丢弃缓存的信息。
每个DNS回答报文包含了一条或多条资源记录。资源记录是一个包含了下列字段的4元组:
(Name,Value,Type,TTL)
TTL是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。Name和Value的值取决于Type:
如果Type=A,则Name是主机名,Value是该主机名对应的IP地址。
如果Type=NS,则Name是个域(如foo.com),而Value是个知道如何获得该域中主机IP地址的权威DNS服务器的主机名。
如果Type=CNAME,则Value是别名为Name的主机对应的规范主机名。
如果Type=MX,则Value是个别名为Name的邮件服务器的规范主机名。
8、BitTorrent
先来一个总结:该协议简单来说就是客户分担了服务器的上载。
参与一个特定文件分发的所有对等方的集合被称为一个洪流。在一个洪流中的对等方彼此下载等长度的文件块,典型的块长度为256KB。当一个对等方加入某洪流时,它向追踪器注册自己,并周期性地通知追踪器它仍在该洪流中。
在该洪流中的Alice周期性地(经TCP连接)询问每个邻近对等方它们所具有的块列表。因此在任何给定的时刻,Alice将具有块的子集并知道它的邻居具有哪些块。这里就会有几个问题:
第一,她应当从她的邻居请求那些块呢?
这里使用的是一种称为最稀缺优先的技术:针对她没有的块在她的邻居中决定最稀缺的块(最稀缺的块就是那些在她的邻居中副本数量最少的块),并首先请求那些最稀缺的块。这样,最稀缺块得到更为迅速的重新分发,其目标是均衡每个块在洪流中的副本数量。
第二,她应当向哪些向她请求块的邻居发送?
这里使用了一种对换算法:对于当前能够以最高速率向她提供数据的邻居,给出其优先权。
参考文章:《计算机网络自顶向下方法》