標籤(空格分隔): 未分類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()