国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

UNIX/Linux網(wǎng)絡(luò)編程基礎(chǔ):圖解TCP/IP協(xié)議棧

2024-06-28 13:27:35
字體:
供稿:網(wǎng)友
UNIX/linux網(wǎng)絡(luò)編程基礎(chǔ):圖解TCP/ip協(xié)議棧

目錄

1、主機(jī)到網(wǎng)絡(luò)層協(xié)議:以太網(wǎng)協(xié)議

2、IP協(xié)議

3、網(wǎng)際控制報(bào)文協(xié)議(ICMP)

4、傳輸控制協(xié)議(TCP)

5、用戶數(shù)據(jù)報(bào)文協(xié)議(UDP)

6、流控制傳輸協(xié)議(SCTP)

7、地址解析協(xié)議(ARP)

 

聯(lián)網(wǎng)的各個(gè)終端之間能否進(jìn)行交互的軟件基礎(chǔ)是網(wǎng)絡(luò)協(xié)議棧,目前主流的網(wǎng)絡(luò)協(xié)議棧是TCP/IP協(xié)議棧

image

image

image

image

1、主機(jī)到網(wǎng)絡(luò)層協(xié)議:以太網(wǎng)協(xié)議

主機(jī)到網(wǎng)絡(luò)層主要為IP協(xié)議和ARP協(xié)議提供服務(wù)、發(fā)送和接收網(wǎng)絡(luò)數(shù)據(jù)報(bào)。本層中由于要實(shí)現(xiàn)跨網(wǎng)和跨設(shè)備的互通,有很多的實(shí)現(xiàn)方式,這里我們只關(guān)注以太網(wǎng)的實(shí)現(xiàn)方式。

以太網(wǎng)是由數(shù)字設(shè)備公司(Digital Equipment Corp,DEC)、英特爾公司和Xerox公司在1982年公布的一個(gè)標(biāo)準(zhǔn)。目前TCP/IP技術(shù)主要基于以太網(wǎng)標(biāo)準(zhǔn)。以太網(wǎng)標(biāo)準(zhǔn)采用一種帶沖突檢測的載波監(jiān)聽多路接入(CSMA/CD,Carrier Sense,Multiple access with Collision Detection)的方法進(jìn)行傳輸。以太網(wǎng)的封包格式如下圖所示,它在IP數(shù)據(jù)的基礎(chǔ)上增加了共14個(gè)字節(jié)。

image

源地址和目的地址:以太網(wǎng)用48bits(6字節(jié))來表示源地址和目的地址。這里的源地址和目的地址指的是硬件地址,例如網(wǎng)卡的MAC地址。

在地址后面是兩個(gè)字節(jié)的表示類型的字段,例如0800表示此幀數(shù)據(jù)為IP數(shù)據(jù),0806表示此幀數(shù)據(jù)為ARP請求。

類型字段之后是數(shù)據(jù),對于以太網(wǎng),規(guī)定數(shù)據(jù)段的大小范圍是46-1500個(gè)字節(jié),如果數(shù)據(jù)不足46個(gè)字節(jié),則要用空字符填滿。

注意:數(shù)據(jù)段的長度有一個(gè)最大值,以太網(wǎng)為1500,這個(gè)特性稱為MTU,即最大傳輸單元。如果IP層有一個(gè)要求傳送的數(shù)據(jù)長度比MTU大,那么在IP層要對數(shù)據(jù)進(jìn)行分片,使得每個(gè)片都小于MTU。

CRC字段用于對幀內(nèi)數(shù)據(jù)進(jìn)行校驗(yàn),以保證數(shù)據(jù)的正確性,通常由硬件實(shí)現(xiàn)(例如在網(wǎng)卡設(shè)備中實(shí)現(xiàn))。

注意:以太網(wǎng)的頭部長度為14的特點(diǎn)在某些平臺的實(shí)現(xiàn)上會造成效率上的問題,例如4字節(jié)對齊的平臺,在取得IP數(shù)據(jù)時(shí)通常會重新復(fù)制一次。

2、IP協(xié)議

