标签(空格分隔): 未分类html
网络应用是计算机网络存在的理由web
TCP
和UDP
上的应用程序.
API
Python
写一些简单的客户-服务器应用程序.应用程序体系结构(application architecture)
: 由应用程序研发者设计,规定了如何在各类端系统上组织该应用程序.
服务器
:有一个老是打开的主机称为服务器,它服务于来自许多其余称为客户的主机.
google
,facebook
,甚至要组建数据中心来处理.客户互相之间不通讯.算法
经常使用应用: 典型的有Web
,Telent
和电子邮件.数据库
对位于数据中心的专用服务器有最小(甚至没有)的依赖.编程
在主机对之间使用直接通讯,这些主机被称为对等方后端
BitTorrent
Skype
PPStream
将来P2P应用面临三个主要问题api
ISP
友好:大多数住宅ISP
受制于"非对称的" 带宽应用进程(process)
在给定的一对进程之间的通讯会话场景中,发起通讯(即在该会话开始时发起与其余进程联系)的进程被标识为客户,另外一方等待链接的是服务器.浏览器
套接字(socket)
:进程经过一个称为套接字的软件接口向网络发送电报和从网络接收电报.
应用程序编程接口(Application Programming Interface ,API)
.IP地址(IP address)
端口号(port number)
从四个方面对运输服务分类: 可靠数据传输,吞吐量,定时和安全性缓存
就是所谓的丢包安全
可靠运输传输(reliable data transfer)
:提供这种服务,确信数据能无差错到达接收进程.
允许丢失的应用(loss-tolerant application)
就是所谓的下载速度
带宽敏感的应用(bandwidth-sensitive application)
弹性应用(elastic application)
:根据状况利用带宽.
有的运输层协议也能提供定时保证.
TCP 链接(TCP connection)
TCP
,无差错,按适当顺序交付全部发送的数据.TCP
协议还具备拥塞控制阶段
安全套接字层(Secure Sockets Layer,SSL
:为了提高安全性,提供了一种TCP
的增强版本SSL
SSL
并非跟TCP/UDP
并列的协议UDP
是一种不提供没必要要服务的轻量级运输协议,它仅提供最小服务.
没有拥塞控制
应用层协议(application-layer protocal)
: 定义了运行在不一样端系统上的应用程序如何相互传递报文.
超文本传输协议(HyperText Transfer Protocal,HTTP)
:Web的应用层协议,Web的核心.HTTP
使用TCP
做为它的支撑运输协议.
HTTP
客户向服务器发起一个与服务器的TCP
连接,连接创建后,经过套接字接口访问TCP
HTTP
是一个无状态协议(stateless protocal)
cookie
,session
对象(object)
: Web页面由对象组成,一个对象是一个文件
一个HTML
页面,JPEG
图形,CSS
文件..........
非持续链接(non-persistent connection)
TCP
链接发送.持续链接(persistent connection)
TCP
链接发送.往返时间(Round-Trip Time,RTT)
:一个短分组从客户到服务端,再从服务端到客户端说花的时间
TCP
链接在服务器发送完一个对象后就关闭
TCP
链接只传输一个请求报文和一个响应报文相对于持续链接,每次请求对象,须要多花一个RTT
的时间.
RTT
的时间来握手.给出一个典型的HTTP请求报文
GET /somedir/page.html HTTP/1.1 Host:wwww.someschool.edu Connection: close User-agent: Mozilla/5.0 Accept-language: fr
请求行(request line)
:HTTP请求报文的第一行
GET
,POST
,HEAD
,PUT
和DELETE
GET
,POST
首部行(header line)
: 其后继的行
Host
:指明对象在的主机Connection
: 指明是否持续链接User-agent
: 指明客户浏览器Accept-language
: 指望获得的对象版本.实体主体
: 当方法字段为POST
时使用
HEAD
:相似GET,但只要求返回响应报文,不须要对象
PUT
: 容许用户上传对象到指定的Web服务器上的指定路径.DELETE
:容许用户删除HTTP/1.1 200 OK Connection: close Date:Tue , 09 Aug 2011 15:44:04 GMT Server: Apache/2.2.3 (CentOS) Last-Modified:09 Aug 2011 15:11:04 GMT Content-Length: 6821 Content-Type:text/html (data data.............)
状态行(status line)
: 协议版本字段,状态码,相应的状态信息首部行(header line)
Last-Modified
: 请求对象的最后修改时间
实体主体(entity body)
: 报文主要部分,即所请求的对象
cookie
: 容许站点对用户进行追踪
cookie
技术有四个组件:
HTTP
响应报文的一个cookie
首部行HTTP
请求报文的一个cookie
首部行对用户的隐私有侵害.
Web 缓存器(Web cache)
也叫代理服务器(proxy server),它是可以表明初始Web服务器知足HTTP
请求的网络实体.
Web缓存器
有本身的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本ISP
购买并安装.Web
缓存器有两大缘由.
0.2~0.7
之间内容分发网络(Content Distribution NetWork,CND)
:地理上分散的缓存器,使大量流量本地化.
CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,经过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,下降网络拥塞,提升用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
CDN的基本原理是普遍采用各类缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工做正常的缓存服务器上,由缓存服务器直接响应用户请求。
条件GET(conditional GET)方法
: HTTP协议有一种机制,容许缓存器证明它的对象是最新的,这种机制就是条件GET方法.
GET
If-Modified-Since:
首部行请求报文
GET /fruit/kiwi.gif HTTP/1.1 Host: www.exotiquecuisine.com If-Modified-Since: wed, 7 Sep 2011 09:23:24
若是证明是最新的的响应报文304
```
HTTP/1.1 304 Not Modified
Date:Sat, 15 Oct 2011 15:39:29
Server: Apache/1.3.0 (Unix)
(empty entity body)
```
FTP
使用并行的TCP
链接来传输文件,一个是控制链接(control connection)
,一个是数据链接(data connection)
.
存放(put)
和获取(get)
文件的命令.带外传送(out-of-band)
:由于FTP有个独立的控制连接
状态(state)
.
FTP
同时维持的会话总数.HTTP
的优点.每一个命令由4个大写字母组成,有些还有可选参数
USER username :传递用户标识 PASS password :用于向服务器发送用户口令 LIST: 用户请求服务器回送当前远程目录中的全部文件列表.该文件列表是经一个数据传送 RETR filename: get 文件 STOR filename: put 文件
回答老是3位数字,后面跟一个可选信息
331 Username OK,Password required 125 Data connection already open;transfer starting 425 Can't open data connection 452 Error writing file
详细学习请阅读RFC 959
用户代理(user agent)
Outlook
,Apple Mail
,QQ mail
邮件服务器(mail server)
邮箱(mailbox)
: 管理和维护发送给邮箱主人的报文.简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)
TCP
协议.7
比特ASCII
HTTP
并不须要SMTP
通常不使用中间邮件服务器发送邮件,即便这两个邮件服务器位于地球的两端也是这样.CRLF.CRLF
结束
CR
:回车LF
:换行QUIT
做为断开链接的命令.关于推拉
SMTP
是一种推格式,因此在取报文时,不用SMTP
协议.HTTP
主要是拉格式对于报文的格式
SMTP
强制要求7比特ASCII码HTTP
不要求既包含文本又包含图片的文档
HTTP
: 一个对象一个响应报文.SMTP
: 所有赛一块儿.SMTP
协议格式,注意注意From: alice@crepes.fr To: bob@hamburger.edu Subject: Searching for the meaning of life This is main text.
From
,To
首部行Subject
等首部行.报文体: 用一个空行相隔
RFC 5322定义.
SMTP
取回报文.
SMTP
只能进行拉操做.第三版的邮局协议(Post Office Protocol--Version 3,POP3)
因特网邮件访问协议(Internet Mail Access Protocol,IMAP)
HTTP
POP3
是一个极为简单的邮件访问协议.
特许(authorization)阶段
:用户代理(以明文形式)发送用户名和口令鉴别用户
user <user name>
pass <password>
事务处理阶段
:
list
: 展开列表retr <mailname>
: 打开指定邮件dele <mailname>
:quit
:进入更新阶段更新阶段
:邮件服务器删除那些被标记为删除的报文.服务器的回答只有两种: +OK
,-ERR
POP3
没有给用户提供任何建立远程文件夹并未报文指派文件夹的方法.
如上所说,POP3
没有给用户提供任何建立远程文件夹并未报文指派文件夹的方法.因此IMAP
应运而生.
IMAP
也是一个邮件访问协议,比POP3
更加复杂和功能齐全.
HTTP
而不是其他POP3
,IMAP
.HTTP
,而不是SMTP
.SMTP
域名系统(Domain Name System)
: 主机名到IP地址转换的目录服务.
DNS服务器
实现的分布式数据库.DNS
使用的运输层协议是UDP
,使用 53
号端口其他服务
主机别名(host aliasing)
邮件服务器别名(mail server aliasing)
负载分配(load distribution)
IP
,循环的使同一个域名下每一个主机负载均衡.UNIX
的系统可使用gethostbyname()
这样的API
调用DNS.DNS
向网络发送一个DNS
查询报文.
DNS
报文接受和发送都是经过UDP
经端口53
发送.DNS
回答报文,包含了所须要的IP
.DNS
是因特网上实现分布式数据库的精彩典范
假定一个客户须要知道www.amazon.com的IP地址
- 首先与根服务器联系,返回顶级域名com的TLD服务器的IP地址.
- 而后与TLD服务器之一练习,将返回amazon.com的权威服务器地址.
- 最后,与权威服务器地址联系,返回www.amazon.con 的IP地址.
根 DNS 服务器
: 在因特网上当前有且只能有13个根DNS服务器 (标号为A-M)
顶级域服务器(TLD)
: 这些服务器负责顶级域名如com
,org
,net
,edu
和gov
,以及全部国家的顶级域名如uk
,fr
,ca
和jp
.权威 DNS 服务器
:
DNS
服务器DNS
服务器本地DNS服务器
: 不属于DNS
的层次结构.
递归查询
: 请求主机到本地DNS服务器是递归查询迭代查询
: 本地DNS服务器与其他服务器的回话是迭代查询资源记录(Resource Record,RR)
:RR
提供了主机名到IP地址的映射.
(Name,Value,Type,TTL)
TTL
: 资源记录应当在缓存中删除的时间.NAME
和VALUE
的值取决于Type
Type = A
Name
是主机名Value
是对应的IP地址.(relay1.bar.foo.com,145.37.93.126,A)
Type = NS
Name
是个域 如:(foo.com)
Value
是得到该域中主机IP
地址的权威DNS服务器主机名.(foo.com,dns.foo.com,NS)
Type = CNAME
Value
是别名为Name
的规范主机名.(foo.com,relay1.bar.foo.com,CNAME)
Type = MX
Value
是别名为Name
的邮件服务器的规范主机名.(foo.com,mail.bar.foo.com,MX)
DNS回答报文
: 通常包含了一条或多条资源记录.首部区域
:前12个字节,各有2字节
标识符
: 用于标识该查询
标志
: 有若干标志位.
QR
:1 比特 的 查询/回答 指出是查询报文(0)
仍是回答报文(1)
.问题区域
: 包含正在查询的信息
回答区域
: 包含了最初请求的名字的资源记录
RR
,因此一个主机名能够对应多个IP
.权威区域
: 包含了其余权威服务器的记录.附加区域
: 包含了其余有帮助的记录.
MX
请求,回答区域是一个类型MX
的RR,附加区域是个A
的RRnslookup
直接向某些DNS服务器发送一个DNS查询报文.有如下记录须要插入
你的DNS
服务器的名字和IP
地址
(network.com,dns.network.com,NS) (dns,network.com,212,212,212,1,A)
你的WEB
服务器的IP地址
(www.network.com,212,212,71.4,A)
用于邮件的MX
类型.
讨论两种P2P应用
BitTorrent
协议C-S
模式下载一个文件所须要的时间
P2P
模式下下载一个文件所须要的时间
BitTorrent
: 用于文件分发的流行 P2P 协议.
洪流(torrent)
:参与一个特定文件分发的全部对等方的集合被称为一个洪流
文件块(chunk)
: 一个洪流中的对等方彼此下载等长度的文件块(chunk)
256KB
咱们更为仔细的观察BitTorrent
运行的过程
追踪器(tracker)
: 每一个洪流具备一个的基础设施结点,跟踪洪流对等方.
Alice
加入洪流,追踪器随机选择一个对等方子集的IP
发给Alice
.
Alice
试图与列表全部对等方建立并行的TCP
链接.
领近对等方
: 成功创建链接的对等方(此图只有三个)Alice
周期性的询问每一个邻近对等方他们具备的块列表.Alice
对他尚未的块发出请求(TCP链接).Alice
拥有块,并知道邻居有哪些块,有两个任务要作.
疏通
:根据下载速度肯定k
个邻居,还有一个待试探称为疏通.
B
的疏通.阻塞
:其他除疏通外的对等方.还有片
,流水线
,随机优先选择
,残局模型
,反怠慢
等有趣的机制.
这样一报还一报的机制提升用户的积极性..
分布式散列表(Distributed Hash Table,DHT)
key
来查询该分布式数据库.key-value
的对等方,向查询返回key-value
.key-value
.散列
的由来
key
哈希一下获得一个id
,并 mod 2^n
,存入跟这个id最接近的散列表中.Logn
个捷径.经过一个简单的UDP
程序和一个简单的TCP
程序来介绍 UDP
和TCP
套接字编程.
Python
呈现这些程序.UDPClient
from socket import * serverName = 'localhost' serverPort = 12000 clientSocket = socket(AF_INET,SOCK_DGRAM) message = bytes(input('Input lowercase sentence:'),encoding="UTF-8") clientSocket.sendto(message,(serverName,serverPort)) modifiedMessage,serverAddress = clientSocket.recvfrom(2048) modifiedMessage = modifiedMessage.decode() print(serverAddress) print (modifiedMessage) clientSocket.close();
socket.AF_INET
:指示了底层网络使用 IPv4
socket.DGRAM
: 意味着是一个UDP
套接字recvfrom
: 表明缓存长度UDPServer
from socket import * serverPort = 12000 serverSocket = socket(AF_INET,SOCK_DGRAM) serverSocket.bind(('',serverPort)) print("The server si ready to receive") while True: message,clientAddress = serverSocket.recvfrom(2048) modifiedMessage = message.upper() serverSocket.sendto(modifiedMessage,clientAddress)
TCPClient.py
from socket import * serverName = 'localhost' serverPort = 12000 clientSocket = socket(AF_INET,SOCK_STREAM) clientSocket.connect((serverName,serverPort)) sentence = bytes(input('Input lowercase sentence'),encoding='UTF-8') clientSocket.sendto(sentence) modifiedSentence = clientSocket.recv(2048) modifiedSentence.decode() print('From Server:'+modifiedSentence) clientSocket.close();
TCPServer
from socket import * serverPort = 12000 serverSocket = socket(AF_INET,SOCK_STREAM) serverSocket.bind(('',serverPort)) serverSocket.listen(1) print('The server is ready to receive') while 1: connectionSocket,addr = serverSocket.accept() sentence = connectionSocket.recv(1024) capitalizedSentence = sentence.upper() connectionSocket.send(capitalizedSentence) connectionSocket.close()