第一章有一些概念講的很好,值得好好關(guān)注一下?。?!
一、tcp/ip協(xié)議族
1.1 主要的協(xié)議
1.1.1 數(shù)據(jù)鏈路層
? 數(shù)據(jù)鏈路層實(shí)現(xiàn)了網(wǎng)卡接口的網(wǎng)絡(luò)驅(qū)動(dòng)程序,以處理數(shù)據(jù)在物理媒介(以太網(wǎng)、令牌環(huán))上的傳輸。
? 常用的協(xié)議有兩種:
-
ARP協(xié)議(Address Resolve Protocol,地址解析協(xié)議)
-
RARP(Reverse Address Resolve Protocol,逆地址解析協(xié)議)
? 它們實(shí)現(xiàn)了IP地址和機(jī)器物理地址(通常是MAC地址,以太網(wǎng)、令牌環(huán)和802.11無線網(wǎng)絡(luò)都使用MAC地址)之間的相互轉(zhuǎn)換。
? 網(wǎng)絡(luò)層使用IP地址尋址一臺機(jī)器,而數(shù)據(jù)鏈路層使用物理地址尋址一臺機(jī)器,因此網(wǎng)絡(luò)層必須先將目標(biāo)機(jī)器的IP地址轉(zhuǎn)換為物理地址,才能使用數(shù)據(jù)鏈路層提供的服務(wù),這就是ARP協(xié)議。RARP協(xié)議僅用于網(wǎng)絡(luò)上的某些無盤工作站,因?yàn)槿狈Υ鎯?chǔ)設(shè)備,無盤工作站無法記住自己的IP地址,但它們可以利用網(wǎng)卡上的物理地址來向網(wǎng)絡(luò)管理者查詢自身的IP地址。運(yùn)行RARP服務(wù)的網(wǎng)絡(luò)管理者通常存有該網(wǎng)絡(luò)所有機(jī)器的物理地址到IP地址的映射。
1.1.2 網(wǎng)絡(luò)層
? 網(wǎng)絡(luò)層實(shí)現(xiàn)數(shù)據(jù)包的選路和轉(zhuǎn)發(fā)。WAN廣域網(wǎng)通常使用眾多分級的路由器來連接分散的主機(jī)或者LAN局域網(wǎng)。因此,通信的兩臺主機(jī)一般不是直接相連的,而是通過多個(gè)中間節(jié)點(diǎn)(路由器)連接的。網(wǎng)絡(luò)層的任務(wù)就是選擇這些中間節(jié)點(diǎn),以確定兩臺主機(jī)之間的通信路徑。同時(shí),網(wǎng)絡(luò)層對上層協(xié)議隱藏了網(wǎng)絡(luò)拓?fù)溥B接的細(xì)節(jié),使得在傳輸層和網(wǎng)絡(luò)應(yīng)用程序看來,通信的雙方是直接相連的。
? 網(wǎng)絡(luò)層常用的協(xié)議也是兩種:
- IP協(xié)議(Internet Protocol,因特網(wǎng)協(xié)議)是網(wǎng)絡(luò)層最核心的協(xié)議,IP協(xié)議根據(jù)數(shù)據(jù)包的目的IP地址來決定如何投遞它。如果數(shù)據(jù)包不能夠直接發(fā)送給目標(biāo)主機(jī),那么IP協(xié)議就為它尋找一個(gè)合適的下一跳路由器,并將數(shù)據(jù)包交付給該路由器來轉(zhuǎn)發(fā)。多次重復(fù)這一過程,數(shù)據(jù)包最終到達(dá)目標(biāo)主機(jī),或者由于發(fā)送失敗而被丟棄。可見,IP協(xié)議使用逐跳的方式確認(rèn)通信路徑。第二章詳細(xì)介紹IP協(xié)議。
- ICMP協(xié)議(Internet Control Message Protocol,因特網(wǎng)控制報(bào)文協(xié)議)它是IP協(xié)議的重要補(bǔ)充,主要用于檢測網(wǎng)絡(luò)連接
? 8位類型字段用于區(qū)分報(bào)文類型。它將ICMP報(bào)文分為兩大類:一類是差錯(cuò)報(bào)文,這類報(bào)文主要用來回應(yīng)網(wǎng)絡(luò)錯(cuò)誤,比如目標(biāo)不可到達(dá)(類型值為3)和重定向(類型值為5);另一類是查詢報(bào)文,用來查詢網(wǎng)絡(luò)信息,比如ping程序就是使用ICMP報(bào)文查看目標(biāo)是否可到達(dá)(類型值為8)。有的ICMP報(bào)文還使用8位代碼字段來進(jìn)一步細(xì)分不同的條件,重定向報(bào)文使用代碼值0表示網(wǎng)絡(luò)重定向,代碼值1表示對主機(jī)重定向。ICMP報(bào)文使用16位校驗(yàn)和字段對整個(gè)報(bào)文(頭部和內(nèi)容)進(jìn)行循環(huán)冗余校驗(yàn)(Cyclic Redundancy Check, CRC),以檢驗(yàn)報(bào)文在傳輸過程中是否損壞。不同的ICMP報(bào)文類型具有不同的正文內(nèi)容。
? 需要指出的是,ICMP協(xié)議并非嚴(yán)格意義上的網(wǎng)絡(luò)層協(xié)議,因?yàn)樗褂锰幱谕粚拥腎P協(xié)議提供的服務(wù)(一般來說,上層協(xié)議使用下層協(xié)議提供的服務(wù))。
1.1.3 傳輸層
? 傳輸層為兩臺主機(jī)上的應(yīng)用程序提供端到端的通信。與網(wǎng)絡(luò)層使用的逐跳通信方式不同,傳輸層只關(guān)心通信的起始端和目的端,而不關(guān)心數(shù)據(jù)包的中轉(zhuǎn)過程。
? 垂直的實(shí)線表示TCP/IP協(xié)議族各層之間的實(shí)體通信(數(shù)據(jù)包確實(shí)是沿著這些線路傳遞的),而水平的虛線表示邏輯通信線路。
? 傳輸層協(xié)議主要有三個(gè):TCP協(xié)議、UDP協(xié)議和SCTP協(xié)議。
? TCP協(xié)議(Transmission Control Protocol,傳輸控制協(xié)議)為應(yīng)用層提供可靠的、面向連接的和基于流的服務(wù)。TCP協(xié)議使用超時(shí)重傳、數(shù)據(jù)確認(rèn)等方式來確保數(shù)據(jù)包被正確地發(fā)送至目的端,因此TCP服務(wù)是可靠的。使用TCP協(xié)議通信的雙方必須先建立TCP連接,并在內(nèi)核中為該連接維持一些必要的數(shù)據(jù)結(jié)構(gòu),比如連接的狀態(tài)、讀寫緩沖區(qū)、以及諸多定時(shí)器等。當(dāng)通信結(jié)束時(shí),雙方必須關(guān)閉連接以釋放這些內(nèi)核數(shù)據(jù)。TCP服務(wù)是基于流的,基于流的數(shù)據(jù)沒有邊界(長度)的限制,它遠(yuǎn)遠(yuǎn)不斷從通信的一端流入另一端。發(fā)送端可以逐個(gè)字節(jié)地向數(shù)據(jù)流中寫入數(shù)據(jù),接收端也可以逐個(gè)字節(jié)地將它們讀出。
? UDP協(xié)議(User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)則與TCP協(xié)議完全相反,它為應(yīng)用層提供不可靠、無連接和基于數(shù)據(jù)報(bào)的服務(wù)?!安豢煽俊币馕吨鳸DP協(xié)議無法保證數(shù)據(jù)從發(fā)送端正確地傳送到目的端。如果數(shù)據(jù)在中途丟失,或者目的端通過數(shù)據(jù)校驗(yàn)發(fā)現(xiàn)數(shù)據(jù)錯(cuò)誤而將其丟棄,則UDP協(xié)議只是簡單地通知應(yīng)用程序發(fā)送失敗。因此,使用UDP協(xié)議的應(yīng)用程序通常要自己處理數(shù)據(jù)確認(rèn)、超時(shí)重傳等邏輯。UDP協(xié)議是無連接的,即通信雙方不保持一個(gè) 長久的聯(lián)系,需要應(yīng)用程序每次發(fā)送數(shù)據(jù)都需要明確指定接收端的地址(IP地址等信息)?;跀?shù)據(jù)報(bào)的服務(wù),是相對基于流的服務(wù)而言的。每個(gè)UDP數(shù)據(jù)報(bào)都有一個(gè)長度,接收端必須以該長度為最小單位將其所有內(nèi)容一次性讀出,否則數(shù)據(jù)將被截?cái)唷?/p>
? SCTP(Stream Control Transmission Protocol,流控制傳輸協(xié)議)是一種相對較新的傳輸層協(xié)議,它是為了在因特網(wǎng)上傳輸電話信號而設(shè)計(jì)的。本書不討論SCTP協(xié)議。
1.1.4 應(yīng)用層
? 應(yīng)用層負(fù)責(zé)處理應(yīng)用程序的邏輯。數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層和傳輸層負(fù)責(zé)處理網(wǎng)絡(luò)通信細(xì)節(jié),這部分必須既穩(wěn)定又高效,因此它們都在內(nèi)核控件中實(shí)現(xiàn)。而應(yīng)用層則在用戶空間實(shí)現(xiàn),因?yàn)樗?fù)責(zé)處理眾多邏輯,比如文件傳輸、名稱查詢和網(wǎng)絡(luò)管理等。如果應(yīng)用層也在內(nèi)核中實(shí)現(xiàn),則會(huì)使內(nèi)核變得非常龐大。當(dāng)然,也有少數(shù)服務(wù)器程序是在內(nèi)核中實(shí)現(xiàn)的,這樣代碼就無須在用戶空間和內(nèi)核空間來回切換(主要是數(shù)據(jù)的復(fù)制),極大地提高了工作效率。不過這種代碼實(shí)現(xiàn)起來較復(fù)雜,不夠靈活,且不便于移植。
? 應(yīng)用層協(xié)議很多。
? ping是應(yīng)用程序,不是協(xié)議,前面說它利用ICMP報(bào)文檢測網(wǎng)絡(luò)連接,是調(diào)試網(wǎng)絡(luò)環(huán)境的必備工具。
? telnet協(xié)議是一種遠(yuǎn)程登錄協(xié)議,它使我們能在本地完成遠(yuǎn)程任務(wù)。
? OSPF(Open Shortest Path First,開放最短路徑優(yōu)先)協(xié)議是一種動(dòng)態(tài)路由更新協(xié)議,用于路由器之間的通信,以告知對方各自的路由信息。
? DNS(Domain Name Service,域名服務(wù))協(xié)議提供機(jī)器域名到IP地址的轉(zhuǎn)換。
? 應(yīng)用層協(xié)議(或程序)可能跳過傳輸層直接使用網(wǎng)絡(luò)層提供的服務(wù),比如ping程序和OSPF協(xié)議。應(yīng)用層協(xié)議(或程序)通常既可以使用TCP服務(wù),又可以使用UDP服務(wù),比如DNS協(xié)議。我們可以通過/etc/services文件查看所有知名的應(yīng)用層協(xié)議,以及它們都能使用哪些傳輸層服務(wù)。
1.2 封裝
? 每層協(xié)議都將在上層數(shù)據(jù)的基礎(chǔ)上加上自己的頭部信息(有時(shí)還包括尾部信息),以實(shí)現(xiàn)該層的功能。
? 當(dāng)發(fā)送端使用send或write向一個(gè)TCP連接寫入數(shù)據(jù)的時(shí)候,內(nèi)核中的TCP模塊首先把這些數(shù)據(jù)復(fù)制到與該連接對應(yīng)的TCP內(nèi)核發(fā)送緩沖區(qū)中,然后TCP模塊調(diào)用IP模塊提供的服務(wù),傳遞的參數(shù)包括TCP頭部信息和TCP發(fā)送緩沖區(qū)中的數(shù)據(jù),即TCP報(bào)文段。
? 經(jīng)過UDP封裝后的數(shù)據(jù)稱為UDP數(shù)據(jù)報(bào)(UDP datagram)。UDP對應(yīng)用程序數(shù)據(jù)的封裝與TCP類似。不同的是,UDP無須為應(yīng)用層數(shù)據(jù)保留副本,因?yàn)樗峁┑姆?wù)是不可靠的。當(dāng)一個(gè)UDP數(shù)據(jù)報(bào)被成功發(fā)送以后,UDP內(nèi)核緩沖區(qū)中的該數(shù)據(jù)報(bào)就被丟棄了。如果應(yīng)用程序檢測到該數(shù)據(jù)報(bào)未能被接收端正確接收,并打算重發(fā)這個(gè)數(shù)據(jù)報(bào),則應(yīng)用程序需要重新從用戶空間將該數(shù)據(jù)報(bào)拷貝到UDP內(nèi)核發(fā)送緩沖區(qū)中。
? 經(jīng)過IP封裝后的數(shù)據(jù)稱為IP數(shù)據(jù)報(bào)(IP datagram)。IP數(shù)據(jù)報(bào)也包括頭部信息和數(shù)據(jù)部分,其中數(shù)據(jù)部分就是一個(gè)TCP報(bào)文段、UDP數(shù)據(jù)報(bào)或者ICMP報(bào)文。
? 經(jīng)過數(shù)據(jù)鏈路層封裝的數(shù)據(jù)稱為幀(Frame) 傳輸媒介不同,幀的類型也不同。比如,以太網(wǎng)上傳輸?shù)氖且蕴W(wǎng)幀(ethernet frame),而令牌環(huán)網(wǎng)絡(luò)上傳輸?shù)膭t是令牌環(huán)幀(token ring frame)以以太網(wǎng)為例,其封裝格式如圖1-6
?
1.3 分用
? 當(dāng)幀到達(dá)目的主機(jī)時(shí),將沿著協(xié)議棧自底向上依次傳遞。各層協(xié)議依次處理幀中本層負(fù)責(zé)的頭部數(shù)據(jù),以獲取所需的信息,并最終將處理后的幀交給目標(biāo)應(yīng)用程序。這個(gè)過程稱為分用(demultiplexing),依靠頭部信息的類型字段實(shí)現(xiàn)。
1.4 測試網(wǎng)絡(luò)
? ISP(運(yùn)營商)分配的IP地址一般是動(dòng)態(tài)的。
1.5 ARP協(xié)議工作原理
1.5.1 以太網(wǎng)ARP請求/應(yīng)答報(bào)文詳解
? ARP協(xié)議能實(shí)現(xiàn)任意網(wǎng)絡(luò)層地址到任意物理地址的轉(zhuǎn)換,不過本書僅討論從IP地址到以太網(wǎng)地址(MAC地址)的轉(zhuǎn)換。其工作原理是:主機(jī)向自己所在的網(wǎng)絡(luò)廣播一個(gè)ARP請求,該請求包含目標(biāo)機(jī)器的網(wǎng)絡(luò)地址。此網(wǎng)絡(luò)上的其他機(jī)器都將收到這個(gè)請求,但只有被請求的目標(biāo)機(jī)器會(huì)回應(yīng)一個(gè)ARP應(yīng)答,其中包含自己的物理地址。
?
1.5.2 ARP高速緩存的查看和修改
? **通常,ARP維護(hù)一個(gè)高速緩存,其中包含經(jīng)常訪問(比如網(wǎng)關(guān)地址)或最近訪問的機(jī)器的IP地址到物理地址的映射。**這樣就避免了重復(fù)的ARP請求,提高了發(fā)送數(shù)據(jù)包的速度。
? Linux下可以使用arp命令來查看和修改ARP高速緩存。比如,ernest-laptop在某一時(shí)刻(注意,ARP高速緩存是動(dòng)態(tài)變化的)的ARP緩存內(nèi)容如下(使用arp-a命令)
?
1.5.3 使用tcpdump觀察ARP通信過程
? 關(guān)于該圖,需要說明三點(diǎn):
? 第一,我們將兩次傳輸?shù)囊蕴W(wǎng)幀按照圖1-6所描述的以太網(wǎng)幀封裝格式繪制在圖的下半部分。
? 第二,ARP請求和應(yīng)答是從以太網(wǎng)驅(qū)動(dòng)程序發(fā)出的,而并非像圖中描述的那樣從ARP模塊直接發(fā)送到以太網(wǎng)上,所以我們將它們用虛線表示,這主要是為了體現(xiàn)攜帶ARP數(shù)據(jù)的以太網(wǎng)幀和其他以太網(wǎng)幀(比如攜帶IP數(shù)據(jù)報(bào)的以太網(wǎng)幀)的區(qū)別。
? 第三,路由器也將接收到以太網(wǎng)幀1,因?yàn)樵搸且粋€(gè)廣播幀。不過很顯然,路由器并沒有回應(yīng)其中的ARP請求,正如前文討論的那樣,被請求的目標(biāo)機(jī)器會(huì)回應(yīng)一個(gè)ARP應(yīng)答。
1.6 DNS工作原理
? 通常使用域名訪問機(jī)器,而不直接使用IP地址。如何將機(jī)器的域名轉(zhuǎn)換成IP?這就需要使用域名查詢服務(wù),有很多實(shí)現(xiàn)方式,比如NIS(Network Information Service,網(wǎng)絡(luò)信息服務(wù))、DNS和本地靜態(tài)文件等。
1.6.1 DNS查詢和應(yīng)答報(bào)文詳解
1.6.2 Linux下訪問DNS服務(wù)
1.6.3 使用tcpdump觀察dns通信過程
1.7 Socket和TCP/IP協(xié)議族的關(guān)系
? 前面提到,數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層協(xié)議是在內(nèi)核中實(shí)現(xiàn)的。因此操作系統(tǒng)需要實(shí)現(xiàn)一組系統(tǒng)調(diào)用,使得應(yīng)用程序能夠訪問這些協(xié)議提供的服務(wù)。實(shí)現(xiàn)這組系統(tǒng)調(diào)用的API(Application Programming Interface,應(yīng)用程序編程接口)主要由兩套:socket和XTI。XTI現(xiàn)在基本不再使用。
? 由socket定義的這一組API提供如下兩點(diǎn)功能文章來源:http://www.zghlxwxcb.cn/news/detail-809144.html
- 一是將應(yīng)用程序從用戶緩沖區(qū)中復(fù)制到TCP/UDP內(nèi)核發(fā)送緩沖器,以交付內(nèi)核來發(fā)送數(shù)據(jù)(send或者write),或者是從內(nèi)核TCP/UDP接收緩沖區(qū)中復(fù)制數(shù)據(jù)到用戶緩沖區(qū),以讀取數(shù)據(jù)
- 二是應(yīng)用程序可以通過它們來修改內(nèi)核中各層協(xié)議的某些頭部信息或其他數(shù)據(jù)結(jié)構(gòu),從而精細(xì)地控制底層通信的行為。比如可以通過setsockopt函數(shù)來設(shè)置IP數(shù)據(jù)報(bào)在網(wǎng)絡(luò)上的存活時(shí)間。
? 值得一提的是,socke是一套通用網(wǎng)絡(luò)編程接口,它不但可以訪問內(nèi)核中TCP/IP協(xié)議棧,而且可以訪問其他網(wǎng)絡(luò)協(xié)議棧(X.25、UNIX本地域協(xié)議棧等)文章來源地址http://www.zghlxwxcb.cn/news/detail-809144.html
到了這里,關(guān)于Linux高性能服務(wù)器編程——學(xué)習(xí)筆記①的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!