IP協(xié)議是TCP/IP協(xié)議中最重要的協(xié)議,它為TCP、UDP、ICMP等協(xié)議提供傳輸?shù)耐贰?font color="#9b00d3">IP層的主要目的是提供子網(wǎng)的互聯(lián),形成較大的網(wǎng)絡(luò),使不同的子網(wǎng)間能夠傳輸數(shù)據(jù)。IP層主要有如下作用:

image

IP數(shù)據(jù)的格式如下圖所示,不包含選項(xiàng)字段,其頭部長度為20字節(jié)。

image

源IP地址和目的IP地址:源地址表示發(fā)送數(shù)據(jù)的主機(jī)或設(shè)備的IP地址,目的地址表示接收數(shù)據(jù)的主機(jī)IP地址。這兩個(gè)字段均為32位。本字段的目的在于識別Internet上的主機(jī)。

3、網(wǎng)際控制報(bào)文協(xié)議(ICMP)

ICMP協(xié)議用于傳遞差錯(cuò)信息、時(shí)間、回顯、網(wǎng)絡(luò)信息等報(bào)文控制數(shù)據(jù)。

ICMP協(xié)議的數(shù)據(jù)位于IP字段的數(shù)據(jù)部分,它是在IP報(bào)文的內(nèi)部被傳送的。

image

ICMP報(bào)文的數(shù)據(jù)格式如下圖所示:

image

ICMP的報(bào)文類型由類型和代碼兩個(gè)字段共同決定。

4、傳輸控制協(xié)議(TCP)

傳輸控制協(xié)議(Transmission Control PRotocol),簡稱TCP協(xié)議,它在原有IP協(xié)議的基礎(chǔ)上,增加了確認(rèn)重發(fā)、滑動窗口和復(fù)用/解復(fù)用等機(jī)制,提供一種可靠的、面向連接的、字節(jié)流服務(wù)

首先,TCP提供客戶和服務(wù)器的連接。

其次,TCP提供可靠性。(數(shù)據(jù)的可靠投遞或故障的可靠通知)并不能保證數(shù)據(jù)一定會被對方端點(diǎn)接收。

第三,TCP通過給所發(fā)送數(shù)據(jù)的每一個(gè)字節(jié)關(guān)聯(lián)一個(gè)序列號進(jìn)行排序(sequencing)。

第四,TCP提供流量控制(flow control)。TCP總是告訴對端它能夠接收多少字節(jié)的數(shù)據(jù),這稱為通告窗口(advertised window)。該窗口在任何時(shí)刻都指出接收緩沖區(qū)中的可用空間,從而確保發(fā)送端發(fā)送的數(shù)據(jù)不會溢出接收緩沖區(qū)。該窗口時(shí)時(shí)刻刻動態(tài)地變化著:當(dāng)接收來自發(fā)送端的數(shù)據(jù)時(shí),窗口大小減小;而當(dāng)接收端應(yīng)用進(jìn)程從緩沖區(qū)中讀取數(shù)據(jù)時(shí),窗口大小增大。

最后,TCP的連接是全雙工的(full duplex)。

TCP的特點(diǎn):

image

TCP的數(shù)據(jù)格式:

image

image

源端口號和目的端口號:這兩個(gè)字段均為16位的長度,表示發(fā)送端和接收端的端口,用于確認(rèn)發(fā)送端和接收端的應(yīng)用程序發(fā)送端的IP地址和端口號以及接收端的IP地址和端口號可以確認(rèn)一個(gè)在Internet上的TCP連接。

image

TCP的封裝解封過程:

image

建立TCP連接的三次握手:

(1)服務(wù)器必須準(zhǔn)備好接受外來的連接。這通過調(diào)用socket、bind和listen函數(shù)來完成,稱為被動打開(passive open)。

(2)客戶通過調(diào)用connect進(jìn)行主動打開(active open)。這引起客戶TCP發(fā)送一個(gè)SYN(表示 同步)分節(jié)(segment),它告訴服務(wù)器客戶將在(待建立的)連接中發(fā)送數(shù)據(jù)的初始序列號。一般情況下SYN分節(jié)不攜帶數(shù)據(jù),它只含一個(gè)IP頭部、一個(gè)TCP頭部及可能有的TCP選項(xiàng)。

