标签:inline python 分享 ftp 5.0 udp协议 格式 代理服务 下载文件
应用层的常用的两种网络结构: client-server 结构和 P2P结构(即peer to peer);
在这一层要涉及到端口与进程;各应用之间的通信实际上为各进程之间的通信;用端口号来区分同一台机器上的不同进程;
socket:为进程之间的接口,又称为API(application programming interface), 它可以看信息在出进程中的出入口;
整个结构大致如下图所示:
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的特点:它需要建立两个连接,一个用于 control connection(21端口号),一个用于 data connection(20端口号);
在一个会话期间,control connection一直保留着,所以呢, FTP服务器需要维护着用户的信息;而第一个data connection 则为:每传送一个文件建立一个连接,所以为non-persisent;
命令:略;
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的作用:
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服务器的别名相同;)
这个我觉得很棒啊;下载用户越多,速度越快;
原理:一个用户下载内容时,并不是从服务器上下载文件,而是从其它用户那里下载,即用户之间分享下载;
当一个用户下载一个文件时,它会首先从唯护该文件的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()
标签:inline python 分享 ftp 5.0 udp协议 格式 代理服务 下载文件
原文地址:http://www.cnblogs.com/yinheyi/p/7072524.html