中科大鄭烇、楊堅(jiān)全套《計(jì)算機(jī)網(wǎng)絡(luò)(自頂向下方法 第7版,James F.Kuro

### 1.1 什么是Internet
1. 從具體構(gòu)成角度:由通信鏈路和節(jié)點(diǎn)及協(xié)議構(gòu)成。
- 節(jié)點(diǎn):
- 主機(jī)及其上運(yùn)行的應(yīng)用程序——主機(jī)節(jié)點(diǎn),圖形上一般由正方形表示。
- 路由器(網(wǎng)絡(luò)層)、交換機(jī)(數(shù)據(jù)鏈路層)等網(wǎng)絡(luò)交換設(shè)備——數(shù)據(jù)交換節(jié)點(diǎn),圖形上一般表示圓形。
- 通信鏈路:光纖、同軸電纜、無線電、衛(wèi)星——傳輸速率:帶寬(bps)
- 接入網(wǎng)鏈路(access):主機(jī)連接到互聯(lián)網(wǎng)的鏈路(主機(jī)節(jié)點(diǎn)和數(shù)據(jù)交換節(jié)點(diǎn)之間的鏈路)
- 主干鏈路(backbone):路由器間的鏈路(數(shù)據(jù)交換節(jié)點(diǎn)之間)
- 協(xié)議:定義你兩個(gè)或多個(gè)通信實(shí)體之間的報(bào)文格式和次序,以及在報(bào)文傳輸或接收或其他事件方面所采取的動(dòng)作。對(duì)等層實(shí)體通信過程中遵守的規(guī)則集合。
- 協(xié)議三要素:語法、語義、時(shí)序
2. 從服務(wù)的角度:
- 分布式的應(yīng)用
- 為分布式應(yīng)用提供通信服務(wù)的基礎(chǔ)設(shè)施(應(yīng)用層以下都屬于基礎(chǔ)設(shè)施,提供形式:API(接口TCP/UDP))
### 1.2 網(wǎng)絡(luò)邊緣(edge):采用網(wǎng)絡(luò)設(shè)施的面向連接服務(wù)
- 主機(jī)(host/end system)
- 應(yīng)用程序(客戶端和服務(wù)器)
- 運(yùn)行模式:
- c/s模式——>客戶/服務(wù)器模式(主從模式)
- 客戶端向服務(wù)器請(qǐng)求、接收服務(wù)
- PTP模式——>Peer-Peer(對(duì)等模式)
- 目標(biāo):在端系統(tǒng)之間傳輸數(shù)據(jù)
- 握手:做數(shù)據(jù)傳輸之前做好準(zhǔn)備(兩個(gè)通信主機(jī)之間為連接建立狀態(tài))
- TCP——>傳輸控制協(xié)議(Transmission Control Protocol)——Internet 上面向連接的服務(wù)
- 可靠地、按順序地傳輸數(shù)據(jù)——確認(rèn)和重傳
- 流量控制——發(fā)送方不會(huì)淹沒接收方
- 擁塞控制——當(dāng)網(wǎng)絡(luò)擁塞時(shí),發(fā)送方降低發(fā)生速率
- UDP——>用戶數(shù)據(jù)報(bào)協(xié)議(User Datagram Protocol)
- 無連接
- 不可靠數(shù)據(jù)傳輸
- 無流量控制
- 無擁塞控制
### 1.3網(wǎng)絡(luò)核心
- 網(wǎng)絡(luò)核心:路由器的網(wǎng)狀網(wǎng)絡(luò)
- 數(shù)據(jù)通過網(wǎng)絡(luò)進(jìn)行傳輸?shù)姆绞?/p>
- 電路交換(circuit switch)——通常被傳統(tǒng)電話網(wǎng)絡(luò)采用
- 獨(dú)享資源:不同享——性能保障
- 網(wǎng)絡(luò)資源被分成片的方式(如帶寬)——線路復(fù)用
- 頻分(Frequency-division-multiplexing)
- 時(shí)分(Time-division-multiplexing)
- 波分(Wave-division-multiplexing)——采用光通信
- 碼分(CDM)
- 分組交換:以分組為單位儲(chǔ)存-轉(zhuǎn)發(fā)方式——統(tǒng)計(jì)多路復(fù)用
- 傳輸時(shí)間使用全部帶寬,不再分為一個(gè)個(gè)片
- 主機(jī)之間傳輸數(shù)據(jù)被分為一個(gè)個(gè)分組(packet)
- 排隊(duì)和延遲——到達(dá)速率>鏈路輸出速率
- 路由:決定分組采用的源到目標(biāo)的路徑
- 轉(zhuǎn)發(fā):將分組從路由器輸入鏈路轉(zhuǎn)移到輸出鏈路
- 分組的存儲(chǔ)轉(zhuǎn)發(fā)一段一段從源端傳到目標(biāo)端,按照有無網(wǎng)絡(luò)層的連接,分為
- 數(shù)據(jù)報(bào)(datagram):通信之前無須建立連接,有數(shù)據(jù)就傳輸,每一個(gè)分組都獨(dú)立路由(路徑不同,可能會(huì)失序),路由器根據(jù)分組的目標(biāo)地址進(jìn)行路由。
- 虛電路(virtual circuit)——有連接
- 每個(gè)分組都帶標(biāo)簽(虛電路標(biāo)識(shí)VC ID),標(biāo)簽決定下一跳
- 做呼叫建立時(shí)決定路徑,做整個(gè)呼叫中路徑保持不變
### 1.4 接入網(wǎng)和物理媒體
- 端系統(tǒng)和邊緣路由器的連接
- 住宅接入網(wǎng)絡(luò):
- modem
- 將上網(wǎng)數(shù)據(jù)調(diào)制(調(diào)頻/調(diào)幅/調(diào)相位/綜合調(diào)制)加載音頻信號(hào)上,在電話線上傳輸,在局端將其中的數(shù)據(jù)解調(diào)出來
- 撥號(hào)調(diào)制解調(diào)器56kbps的速率直接介入路由器(通常更低),不能同時(shí)上網(wǎng)和打電話:不能總是在線
- 50kbps
- DSL(digital subscriber line)——使用額外帶寬
- 采用現(xiàn)存的到交換局DSLAM的電話線
- 如果上下行帶寬不對(duì)稱——IDSL
- 上行——2.5Mbps,下行——24 Mbps
- 線纜網(wǎng)絡(luò)
- 有線電視信號(hào)線纜雙向改造
- FDM(頻分多路復(fù)用):在不同頻段傳輸不同信道道數(shù)據(jù),數(shù)字電視和上網(wǎng)數(shù)據(jù)(上下行)
- HFC(hybrid fiber coax—混合光纖同軸電纜):非對(duì)稱:最高30Mbps下行傳輸,2Mbps上行傳輸速率
- 線纜和光纖網(wǎng)絡(luò)將各個(gè)家庭用戶接入ISP路由器
- 各用戶共享到線纜頭端到接入網(wǎng)絡(luò),與DSL不同,DSL每個(gè)用戶一個(gè)專用線路到CO(central office)
- 電纜模式
- 電力調(diào)制解調(diào)器
- FTTH(光纖到戶)
- 20Mbps
- 單位接入網(wǎng)絡(luò)(學(xué)校、公司)——Ethernet
- 交換機(jī)的集連
- 10Mbps、100Mbps、1Gbps、10Gbps傳輸速率
- 現(xiàn)在,端系統(tǒng)經(jīng)常直接連接到以太網(wǎng)絡(luò)交換機(jī)
- 無線接入網(wǎng)絡(luò)
- 各無線端系統(tǒng)共享無線接入網(wǎng)絡(luò)(端系統(tǒng)到無線路由器)——通過基站或叫接入點(diǎn)
- 物理媒體
- Bit:在發(fā)送-接收對(duì)間傳播
- 物理鏈路:連接每個(gè)發(fā)送-接受對(duì)之間的物理媒體
- 導(dǎo)引型媒體:信號(hào)沿固體媒介被導(dǎo)引
- 同軸電纜
- 兩根同軸的銅導(dǎo)線
- 雙向
- 基帶電纜——單個(gè)頻段(信道)工作
- 寬帶電纜——多個(gè)信道工作
- 雙絞線(TP)
- 5類:100Mbps以太網(wǎng),Gbps千兆以太網(wǎng)
- 6類:10Gbps萬兆以太網(wǎng)
- 光纖和光纜
- 光脈沖,每個(gè)脈沖表示一個(gè)bit,在玻璃纖維中傳輸
- 高速:點(diǎn)道點(diǎn)道高速傳輸
- 低誤碼率:在那個(gè)中繼器之間可以有很長的距離,不受電磁噪聲的干擾
- 安全
- 單模光纖——光信號(hào)垂直
- 多模光纖——一定入射角實(shí)現(xiàn)全反射
- 非導(dǎo)引型媒體:開放的空間傳輸電磁波或者光信號(hào),在電磁或者光信號(hào)中承載數(shù)字?jǐn)?shù)據(jù)
- 雙向
- 無需物理“線纜”
- 傳播環(huán)境效應(yīng)
- 反射
- 吸收
- 干擾
- 地面微波
- LAN
- Wide-area
- 衛(wèi)星
- 同步靜止衛(wèi)星或低軌衛(wèi)星
- 270msec端到端延遲
### 1.5 Internet 結(jié)構(gòu)和ISP
- 互聯(lián)網(wǎng)絡(luò)結(jié)構(gòu):網(wǎng)絡(luò)的網(wǎng)絡(luò)
- 端系統(tǒng)通過接入ISPs(Internet Service Providers)連接到互聯(lián)網(wǎng)
- 接入ISPs相應(yīng)的必須是互聯(lián)的
- 內(nèi)容提供商網(wǎng)絡(luò)(Internet Content Providers)可能會(huì)構(gòu)建它們自己的網(wǎng)絡(luò),將它們的服務(wù)、內(nèi)容更加靠近端用戶,向用戶提供更好的服務(wù),減少自己的運(yùn)營支出。
- ISP之間的連接
- POP:高層ISP面向客戶網(wǎng)絡(luò)的接入,涉及費(fèi)用結(jié)算
- 對(duì)等接入:2個(gè)ISP對(duì)等互解,不涉及費(fèi)用結(jié)算
- IXP:多個(gè)對(duì)等ISP互聯(lián)互通之處,通常不涉及費(fèi)用結(jié)算
- ICP自己部署專用網(wǎng)絡(luò),同時(shí)和各級(jí)ISP連接
### 1.6分組延時(shí)、丟失和吞吐量
- 分組延時(shí)
- 節(jié)點(diǎn)處理延時(shí)
- 檢查bit級(jí)差錯(cuò)
- 檢查分組首部和決定將分組導(dǎo)向何處
- 排隊(duì)延時(shí)
- 在輸出鏈路上等待傳輸?shù)臅r(shí)間,依賴于路由器的擁塞程度
- 流量強(qiáng)度I=La/R——a:?jiǎn)挝粫r(shí)間轉(zhuǎn)發(fā)分組數(shù)量——在0-1之間,設(shè)計(jì)時(shí)不能大于1
- 傳輸延時(shí)
- R=鏈路帶寬(bps)
- L=分組長度(bits)
- 將分組發(fā)送到鏈路上的時(shí)間=L/R
- 存儲(chǔ)轉(zhuǎn)發(fā)延時(shí)
- 傳播延時(shí)
- d=物理鏈路的長度
- s=在媒體上的傳播速度(2\*10^8m/sec)
- 傳播延時(shí)=d/s
-?分組丟失
- 鏈路的隊(duì)列緩沖區(qū)容量有限
- 當(dāng)分組到達(dá)一個(gè)滿的隊(duì)列是,該分組將會(huì)丟失
- 丟失的分組可能會(huì)被前一個(gè)節(jié)點(diǎn)或源端系統(tǒng)重傳或根本不重傳
- 吞吐量:在源端和目標(biāo)端之間傳輸?shù)乃俾剩〝?shù)據(jù)量/單位時(shí)間)
- 瞬間吞吐量:在一個(gè)時(shí)間點(diǎn)的速率
- 平均吞吐量:在一個(gè)長時(shí)間內(nèi)的平均值
- 瓶頸鏈路:端到端路徑上,限制端到端吞吐端鏈路
### 1.7協(xié)議層次及服務(wù)模型
- 層次化方式實(shí)現(xiàn)復(fù)雜網(wǎng)絡(luò)功能
- 將網(wǎng)絡(luò)復(fù)雜的功能分成功能明確的層次,每一個(gè)層次實(shí)現(xiàn)其中一個(gè)或一組功能,功能中有其上層可以使用的功能——>服務(wù)
- 協(xié)議的功能:本層協(xié)議實(shí)體相互交互執(zhí)行本層協(xié)議動(dòng)作,目的是實(shí)現(xiàn)本層功能,通過接口為上層提供更好的服務(wù)。
- 各協(xié)議實(shí)體之間是水平關(guān)系
- 實(shí)現(xiàn)本層協(xié)議是,利用了下層所提供的服務(wù)
- 本層的服務(wù)包括了借助下層提供的服務(wù)實(shí)現(xiàn)本層協(xié)議實(shí)體之間交互帶來的新功能和下層所提供的服務(wù)
- 服務(wù)(Service):低層實(shí)體向高層實(shí)體提供它們之間通信的能力
- 服務(wù)用戶(Service user)
- 服務(wù)提供者(Service provider)
- 原語(primitive):上層區(qū)分使用下層服務(wù)的形式,高層使用低層提供的服務(wù),以及低層向高層提供服務(wù)都是通過服務(wù)訪問原語來進(jìn)行交互——形式
- 服務(wù)訪問點(diǎn)SAP(Service Access Point):使用下層提供的服務(wù)通過層間的接口——地點(diǎn)
- 協(xié)議和服務(wù)關(guān)系
- 本層協(xié)議的實(shí)現(xiàn)依靠下層提供的服務(wù)
- 本層協(xié)議實(shí)體通過協(xié)議實(shí)現(xiàn)的功能—>為上層提供更好的服務(wù)
- 數(shù)據(jù)單元:
- SDU(Service Data Unit):上層交給下層要傳輸?shù)臄?shù)據(jù)
- ICI(Interface Control Information):上層SDU穿過層間接口到達(dá)下層需添加的信息
- 協(xié)議數(shù)據(jù)單元PDU(Protocol Data Unit):上層SDU+本層ICI——>對(duì)等協(xié)議實(shí)體交換本層PDU
- 層次化優(yōu)點(diǎn)
- 概念化:結(jié)構(gòu)清晰,便于標(biāo)示網(wǎng)絡(luò)組件以及描述相互關(guān)系
- 結(jié)構(gòu)化:模塊化更易于維護(hù)和系統(tǒng)升級(jí)
- Internet協(xié)議棧
- 應(yīng)用層:面向用戶提供服務(wù)——message報(bào)文
- FTP,SMTP,HTTP,DNS
- 傳輸層:在網(wǎng)絡(luò)層提供端到端通信基礎(chǔ)上,細(xì)分為進(jìn)程到進(jìn)程,將網(wǎng)絡(luò)層不可靠的服務(wù)變成可靠的服務(wù)——報(bào)文段segment:TCP段,UDP段
- TCP,UDP
- 網(wǎng)絡(luò)層:在鏈路層提供服務(wù)基礎(chǔ)上,傳輸以分組(packet,如果是無連接的方式:數(shù)據(jù)報(bào)datagram)為單位的端到端的數(shù)據(jù)傳輸(選擇路由)
- IP(轉(zhuǎn)發(fā)),路由協(xié)議
- 鏈路層:在物理層提供服務(wù)的基礎(chǔ)上,相鄰兩點(diǎn)(網(wǎng)絡(luò)節(jié)點(diǎn))之間傳輸以幀(frame)為單位的數(shù)據(jù)
- PPP,802.11(wifi)
- 物理層:將數(shù)字?jǐn)?shù)據(jù)轉(zhuǎn)換為物理信號(hào),物理線路上傳送bit(位)
- ISO——國際標(biāo)準(zhǔn)化組織/OSI(開放系統(tǒng)互聯(lián)open system interconection)參考模型
- 應(yīng)用層
- 表示層:允許應(yīng)用解釋傳輸?shù)臄?shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行加密,壓縮,機(jī)器相關(guān)的表示轉(zhuǎn)換
- 會(huì)話層:數(shù)據(jù)交換的同步,檢查點(diǎn),恢復(fù)
- 傳輸層
- 網(wǎng)絡(luò)層
- 鏈路層
- 物理層
### 2.1 應(yīng)用層協(xié)議原理
- 網(wǎng)絡(luò)應(yīng)用體系結(jié)構(gòu)
- cs(客戶-服務(wù)器模式)
- 服務(wù)器
- 一直運(yùn)行
- 固定ip地址和端口號(hào)(例如web80)
- 擴(kuò)展性差
- 客戶端
- 主動(dòng)與服務(wù)器通信
- 與互聯(lián)網(wǎng)有間歇性連接
- 可能是動(dòng)態(tài)ip地址
- 不直接與其他客戶端通信
- 對(duì)等模式(peer to peer)
- 任意端系統(tǒng)之間可以進(jìn)行通信
- 每個(gè)節(jié)點(diǎn)既是客戶端又是服務(wù)器
- 才能與端主機(jī)間歇性連接且可以改變ip地址導(dǎo)致難以管理
- 沒有一直運(yùn)行的服務(wù)器(幾乎)
- 混合體:cs和對(duì)等體系結(jié)構(gòu)
- Napster
- 即使通信
- 進(jìn)程通信
- 進(jìn)程:主機(jī)上運(yùn)行的應(yīng)用程序
- 客戶端進(jìn)程:發(fā)起通信的進(jìn)程
- 服務(wù)器進(jìn)程:等待連接的進(jìn)程
- 同一個(gè)主機(jī)內(nèi),使用的是進(jìn)程間通信機(jī)制通信(操作系統(tǒng)定義)
- 不同主機(jī),通過交換報(bào)文(message)來通信
- 分布式應(yīng)用進(jìn)程通信條件
- 進(jìn)程標(biāo)識(shí)(SAP)
- 主機(jī)ip地址
- 采用傳輸層協(xié)議:TCP/UDP
- 端口號(hào)
- \http:TCP80
- Maul:TCP25
- \FTP:TCP21
- 端節(jié)點(diǎn):用于標(biāo)識(shí)一個(gè)進(jìn)程:IP+Port
- 一對(duì)主機(jī)經(jīng)常之間的通信由兩個(gè)端節(jié)點(diǎn)構(gòu)成
- 傳輸層提供的服務(wù)
- 穿過層間接口所需提供信息
- SDU
- 傳輸源端IP+TCP(UDP)端口號(hào)
- 接收端IP+TCP(UDP)端口號(hào)
- Socket API:為便于管理,使用一個(gè)代號(hào)標(biāo)識(shí)雙方(TCP)或單方(UDP)——>穿過層間接口信息大小最小
- TCP socket(套接字):4元組(源ip,源port,目標(biāo)ip,目標(biāo)port)的一個(gè)具有本地意義的標(biāo)識(shí),可使用這個(gè)標(biāo)識(shí),與遠(yuǎn)程的應(yīng)用進(jìn)程通信
- 如果進(jìn)程通信之前要建立連接,通信關(guān)系穩(wěn)定,使用一個(gè)整數(shù)表示兩個(gè)應(yīng)用實(shí)體之間的**通信關(guān)系**,本地標(biāo)識(shí)
- 簡(jiǎn)單,便于管理(類似于操作系統(tǒng)打開一個(gè)文件,os返回一個(gè)文件句柄,可以使用這個(gè)文件句柄對(duì)文件進(jìn)行操作)
- UDP socket:2元組(源ip,源port)的一個(gè)具有本地意義的標(biāo)識(shí)
- 制定了應(yīng)用所在的一個(gè)端節(jié)點(diǎn)(end port)
- 發(fā)送報(bào)文是需指定目標(biāo)ip和port
- 傳輸層提供服務(wù)基礎(chǔ)上實(shí)現(xiàn)應(yīng)用
- 定義應(yīng)用層協(xié)議:運(yùn)行在不同端系統(tǒng)上的應(yīng)用經(jīng)常如何交換報(bào)文
- 交換的報(bào)文類型:請(qǐng)求和應(yīng)答報(bào)文
- 報(bào)文類型的語法:字段及其描述
- 字段的語義
- 進(jìn)程對(duì)發(fā)送報(bào)文及對(duì)報(bào)文響應(yīng)的規(guī)則
- 編制程序,通過api調(diào)用網(wǎng)絡(luò)基礎(chǔ)設(shè)施提供通信服務(wù)傳報(bào)文,解析報(bào)文,實(shí)現(xiàn)應(yīng)用時(shí)序
- 應(yīng)用層對(duì)傳輸層所提供服務(wù)質(zhì)量的一些指標(biāo)
- 數(shù)據(jù)丟失率
- 延遲
- 吞吐
- 安全性
- 機(jī)密性
- 完整性
- 可認(rèn)證性(鑒別)
- UDP存在的必要性
- 區(qū)分不同的進(jìn)程,ip服務(wù)不能
- 無需建立連接
- 不做可靠性工作
- 沒有擁塞控制和流量控制,應(yīng)用能夠按照設(shè)定的速度發(fā)送數(shù)據(jù)
- SSL——TCP和UDP都沒有加密,明文通過互聯(lián)網(wǎng)傳輸
- 在TCP上面實(shí)現(xiàn),通過加密的TCP連接
- 私密性
- 數(shù)據(jù)完整性
- 端到端鑒別
- 在應(yīng)用層:應(yīng)用采用SSL庫,SSL庫使用TCP通信
- SSL socket API:應(yīng)用通過API將明文交給socket,SSL將其加密在互聯(lián)網(wǎng)傳輸
### 2.2 Web 和HTTP
- Web頁:由一些對(duì)象組成,含有一天基本都HTML文件,該基本HTML文件又包含若干對(duì)象的應(yīng)用(鏈接URL:訪問協(xié)議,用戶名,口令字,端口等)
- HTTP:超文本傳輸協(xié)議——TCP上——帶內(nèi)傳送
- HTTP是無狀態(tài):服務(wù)器并不維護(hù)客戶的任何信息
- 非持久HTTP1.0
- 持久HTTP1.1
- 非流水方式——一次只發(fā)送一個(gè)請(qǐng)求,收到響應(yīng)后在發(fā)送新的請(qǐng)求,每個(gè)引用對(duì)象花費(fèi)一個(gè)RTT
- 流水方式——HTTP/1.1默認(rèn)模式,客戶端遇到引用對(duì)象就產(chǎn)生一個(gè)請(qǐng)求,所有引用(?。?duì)象的時(shí)間只花費(fèi)一個(gè)RTT是可能的
- 往返時(shí)間RTT(round-trip time):一個(gè)小的分組從客戶端到服務(wù)器,然后回到客戶端到時(shí)間(傳輸時(shí)間忽略)
- 響應(yīng)時(shí)間:2RTT(TCP連接RTT、HTTP請(qǐng)求RTT)+傳輸時(shí)間
- HTTP請(qǐng)求報(bào)文:請(qǐng)求(ASCII人能閱讀)、響應(yīng)
- cookies:維護(hù)客戶端和服務(wù)端狀態(tài)
- 用戶驗(yàn)證
- 購物車
- 推薦
- 用戶狀態(tài)
- Web緩存(代理服務(wù)器):不訪問原始服務(wù)器,就滿足客戶的請(qǐng)求
### 2.3 FTP——有狀態(tài)協(xié)議
- 控制連接(21控制命令的發(fā)送)和數(shù)據(jù)連接(20服務(wù)器主動(dòng)發(fā)出)——帶外傳送(out of band兩個(gè)連接傳送)
### 2.4 EMail
- 用戶代理
- 郵件服務(wù)器
- 郵箱中管理和維護(hù)發(fā)送給用戶的郵件
- 輸出報(bào)文隊(duì)列保持帶發(fā)送郵件報(bào)文
- 郵件服務(wù)器之間的SMTP協(xié)議:發(fā)送email報(bào)文
- 簡(jiǎn)單郵件傳輸協(xié)議:SMTP(發(fā)送)25
- 報(bào)文必須為7位ASCII碼
- 報(bào)文格式:多媒體擴(kuò)展MIME(多媒體郵件擴(kuò)展)
- 接收方用戶代理拉取協(xié)議
- POP3——無狀態(tài)
- 用戶確認(rèn)階段
- 事物處理階段
- IMAP
- 相比POP3遠(yuǎn)程目錄維護(hù)——狀態(tài)維護(hù)
- HTTP
### 2.5 DNS(Domain Name System)域名解析系統(tǒng)
?- DNS協(xié)議:查詢和響應(yīng)的報(bào)文格式相同
- 必要性:將字符串由DNS轉(zhuǎn)換為二進(jìn)制網(wǎng)絡(luò)地址(IP地址:標(biāo)識(shí)主機(jī)、路由器)
- 主要思路
- 分層的、基于域的命名機(jī)制
- 若干分布式的數(shù)據(jù)庫完成名字到IP地址的轉(zhuǎn)換
- 運(yùn)行在UDP53端口的應(yīng)用服務(wù)
- 是Internet的核心功能,但以應(yīng)用層協(xié)議實(shí)現(xiàn),運(yùn)行在網(wǎng)絡(luò)邊緣
- 主要目的
- 實(shí)現(xiàn)主機(jī)名-iP地址的轉(zhuǎn)換
- 其他目的
- 主機(jī)別名到規(guī)范名字的轉(zhuǎn)換
- 郵件服務(wù)器別名到郵件服務(wù)器正規(guī)名字的轉(zhuǎn)換
- 負(fù)載均衡
- DNS域名結(jié)構(gòu)
- DNS采用層次樹狀結(jié)構(gòu)的命名方法
- Internet根被劃分為幾百個(gè)頂級(jí)域(top lever domains)
- .com、.edu、.gov、.org、.cn、.us、.jp
- 每個(gè)(子)域下面可劃分為若干個(gè)子域
- 樹葉是主機(jī)
- 名字服務(wù)器:維護(hù)所管轄區(qū)域的權(quán)威信息,允許被放置在區(qū)域之外,以保障可靠性,為提高性能會(huì)進(jìn)行緩存(TTL:默認(rèn)兩天)
- 區(qū)域(zone)
- 頂級(jí)域(TLD)服務(wù)器:負(fù)責(zé)頂級(jí)域名和所有國家級(jí)的頂級(jí)域名
- 權(quán)威DNS服務(wù)器(名字服務(wù)器):組織機(jī)構(gòu)的DNS服務(wù)器,提供組織機(jī)構(gòu)服務(wù)器可訪問的主機(jī)和IP之間的映射
### 2.6 P2P應(yīng)用
- 非結(jié)構(gòu)化P2P
- 集中化目錄:
- 查詢洪泛:Gnutella
- 利用不勻稱性:kaZaA
- 結(jié)構(gòu)化(DHT)P2P
### 2.7 視頻流化服務(wù)和CDN:上下文
- 分布式的,應(yīng)用層面的基礎(chǔ)設(shè)施
- CBR(constant bit rate):固定速率編碼
- VBR(variable bit rate):視頻編碼速率隨時(shí)間的變化而變化
- 存儲(chǔ)視頻的流化服務(wù):DASH(Dynamic adaptive Streaming over HTTP)
- 將視頻文件分為多個(gè)塊
- 每個(gè)塊獨(dú)立存儲(chǔ),編碼與不同碼率
- 告示文件(manifest file):提供不同塊的URL
- CDN(Content?Distribute Networks)內(nèi)容分發(fā)網(wǎng)絡(luò) over top——網(wǎng)絡(luò)邊緣
- enter deep:將CDN服務(wù)器深入到許多本地ISP
- bring home:部署于關(guān)鍵位置POP,采用主要線路將服務(wù)器簇連
- 工作原理
- 客戶向本地服務(wù)器解析請(qǐng)求視頻地址Ip返回CDN-URL(重定向),再向CDN-權(quán)威DNS服務(wù)器解析,選擇離客戶端最近Cache節(jié)點(diǎn)(CDN)IP地址返回,該地址提供流化服務(wù)
### TCP套接字編程
- socket:分布式應(yīng)用進(jìn)程之間的門,傳輸層協(xié)議提供的端到端之間的服務(wù)接口
- sockaddr_in
```c
struct sockaddr_in{
short sin_family;????// 地址簇,默認(rèn)為AF_INET代表TCP/IP協(xié)議族
u_short sin_port;?????// port(使用網(wǎng)絡(luò)字節(jié)順序)
struct in_addr sin_addr; // sin_addr存儲(chǔ)ip地址,使用in_addr這個(gè)數(shù)據(jù)結(jié)構(gòu)
char sin_zero[8];????/* 對(duì)齊,為了讓sockaddr和sockaddr_in兩個(gè)數(shù)據(jù)結(jié)構(gòu)保持大小相同保留的空字節(jié) */
}
```
- hostent(host entry)
- 作為調(diào)用域名解析函數(shù)時(shí)的參數(shù),返回后將IP地址拷貝到sockaddr_id的Ip地址部分
```c
struct hostent{
char *h_name;????// 地址的正式名稱(域名)
char **h_aliases;??// 地址的預(yù)備名稱指針(別名)
int h_addrtype;???// 地址類型,通常為AF_INET
int h_length;????// 地址長度
char **h_addr_list;?/* 主機(jī)網(wǎng)絡(luò)地址指針,網(wǎng)絡(luò)字節(jié)順序:占內(nèi)存多于一個(gè)字節(jié)類型的數(shù)據(jù)在內(nèi)存中的存放順序,通常有小端、大端 */
# define h_addr h_addr_list[0]; // h_addr_list中第一地址?
}
```
- ![[P30808-224451.jpg]]
- ![[Pasted image 20230808224942.png]]
- 例C客戶端(TCP)
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
??// 創(chuàng)建 socket
??int client_socket = socket(AF_INET, SOCK_STREAM, 0);
??if (client_socket == -1) {
????perror("Socket creation failed");
????exit(EXIT_FAILURE);
??}
??// 設(shè)置服務(wù)器地址和端口
??struct sockaddr_in server_address;
??memset(&server_address, 0, sizeof(server_address));
??server_address.sin_family = AF_INET;
??server_address.sin_port = htons(8080);
??server_address.sin_addr.s_addr = inet_addr("127.0.0.1");?// 服務(wù)器的IP地址
??// 連接到服務(wù)器
??if (connect(client_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) {
????perror("Connection failed");
????exit(EXIT_FAILURE);
??}
??// 發(fā)送數(shù)據(jù)到服務(wù)器
??char message[] = "Hello, server!";
??if (send(client_socket, message, strlen(message), 0) == -1) {
????perror("Send failed");
????exit(EXIT_FAILURE);
??}
??// 接收服務(wù)器的響應(yīng)
??char buffer[1024] = {0};
??if (recv(client_socket, buffer, sizeof(buffer), 0) == -1) {
????perror("Receive failed");
????exit(EXIT_FAILURE);
??}
??printf("Server response: %s\n", buffer);
??// 關(guān)閉 socket
??close(client_socket);
??return 0;
}
```
- 服務(wù)器端(TCP)
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
??// 創(chuàng)建 socket
??int server_socket = socket(AF_INET, SOCK_STREAM, 0);
??if (server_socket == -1) {
????perror("Socket creation failed");
????exit(EXIT_FAILURE);
??}
??// 設(shè)置服務(wù)器地址和端口
??struct sockaddr_in server_address;
??memset(&server_address, 0, sizeof(server_address));
??server_address.sin_family = AF_INET;
??server_address.sin_port = htons(8080);?// 使用的端口號(hào)
??server_address.sin_addr.s_addr = INADDR_ANY;?// 使用任意可用的IP地址
??// 綁定地址和端口
??if (bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) {
????perror("Binding failed");
????exit(EXIT_FAILURE);
??}
??// 監(jiān)聽連接請(qǐng)求
??if (listen(server_socket, 5) == -1) {
????perror("Listening failed");
????exit(EXIT_FAILURE);
??}
??printf("Waiting for incoming connections...\n");
??while (1) {
????// 接受連接請(qǐng)求
????struct sockaddr_in client_address;
????socklen_t client_address_length = sizeof(client_address);
????int client_socket = accept(server_socket, (struct sockaddr*)&client_address, &client_address_length);
????if (client_socket == -1) {
??????perror("Accepting connection failed");
??????continue;
????}
????printf("Client connected: %s\n", inet_ntoa(client_address.sin_addr));
????// 接收客戶端發(fā)送的數(shù)據(jù)
????char buffer[1024] = {0};
????if (recv(client_socket, buffer, sizeof(buffer), 0) == -1) {
??????perror("Receive failed");
??????close(client_socket);
??????continue;
????}
????printf("Received from client: %s\n", buffer);
????// 發(fā)送響應(yīng)給客戶端
????char response[] = "Hello from server!";
????if (send(client_socket, response, strlen(response), 0) == -1) {
??????perror("Send failed");
????}
????// 關(guān)閉客戶端 socket
????close(client_socket);
??}
??// 關(guān)閉服務(wù)器 socket
??close(server_socket);
??return 0;
}
```
- UDP套接字編程
- 客戶端和服務(wù)器之間沒有鏈接
- 傳送數(shù)據(jù)可能失序也可能丟失
- ![[P30809-000646.jpg]]
- ![[Pasted image 20230809000829.png]]
- UDP客戶端
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
??// 創(chuàng)建 socket
??int client_socket = socket(AF_INET, SOCK_DGRAM, 0);
??if (client_socket == -1) {
????perror("Socket creation failed");
????exit(EXIT_FAILURE);
??}
??// 設(shè)置服務(wù)器地址和端口
??struct sockaddr_in server_address;
??memset(&server_address, 0, sizeof(server_address));
??server_address.sin_family = AF_INET;
??server_address.sin_port = htons(8080);?// 使用的端口號(hào)
??server_address.sin_addr.s_addr = INADDR_ANY;?// 使用任意可用的IP地址
??// 發(fā)送數(shù)據(jù)到服務(wù)器
??char message[] = "Hello from UDP client!";
??if (sendto(client_socket, message, strlen(message), 0, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) {
????perror("Sendto failed");
????exit(EXIT_FAILURE);
??}
??printf("Message sent to server: %s\n", message);
??// 關(guān)閉 socket
??close(client_socket);
??return 0;
}
```
- UDP服務(wù)端
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
??// 創(chuàng)建 socket
??int server_socket = socket(AF_INET, SOCK_DGRAM, 0);
??if (server_socket == -1) {
????perror("Socket creation failed");
????exit(EXIT_FAILURE);
??}
??// 設(shè)置服務(wù)器地址和端口
??struct sockaddr_in server_address;
??memset(&server_address, 0, sizeof(server_address));
??server_address.sin_family = AF_INET;
??server_address.sin_port = htons(8080);?// 使用的端口號(hào)
??server_address.sin_addr.s_addr = INADDR_ANY;?// 使用任意可用的IP地址
??// 綁定 socket 到指定的地址和端口
??if (bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) {
????perror("Bind failed");
????exit(EXIT_FAILURE);
??}
??char buffer[1024];
??struct sockaddr_in client_address;
??socklen_t client_address_length = sizeof(client_address);
??// 接收來自客戶端的數(shù)據(jù)
??ssize_t bytes_received = recvfrom(server_socket, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_address, &client_address_length);
??if (bytes_received == -1) {
????perror("Recvfrom failed");
????exit(EXIT_FAILURE);
??}
??buffer[bytes_received] = '\0';
??printf("Message received from client: %s\n", buffer);
??// 關(guān)閉 socket
??close(server_socket);
??return 0;
}
```