(3)服務(wù)器必須確認(rèn)客戶的SYN,同時(shí)自己也得發(fā)送一個(gè)SYN分節(jié),它含有服務(wù)器將在同一連接中發(fā)送的數(shù)據(jù)的初始序列號。服務(wù)器以單個(gè)分節(jié)向客戶發(fā)送SYN和對客戶SYN的ACK(表示確認(rèn))。

(4)客戶必須確認(rèn)服務(wù)器的SYN。

連接建立的過程至少需要交換三個(gè)分組,因此稱之為TCP的三路握手(three-way handshake)。如下圖所示:

image

上圖中給出的客戶的初始序列號為J,而服務(wù)器的初始序列號為K。在ACK里的確認(rèn)號為發(fā)送這個(gè)ACK的一端所期待的對端的下一個(gè)序列號。

建立TCP連接的日常系統(tǒng)可類比電話系統(tǒng),客戶(呼叫者)、服務(wù)器(被呼叫者):

soket函數(shù)等同于有電話可用。呼叫者和被呼叫者都要有一個(gè)電話。

bind函數(shù)用于告訴其他人你的電話號碼,讓他們可以向你打電話。

listen函數(shù)用于打開電話振鈴,它使得你可以聽到一個(gè)外來的電話。

accept函數(shù)等同于被呼叫者接電話,而且accept函數(shù)有來電顯示功能,可以顯示呼叫者的電話號碼。

釋放TCP連接的四次握手:

image

TCP狀態(tài)轉(zhuǎn)換圖:

TCP連接的建立和終止可以用狀態(tài)轉(zhuǎn)換圖(state transition diagram)來說明。

TCP為一個(gè)連接定義了11種狀態(tài)(nestat命令的輸出包括這些狀態(tài),它是調(diào)試客戶/服務(wù)器應(yīng)用程序有用的工具),并且TCP規(guī)則規(guī)定如何基于當(dāng)前狀態(tài)及在該狀態(tài)下接收的分節(jié)從一個(gè)狀態(tài)轉(zhuǎn)換到另一個(gè)狀態(tài)。

我們用實(shí)線表示客戶的狀態(tài)轉(zhuǎn)換,虛線表示服務(wù)器的狀態(tài)轉(zhuǎn)換。

image

注意,執(zhí)行主動關(guān)閉的那一端(客戶端)進(jìn)入TIME_WAIT狀態(tài)。該端點(diǎn)停留在這種狀態(tài)的持續(xù)時(shí)間是最長分節(jié)生命期(maximum segment lifetime,簡稱MSL)的兩倍,有時(shí)候稱之為2MSL。

5、用戶數(shù)據(jù)報(bào)文協(xié)議(UDP)

UDP是一種基于IP協(xié)議的無連接、不可靠網(wǎng)絡(luò)傳輸協(xié)議。

image

UDP協(xié)議把應(yīng)用程序需要傳遞的數(shù)據(jù)發(fā)送出去,不提供發(fā)送數(shù)據(jù)包的順序;接收方不向發(fā)送方發(fā)送接收的確認(rèn)信息,如果 出現(xiàn)丟包或者重包的現(xiàn)象,也不會向發(fā)送方發(fā)送反饋,因此不能保證使用UDP協(xié)議的程序發(fā)送的數(shù)據(jù)一定到達(dá)了接收方或者到達(dá)接收方的數(shù)據(jù)順序和發(fā)送方的一致性。

使用UDP協(xié)議傳輸數(shù)據(jù)的應(yīng)用程序,必須自己構(gòu)建發(fā)送數(shù)據(jù)的順序機(jī)制和發(fā)送接收的確認(rèn)機(jī)制,以此來保證發(fā)送數(shù)據(jù)的正確到達(dá),保證接收數(shù)據(jù)的順序與發(fā)送數(shù)據(jù)的一致性,也就是說應(yīng)用程序必須根據(jù)UDP的缺點(diǎn)提供解決方案。

UDP協(xié)議相對于TCP協(xié)議執(zhí)行時(shí)的速度要比TCP快得多,因?yàn)閁DP協(xié)議簡單的多,對系統(tǒng)造成的負(fù)載低。

UDP的數(shù)據(jù)格式:

image

