应用层的常用的两种网络结构: client-server 结构和 P2P结构(即peer to peer);
在这一层要涉及到端口与进程;各应用之间的通信实际上为各进程之间的通信;用端口号来区分同一台机器上的不同进程;
socket:为进程之间的接口,又称为API(application programming interface), 它可以看信息在出进程中的出入口;
整个结构大致如下图所示:
WEB与HTTP:
HTTP为超文本传输协议,(HyperText transfer protocol)
HTTP协议为 client-server模式,不同保留client的人任何信息,所以为stateless protocol;
message 格式,如下:
#请求协议: GET /somedir/page.html HTTP/1.1 #该行是 request line; 其中GET为方法字段;如:GET, POST, HEAD, PUT, and DELETE; Host: www.someschool.edu #下面几行为header lines; Connection: close User-agent: Mozilla/5.0 Accept-language: fr (空行)其中的Host的行对缓存服务器很有必要的;
#应答 HTTP/1.1 200 OK #该行是状态行; Connection: close #下面几行为header lines; 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 ...)web中的cookies:
cookies可以用于网站的服务器跟踪客户信息;经常用于购物网站之类的;使用coocies的四个必要条件:
1. 在response message中包含关于cookie的 header line;
2. 在request message中包含关于cookie的header line;
3. 本地有一个关于cookie号与网站对应的cookies的文件;
4. 服务器端有一个后台记录不同cookie号的行为的back-end database(后台数据库);
原理:
第一:当你第一次请求一个网站时,该网站会首先在后台数据库建立一个新的cookie 号的记录,然后在response message中加入这个 identification number;
第二:浏览器收到以后,会在自己的本地cookie文件中加入这个一个identification number以及对应的网站信息;
第三:当再次访问该网站时,浏览器先查看本地的cookie文件中有没有对应该 网站的cookie号,如果有的话,把它加入到 request message中去;
第四:服务器收到请信息后,查看后台有没有相关的cookie 号,如果有,再执行后续操作;
缓存服务器(或代理服务器):
它就是在clinet与server之间加入的一个代理服务器,当client请求一个网站时,先去它那里查找有没有缓存的信息,如果有,直接从它这里取就可以了,如果没有,代理服务器再向server请求;
它的作用很大,用于绶解server的压力、减少一个机构的向外部的带宽、减少时延等;
一个问题就是:如何确保请求到的信息是最新的?
答:使用Conditional GET; 代理服务器请求server使用conditional GET, 根据最后修改的时间,如果没有修改则不用返回内容;如果修改则需要返回内容啦;
FTP:
FTP的特点:它需要建立两个连接,一个用于 control connection(21端口号),一个用于 data connection(20端口号);
在一个会话期间,control connection一直保留着,所以呢, FTP服务器需要维护着用户的信息;而第一个data connection 则为:每传送一个文件建立一个连接,所以为non-persisent;
命令:略;
Electronic Mail 与SMTP
email发送的整个view如下图所示:
首先邮件发送方把通过 SMTP 把邮件发送到自己的邮箱的服务器,然后,该服务器把邮件通过 SMTP 发送到接收方的服务器,接收方又通过POP3/IMAP/HTTP把邮件从他的服务器上得到邮件;
SMTP:
指 Simple mail transfer protocol
它的特点:1, 邮件消息需要是简单的7位的ASCII编码;
2. 它是一个push 协议;、client把消息push在服务器;(而HTTP为pull协议,client把消息从服务上pull下来);
3. 端口为25;
4. 它负责邮件发送方把邮件发送到自己的服务器上,负责服务器之间的transfer;
邮件访问 protocol:
对于邮件接收方,不是通过SMTP来获取邮件的;而是通过 POP3, IMAP,或HTTP来得到;如下图所示:
上面三个协议的操作各不相同的哦;端口也不一样
注意:1. 能否直接从邮件发送方直接发送给邮件接收方呢?当然可以。 不过这样的话,接收方需要一直开机,并且发送如果也不能保证一直发送暂时没有发送出去的邮件啦; 总之这样很不方便,也很不可靠;
2. 中间服务器问题:邮件基本上都是直接通过发送方的服务器直接发送到接收方的服务器,中间不通过其它的服务器的,即使中间的距离为半个地球;
NDS:绝对是非常重要的应用层协议:(domain name system)
NDS的作用:
1. 把主机名转换为IP地址;
2. 可以让主机有多个别名:
3. 可以让邮件服务器有别名;
4. 对于分布式服务器来说 ,可以让一个主机名对应多个服务器的IP地址,这样,分担了单个服务器的压力;
在应用层的中的应用原理:
如在浏览器中的HTTP协议,首先在URL中提取到hostname给运行在本地主机上的DNS的客户端, 客户端负责从DNS服务器中得到相应的IP;然后,浏览器从DNS客户端收到了IP,然后进行TCP/UDP就可以了;
DNS服务器的分布似分布:
DNS服务器采用分层似的结构,最上层为根域名服务器;第二层为顶级域名服务器,第三层为authoritative域名服务器;
另外,还有一个重要的本地域名服务器,当本地主机要防问域名服务器时,可以先防问本地的域名服务器,然后由本地域名服务器作为代理来防问其它的分层结构的域名服务器;这样设计可以在DNS的采用cache时很有用的,再说你的电脑性能可能不如专用的DNS服务器;
分级的域名服务器示意图:
通常情况下:根域名服务器给顶级域名服务器的IP,顶级域名服务器给出authoritative域名服务器的IP来,而authoritative域名服务器中会有要找到的对应主机上名的IP;下面是一个图表示了这个过程:
DNS cache:
它真的真的特别重要啊;功能与代理服务器差不多;
DNS的communicate:
dns通过UDP协议和端口53进行;
它的query与reply的message的格式如下:
DNS的记录:
基本格式为: Name, Value, Type, TTL
其中TTL表示本记录要保留在cache中的时间; Type表示类型,Name与Value的与Type有关;
如Type为A时, Name为主机名,Value为对应的IP;
类型为NS时,Name为域名,Value为authoritative域名器的主机名;如: foo.com, dns.foo.com, NS
类型为CNAME时, Name为主机的别名, Value为主机的 标准名字(canonical hostname);
类型为MX时, Name为mail服务器的主机的别名, Value为对应的 标准名字(canonical name);
(利用MX记录,Mail服务器的别名可以与WEB服务器的别名相同;)
P2P协议:
这个我觉得很棒啊;下载用户越多,速度越快;
原理:一个用户下载内容时,并不是从服务器上下载文件,而是从其它用户那里下载,即用户之间分享下载;
当一个用户下载一个文件时,它会首先从唯护该文件的tracker的服务器里得到一个该文件的tracker,它其实就是一个正在下载该文件或者拥有该文件的用户列表; 得到这个列表以后,本用户就可以从这些用户中下载该文件了;
在一开始的BT中,需要一些服务器来维护各种下载文件的tracker, 而现在呢?采用了DHT方法(distribute hash tables,分布式哈希表);它是什么玩意呢?它把以前服务器的保存的与文件相关的路由与信息分散到了各个peer中去了;不需要tracker服务器也继续可以下载;
整体是这样的,其它一些细节不深入研究;
实验:
简单的基于UDP协议的应用:
客户端的程序:
#!/usr/bin/python # -*- coding: utf-8 -*- from socket import * serverName = '192.168.199.202' serverPort = 12000 # 创建一个名为clientSocket的socket: # 其中第一个参数表示使用IPv4地址格式, 第二个参数表示使用UDP协议; clientSocket = socket(AF_INET, SOCK_DGRAM) message = raw_input('Input lowercase sentence:') clientSocket.sendto(message, (serverName, serverPort)) # 其中的2048表示用于接收数据的buffer size; # serverAddress里面包括了IP与端口信息; modifiedMessage, serverAddress = clientSocket.recvfrom(2048) print modifiedMessage clientSocket.close()服务器端的程序:
#!/usr/bin/python # -*- coding: utf-8 -*- from socket import * serverPort = 12000 serverSocket = socket(AF_INET, SOCK_DGRAM) # 这一句话,指定了server的端口; serverSocket.bind(('', serverPort)) print "The server is ready to receive" while 1: message, clientAddress = serverSocket.recvfrom(2048) modifiedMessage = message.upper() serverSocket.sendto(modifiedMessage, clientAddress)
简单的基于TCP协议的应用:
客户端的程序:
#!/usr/bin/python # -*- coding: utf-8 -*- from socket import * serverName = '192.168.199.202' serverPort = 12001 # 第二参数的含义为使用TCP协议,在客户端中,我们不需要加入主地的IP与端口信息, # 这个由系统自己完成就可以了; clientSocket = socket(AF_INET, SOCK_STREAM) # 下面一条代码的含义为:从客户端建立到服务器端的连接,即三次握手; clientSocket.connect((serverName, serverPort)) sentence = raw_input('Input a lowercase sentence:') clientSocket.send(sentence) modifiedSentence = clientSocket.recv(2048) # 关闭的时候,会从client端发送一条信息到server端,告诉服务器,我要关闭这个连接了; print 'From Server:', modifiedSentence clientSocket.close()服务器端的程序:
#!/usr/bin/python # -*- coding: utf-8 -*- from socket import * serverPort = 12001 serverSocket = socket(AF_INET, SOCK_STREAM) # 下面这个socket为是TCP中的welcoming soc; serverSocket.bind(('', serverPort)) # 它表示了server??正在进行listen从client发出的握手请求; # 参数1表示最大的连接数目,最小为1; serverSocket.listen(1) print 'The server is ready to receive' while 1: # 当有客户端来握手时,建立一个connectionSocket; connectionSocket, address = serverSocket.accept() sentence = connectionSocket.recv(2048) capitalizedSentence = sentence.upper() connectionSocket.send(capitalizedSentence) #这时connectionSocket会关闭,而serverSocket不会关闭; connectionSocket.close()
############### 2017年9月7日补充 #########################
一:应用层的协议原理:
1. 网络应用程序的体系结构大致分为两种:一种就是 主机/客户 型, 一种就是 P2P型;
2. 在应用层之间的通信为:两个进程之间的通信;进程与网络的接口为socekt(套接字);
3. 进程收到的或发送的,通常称为是 报文;
二:Web与HTTP协议
1. Web的应该协议为HTTP(超文本传输协议); 一个Web界面可以由多个文件组成,如HTML文件与图片; 如果要得到这个页面,需要用于URL: 由主机名 + 路径 组成;
2. 基于TCP协议传输时, 分为 无状态连接与持久连接;
无状态连接: 传输一个web内的多个文件时,使用不同的TCP连接;
持久连接: 传输一个web内的多个文件时, 使用同一个TCP连接;
对于浏览器,用户可以控制TCP连接的并行个数,大部分支持8-10个;
HTTP的默认模式使用流水线形的持久连接;
3. HTTP请求消息的格式为:
方法:GET/POST/HEAD/PUT/DELETE/
在使用GET字段时,附属体为空; POST: 会把内容加到实体里面,用于提交用户的表单,如关键字等; HEAD: 使用HEAD时,返回一个特定的HTTP报文,不是返回请求对象,常用于故障跟踪;PUT可以上传、DELETE可以删除服务器的象;
URL:表示URL;
版本: 表示HTTP的版本;
头部行,就可以有多种了, 不具体说;Host段很重要,它提供的信息是Web 代理高速缓存需要的;
#请求协议: GET /somedir/page.html HTTP/1.1 #该行是 request line; 其中GET为方法字段;如:GET, POST, HEAD, PUT, and DELETE; Host: www.someschool.edu # 这个很重要,它提供的信息是Web 代理高速缓存需要的; User-agent: Mozilla/5.0 Accept-language: fr (空行)
4. HTTP响应消息的格式:
版本: 表示HTTP协议的版本;
重点说说状态码与原因短语, 包括如下:
5. cookie
使用它,服务器可以识别特征的用户了;通过下面四个条件:
1. 在响应报文中加入了一个set cookie 字段; (用于第一次给用户传用一个cookie的值;)
2. 在请求报文中加入了一个cookie 字段;
3. 在服务器端有一个放cookie值的数据库;
4. 在用户的浏览器端也有一个放cookie的文件;
5. Web缓存:
Web缓存太重要了,它也叫做代理服务器;有用户用真正的服务器之间起来缓存代理的作用; 它里面放了服务器响应用户信息的拷贝,当用户再次请求相同的消息时,就可以从代理服务器得到了;
一个知识点: 条件GET
在GET请求字段中加了一个 If-modified-since字段, 当代理服务器用真正的服务器进行条件请求时,如果没有修改就不会返回请求的对象,当修改了的时候,才返回请求的对象;
三、文件传输协议:FTP
1. FTP协议使用两条并行的TCP连接,一个用于控制连接(端口号为21),一个用于数据连接(可能为20,也可能不是);
2. 控制连接为持久连接, 数据连接为非状态连接;
3.
四、 SMTP协议
1. 用于邮件的协议;端口号为25;
2. 使用TCP协议;
3. 与HTTP协议相比:HTTP为一个拉协议, SMTP为一个推协议; HTTP把每一个对象放入响应报文中,SMTP把所有对象放到一个响应报文中;SMTP要求每个报文都使用7位的ASCII表示;
五:DNS:目录服务
1. 使用UDP协议,端口号为53;
2. 它是分层工作的;
3. 负责主机名到IP的转换; 另外负责:主机别名、邮件服务器别名的转换;
4. 三种类型的域名服务器: 根DNS域名服务器(13个)、顶级域名服务器(com/gov/edu/以及各个国家)、权威域名服务器(学校、公司等);
5. 本地域名服务器特别地重要;每一个ISP都有一个本地的域名服务器;
参考:Computer Networking—a top-down approach 作者:kurose 和 ross, 第六版;