源端口號和目的端口號分別是一個(gè)16位的字段,用來表示發(fā)送方和接收方的UDP端口。

UDP數(shù)據(jù)的傳輸過程:

image

每個(gè)UDP數(shù)據(jù)報(bào)都有一個(gè)長度。如果數(shù)據(jù)報(bào)正確地到達(dá)其最終目的地,那么數(shù)據(jù)報(bào)的長度將隨數(shù)據(jù)一道傳送給接收端應(yīng)用程序。而TCP是一個(gè)字節(jié)流(byte stream)協(xié)議,沒有任何記錄邊界。

6、流控制傳輸協(xié)議(SCTP)

SCTP提供的服務(wù)與UDP和TCP提供的類似。SCTP在客戶和服務(wù)器之間提供關(guān)聯(lián),并像TCP那樣給應(yīng)用層提供可靠性、排序、流量控制以及全雙工的數(shù)據(jù)傳輸服務(wù)

SCTP中使用“關(guān)聯(lián)”取代“連接”是為了避免這樣的內(nèi)涵:一個(gè)連接只涉及兩個(gè)IP地址之間的通信。而一個(gè)關(guān)聯(lián)指代可能因?yàn)槎嗨蓿╩ultihoming)而涉及不止一個(gè)地址的兩個(gè)系統(tǒng)之間的一次通信會話。

與TCP不同的是,SCTP是面向消息的(message-oriented)。它提供各個(gè)記錄的按序投遞服務(wù)。與UDP一樣,由發(fā)送端寫入SCTP的每個(gè)記錄的長度隨數(shù)據(jù)一道傳遞給接收端應(yīng)用程序。

SCTP能夠在所連接的端點(diǎn)之間提供多個(gè)流,每個(gè)流各自可靠地按序投遞消息。一個(gè)流上某個(gè)消息的丟失不會阻塞同一關(guān)聯(lián)其他流上消息的投遞。這種做法與TCP正好相反,就TCP而言,在單一字節(jié)流中任何位置的字節(jié)丟失都將阻塞該連接上其后所有數(shù)據(jù)的投遞,知道該丟失被修復(fù)為止。

SCTP還提供多宿特性,使得單個(gè)SCTP端點(diǎn)能夠支持多個(gè)IP地址。該特性可以增強(qiáng)針對網(wǎng)絡(luò)故障的健壯性。一個(gè)端點(diǎn)可以有多個(gè)冗余的網(wǎng)絡(luò)連接,每個(gè)連接所在的網(wǎng)絡(luò)有各自接入因特網(wǎng)基礎(chǔ)設(shè)施的通途。通過把端點(diǎn)切換到已與SCTP關(guān)聯(lián)相關(guān)的另一個(gè)地址,SCTP能夠繞過發(fā)生在跨越因特網(wǎng)途中某個(gè)網(wǎng)絡(luò)或通路上的故障。

與TCP一樣,SCTP也是面向連接的,因此也有關(guān)聯(lián)的建立與終止的握手過程。不過SCTP的握手過程不同于TCP。

SCTP的四路握手:

(1)服務(wù)器必須準(zhǔn)備好接受外來的關(guān)聯(lián)。這通過調(diào)用socket、bind和listen函數(shù)來完成,稱為被動打開(passive open)。

(2)客戶通過調(diào)用connect或者發(fā)送一個(gè)隱式打開關(guān)聯(lián)的消息進(jìn)行主動打開(active open)。這使得客戶端發(fā)送一個(gè)INIT消息(表示初始化),它告訴服務(wù)器客戶的IP地址清單、初始序列號、用于標(biāo)識本關(guān)聯(lián)中所有分組的起始標(biāo)志(initiation tag)、客戶請求的外出流的數(shù)目以及用戶能夠支持的外來流的數(shù)目。

(3)服務(wù)器對客戶的INIT消息確認(rèn)以一個(gè)INIT ACK消息,其中含有服務(wù)器的IP地址清單、初始序列號、起始標(biāo)志、服務(wù)器請求的外出流的數(shù)目、服務(wù)器能夠支持的外來流的數(shù)目以及一個(gè)狀態(tài)魔餅(state cookie)。狀態(tài)魔餅包含服務(wù)器用于確信本關(guān)聯(lián)有效所需的所有狀態(tài),它是數(shù)字化簽名過的,以確保其有效性。

(4)客戶以一個(gè)COOKIE ECHO消息回射服務(wù)器的狀態(tài)魔餅。除COOKIE ACK塊外,該消息可能還捆綁了用戶數(shù)據(jù)塊。

(5)服務(wù)器以一個(gè)COOKIE ACK消息確認(rèn)客戶回射的狀態(tài)魔餅是正確的,本關(guān)聯(lián)從而建立。該消息也可能還捆綁了用戶數(shù)據(jù)塊。

以上交換過程至少需要四個(gè)消息,因此稱之為SCTP的四路握手(four-way handshake)。如下圖:

image

四路握手過程結(jié)束時(shí),兩端各自選擇一個(gè)主宿地址(primary destination address)。當(dāng)不存在網(wǎng)絡(luò)故障時(shí),主宿地址將用作數(shù)據(jù)發(fā)送的缺省目的地。

SCTP關(guān)聯(lián)終止:

SCTP不像TCP那樣允許半關(guān)閉的關(guān)聯(lián)。當(dāng)一端關(guān)閉某個(gè)關(guān)聯(lián)時(shí),另一端必須停止從應(yīng)用進(jìn)程傳入新的用戶數(shù)據(jù)并發(fā)送。關(guān)聯(lián)關(guān)閉請求的接收端發(fā)送完已經(jīng)排隊(duì)的數(shù)據(jù)(如果有的話)后,執(zhí)行關(guān)聯(lián)的關(guān)閉。如下圖所示:

image

SCTP沒有類似TCP的TIME_WAIT狀態(tài),因?yàn)镾CTP使用了驗(yàn)證標(biāo)志。

7、地址解析協(xié)議(ARP)

在以以太網(wǎng)為基礎(chǔ)的局域網(wǎng)中,每個(gè)網(wǎng)絡(luò)接口都有一個(gè)硬件地址,這是一個(gè)48bit的值,用來標(biāo)識不同的以太網(wǎng)設(shè)備,在局域網(wǎng)中必須知道網(wǎng)絡(luò)設(shè)備的硬件地址才能向目的主機(jī)發(fā)送數(shù)據(jù)。而在網(wǎng)際網(wǎng)中數(shù)據(jù)傳輸?shù)哪康牡刂肥荌P地址,數(shù)據(jù)要能夠正確地傳輸,必須建立IP地址和硬件地址的對應(yīng)關(guān)系,ARP協(xié)議就是起這種作用的。

ARP協(xié)議為IP地址到硬件地址提供動態(tài)的映射關(guān)系。ARP高速緩存維持這種映射關(guān)系,其中存放了最近IP地址到硬件地址的映射記錄,高速緩存中的每項(xiàng)記錄的生存時(shí)間為20分鐘,開始時(shí)間從映射關(guān)系建立時(shí)算起。

image

可以用arp -a命令查看ARP高速緩存。

ARP分組數(shù)據(jù)格式:

image

ARP協(xié)議的實(shí)現(xiàn)方式是在以太網(wǎng)上做廣播,查詢目的IP地址,接收到ARP請求的主機(jī)響應(yīng)請求方,將本機(jī)的MAC地址反饋給請求的主機(jī)。

ARP請求應(yīng)答的操作方式很簡單,將接受到的數(shù)據(jù)字段的發(fā)送方和接收方的值對調(diào),將所有本機(jī)的硬件地址和IP地址的值填充到合適的發(fā)送方位置。

image


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 贺州市| 师宗县| 板桥市| 长子县| 北流市| 灵山县| 阿瓦提县| 庐江县| 孟州市| 巫溪县| 军事| 格尔木市| 修武县| 双辽市| 丽江市| 民权县| 建平县| 延边| 冷水江市| 浠水县| 渭南市| 揭阳市| 嘉义市| 濉溪县| 华安县| 句容市| 临沂市| 万载县| 西林县| 平和县| 西宁市| 贞丰县| 通河县| 兴业县| 南昌县| 唐海县| 泰宁县| 静安区| 万安县| 新郑市| 长岭县|